forked from qt-creator/qt-creator
QmlDesigner: Always render items with effects
Items with effects may lose their cached layers if they are not rendered every frame, so make sure we always render items with effects if anything else is rendered. Fixes: QDS-11561 Change-Id: I7aa6542fc619e634fa06fe7c8d59fd485a150296 Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io> Reviewed-by: Qt CI Patch Build Bot <ci_patchbuild_bot@qt.io>
This commit is contained in:
@@ -419,7 +419,7 @@ QImage Qt5NodeInstanceServer::grabWindow()
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool hasEffect(QQuickItem *item)
|
bool Qt5NodeInstanceServer::hasEffect(QQuickItem *item)
|
||||||
{
|
{
|
||||||
QQuickItemPrivate *pItem = QQuickItemPrivate::get(item);
|
QQuickItemPrivate *pItem = QQuickItemPrivate::get(item);
|
||||||
return pItem && pItem->layer() && pItem->layer()->enabled() && pItem->layer()->effect();
|
return pItem && pItem->layer() && pItem->layer()->enabled() && pItem->layer()->effect();
|
||||||
|
@@ -49,6 +49,7 @@ public:
|
|||||||
bool renderWindow() override;
|
bool renderWindow() override;
|
||||||
|
|
||||||
static QQuickItem *parentEffectItem(QQuickItem *item);
|
static QQuickItem *parentEffectItem(QQuickItem *item);
|
||||||
|
static bool hasEffect(QQuickItem *item);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void initializeView() override;
|
void initializeView() override;
|
||||||
|
@@ -57,6 +57,7 @@ void Qt5RenderNodeInstanceServer::collectItemChangesAndSendChangeCommands()
|
|||||||
if (quickWindow() && nodeInstanceClient()->bytesToWrite() < 10000) {
|
if (quickWindow() && nodeInstanceClient()->bytesToWrite() < 10000) {
|
||||||
bool windowDirty = false;
|
bool windowDirty = false;
|
||||||
bool hasView3D = false;
|
bool hasView3D = false;
|
||||||
|
QList<ServerNodeInstance> effectItems;
|
||||||
for (QQuickItem *item : allItems()) {
|
for (QQuickItem *item : allItems()) {
|
||||||
if (item) {
|
if (item) {
|
||||||
if (Internal::QuickItemNodeInstance::unifiedRenderPath()) {
|
if (Internal::QuickItemNodeInstance::unifiedRenderPath()) {
|
||||||
@@ -73,6 +74,8 @@ void Qt5RenderNodeInstanceServer::collectItemChangesAndSendChangeCommands()
|
|||||||
}
|
}
|
||||||
m_dirtyInstanceSet.insert(instanceForObject(item));
|
m_dirtyInstanceSet.insert(instanceForObject(item));
|
||||||
}
|
}
|
||||||
|
if (hasEffect(item))
|
||||||
|
effectItems.append(instanceForObject(item));
|
||||||
if (QQuickItem *effectParent = parentEffectItem(item)) {
|
if (QQuickItem *effectParent = parentEffectItem(item)) {
|
||||||
if ((QQuickDesignerSupport::isDirty(
|
if ((QQuickDesignerSupport::isDirty(
|
||||||
item,
|
item,
|
||||||
@@ -107,6 +110,12 @@ void Qt5RenderNodeInstanceServer::collectItemChangesAndSendChangeCommands()
|
|||||||
} else {
|
} else {
|
||||||
if (!m_dirtyInstanceSet.isEmpty()) {
|
if (!m_dirtyInstanceSet.isEmpty()) {
|
||||||
auto renderList = QtHelpers::toList(m_dirtyInstanceSet);
|
auto renderList = QtHelpers::toList(m_dirtyInstanceSet);
|
||||||
|
for (auto &effectItem : std::as_const(effectItems)) {
|
||||||
|
// Ensure effect items are rendered last
|
||||||
|
if (m_dirtyInstanceSet.contains(effectItem))
|
||||||
|
renderList.removeOne(effectItem);
|
||||||
|
renderList.append(effectItem);
|
||||||
|
}
|
||||||
|
|
||||||
// If there is a View3D to be rendered, add all other View3Ds to be rendered
|
// If there is a View3D to be rendered, add all other View3Ds to be rendered
|
||||||
// as well, in case they share materials.
|
// as well, in case they share materials.
|
||||||
|
Reference in New Issue
Block a user