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 {};
|
||||
}
|
||||
|
||||
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();
|
||||
|
@@ -49,6 +49,7 @@ public:
|
||||
bool renderWindow() override;
|
||||
|
||||
static QQuickItem *parentEffectItem(QQuickItem *item);
|
||||
static bool hasEffect(QQuickItem *item);
|
||||
|
||||
protected:
|
||||
void initializeView() override;
|
||||
|
@@ -57,6 +57,7 @@ void Qt5RenderNodeInstanceServer::collectItemChangesAndSendChangeCommands()
|
||||
if (quickWindow() && nodeInstanceClient()->bytesToWrite() < 10000) {
|
||||
bool windowDirty = false;
|
||||
bool hasView3D = false;
|
||||
QList<ServerNodeInstance> 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.
|
||||
|
Reference in New Issue
Block a user