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:
Miikka Heikkinen
2023-12-21 13:37:02 +02:00
parent 8738057967
commit c046dc42c1
3 changed files with 11 additions and 1 deletions

View File

@@ -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();

View File

@@ -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;

View File

@@ -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.