From ff4e33dc0a2224e35c969ef34879e6ef98d22aae Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 27 Mar 2024 15:45:57 +0100 Subject: [PATCH] QmlDesigner: Enable rendering of DesignerEffects * Effects are items and we have to use __effect/source and allEffects to idenfify them and get the correct bounding rectangle. * For now we use a custom parser to work around issues when editig the model Change-Id: I78690498c44f8285d3bb6ce78eafcafb9c26b2f1 Reviewed-by: Tim Jenssen --- .../designercore/metainfo/nodemetainfo.cpp | 12 ++++++------ .../qml2puppet/instances/qt5nodeinstanceserver.cpp | 12 ++++++++++-- .../qml2puppet/instances/servernodeinstance.cpp | 14 ++++++++++++-- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp index 85f904666c8..742a093400d 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp @@ -2444,12 +2444,12 @@ bool NodeMetaInfo::usesCustomParser() const if (!isValid()) return false; - auto type = typeName(); - return type == "QtQuick.VisualItemModel" || type == "Qt.VisualItemModel" - || type == "QtQuick.VisualDataModel" || type == "Qt.VisualDataModel" - || type == "QtQuick.ListModel" || type == "Qt.ListModel" - || type == "QtQml.Models.ListModel" || type == "QtQuick.XmlListModel" - || type == "Qt.XmlListModel" || type == "QtQml.XmlListModel.XmlListModel"; + auto type = simplifiedTypeName(); + return type == "VisualItemModel" + || type == "VisualDataModel" + || type == "ListModel" + || type == "XmlListModel" + || type == "DesignEffect"; } } diff --git a/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.cpp b/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.cpp index fca884e94b3..765b52321bf 100644 --- a/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.cpp +++ b/src/tools/qml2puppet/qml2puppet/instances/qt5nodeinstanceserver.cpp @@ -436,10 +436,18 @@ QQuickItem *Qt5NodeInstanceServer::parentEffectItem(QQuickItem *item) return nullptr; } -static bool isEffectItem(QQuickItem *item, QQuickShaderEffectSource *sourceItem) +static bool isEffectItem(QQuickItem *item, QQuickShaderEffectSource *sourceItem, QQuickItem *target) { QQuickItemPrivate *pItem = QQuickItemPrivate::get(sourceItem); + if (item) { + QQmlProperty prop(item, "__effect"); + if (prop.read().toBool()) { + prop = QQmlProperty(item, "source"); + return prop.read().value() == target; + } + } + if (!pItem || !pItem->layer()) return false; @@ -477,7 +485,7 @@ QImage Qt5NodeInstanceServer::grabItem([[maybe_unused]] QQuickItem *item) if (auto parent = item->parentItem()) { const auto siblings = parent->childItems(); for (auto sibling : siblings) { - if (isEffectItem(sibling, pItem->layer()->effectSource())) + if (isEffectItem(sibling, pItem->layer()->effectSource(), item)) return grabItem(sibling); } } diff --git a/src/tools/qml2puppet/qml2puppet/instances/servernodeinstance.cpp b/src/tools/qml2puppet/qml2puppet/instances/servernodeinstance.cpp index ca05a5ef039..9600a0b2b0d 100644 --- a/src/tools/qml2puppet/qml2puppet/instances/servernodeinstance.cpp +++ b/src/tools/qml2puppet/qml2puppet/instances/servernodeinstance.cpp @@ -120,10 +120,20 @@ QRectF ServerNodeInstance::effectAdjustedBoundingRect(QQuickItem *item) { if (item) { QQuickItemPrivate *pItem = QQuickItemPrivate::get(item); - if (pItem && pItem->layer() && pItem->layer()->sourceRect().isValid()) + + QQmlProperty prop(item, "__effect"); + + if (pItem && pItem->layer() && pItem->layer()->sourceRect().isValid()) { return pItem->layer()->sourceRect(); - else + } else if (prop.read().toBool()) { + prop = QQmlProperty(item, "allEffects"); + QRectF rect = prop.read().toRectF().adjusted(-20, -20, 20, 20); + if (rect.isValid()) + return rect; return item->boundingRect(); + } else { + return item->boundingRect(); + } } return {}; }