From c046dc42c1067f6de868a8d56017d007e85919e7 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Thu, 21 Dec 2023 13:37:02 +0200 Subject: [PATCH] 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 Reviewed-by: Qt CI Patch Build Bot --- .../qml2puppet/instances/qt5nodeinstanceserver.cpp | 2 +- .../qml2puppet/instances/qt5nodeinstanceserver.h | 1 + .../qml2puppet/instances/qt5rendernodeinstanceserver.cpp | 9 +++++++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.cpp b/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.cpp index db4199b64a1..ce2cfbf46c6 100644 --- a/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.cpp +++ b/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.cpp @@ -419,7 +419,7 @@ QImage Qt5NodeInstanceServer::grabWindow() return {}; } -static bool hasEffect(QQuickItem *item) +bool Qt5NodeInstanceServer::hasEffect(QQuickItem *item) { QQuickItemPrivate *pItem = QQuickItemPrivate::get(item); return pItem && pItem->layer() && pItem->layer()->enabled() && pItem->layer()->effect(); diff --git a/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.h b/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.h index d684046fc5b..b1c7ca6df0b 100644 --- a/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.h +++ b/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.h @@ -49,6 +49,7 @@ public: bool renderWindow() override; static QQuickItem *parentEffectItem(QQuickItem *item); + static bool hasEffect(QQuickItem *item); protected: void initializeView() override; diff --git a/src/tools/qml2puppet/qml2puppet/instances/qt5rendernodeinstanceserver.cpp b/src/tools/qml2puppet/qml2puppet/instances/qt5rendernodeinstanceserver.cpp index 0f0536ff0d3..3a7882871c5 100644 --- a/src/tools/qml2puppet/qml2puppet/instances/qt5rendernodeinstanceserver.cpp +++ b/src/tools/qml2puppet/qml2puppet/instances/qt5rendernodeinstanceserver.cpp @@ -57,6 +57,7 @@ void Qt5RenderNodeInstanceServer::collectItemChangesAndSendChangeCommands() if (quickWindow() && nodeInstanceClient()->bytesToWrite() < 10000) { bool windowDirty = false; bool hasView3D = false; + QList effectItems; for (QQuickItem *item : allItems()) { if (item) { if (Internal::QuickItemNodeInstance::unifiedRenderPath()) { @@ -73,6 +74,8 @@ void Qt5RenderNodeInstanceServer::collectItemChangesAndSendChangeCommands() } m_dirtyInstanceSet.insert(instanceForObject(item)); } + if (hasEffect(item)) + effectItems.append(instanceForObject(item)); if (QQuickItem *effectParent = parentEffectItem(item)) { if ((QQuickDesignerSupport::isDirty( item, @@ -107,6 +110,12 @@ void Qt5RenderNodeInstanceServer::collectItemChangesAndSendChangeCommands() } else { if (!m_dirtyInstanceSet.isEmpty()) { 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 // as well, in case they share materials.