From 2cd9efee63bfa79a26604b4f496534f495732c8c Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 19 Apr 2024 12:57:58 +0300 Subject: [PATCH] QmlDesigner: Fix changing dynamic properties on root material object Changing dynamic properties on a CustomMaterial root object didn't trigger rendering. Also there were duplicate of the property generated when it was changed, which made quick3d side ignore the property change. Fixes: QDS-12469 Change-Id: Ia83eaa76fd4f43428a01baea9a3491a8917aa30d Reviewed-by: Thomas Hartmann Reviewed-by: Mahmoud Badri Reviewed-by: Qt CI Patch Build Bot --- .../instances/qt5rendernodeinstanceserver.cpp | 22 ++++++++++++++++++- .../instances/qt5rendernodeinstanceserver.h | 1 + .../qmlprivategate/qmlprivategate.cpp | 4 +++- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/tools/qml2puppet/qml2puppet/instances/qt5rendernodeinstanceserver.cpp b/src/tools/qml2puppet/qml2puppet/instances/qt5rendernodeinstanceserver.cpp index f9191950fd5..53af00ab094 100644 --- a/src/tools/qml2puppet/qml2puppet/instances/qt5rendernodeinstanceserver.cpp +++ b/src/tools/qml2puppet/qml2puppet/instances/qt5rendernodeinstanceserver.cpp @@ -146,7 +146,9 @@ void Qt5RenderNodeInstanceServer::collectItemChangesAndSendChangeCommands() && !changedPropertyList().isEmpty() && nodeInstanceClient()->bytesToWrite() < 10000) { - Internal::QuickItemNodeInstance::updateDirtyNode(rootNodeInstance().contentItem()); + QQuickItem *rootItem = rootNodeInstance().contentItem(); + QQuickDesignerSupport::addDirty(rootItem, QQuickDesignerSupport::Content); + QQuickDesignerSupport::updateDirtyNode(rootItem); nodeInstanceClient()->pixmapChanged(createPixmapChangedCommand({rootNodeInstance()})); } @@ -239,6 +241,24 @@ void Qt5RenderNodeInstanceServer::changePropertyValues(const ChangeValuesCommand if (instance.hasParent() && instance.propertyNames().contains("_isEffectItem")) makeDirtyRecursive(instance.parent()); + } else if (container.isDynamic() && hasInstanceForId(container.instanceId())) { + // Changes to dynamic properties are not always noticed by normal signal spy mechanism + addChangedProperty(InstancePropertyPair(instanceForId(container.instanceId()), + container.name())); + } + } +} + +void Qt5RenderNodeInstanceServer::changePropertyBindings(const ChangeBindingsCommand &command) +{ + Qt5NodeInstanceServer::changePropertyBindings(command); + + const QVector changes = command.bindingChanges; + for (const PropertyBindingContainer &container : changes) { + if (container.isDynamic() && hasInstanceForId(container.instanceId())) { + // Changes to dynamic properties are not always noticed by normal signal spy mechanism + addChangedProperty(InstancePropertyPair(instanceForId(container.instanceId()), + container.name())); } } } diff --git a/src/tools/qml2puppet/qml2puppet/instances/qt5rendernodeinstanceserver.h b/src/tools/qml2puppet/qml2puppet/instances/qt5rendernodeinstanceserver.h index 738aa47b185..1e0f885da16 100644 --- a/src/tools/qml2puppet/qml2puppet/instances/qt5rendernodeinstanceserver.h +++ b/src/tools/qml2puppet/qml2puppet/instances/qt5rendernodeinstanceserver.h @@ -18,6 +18,7 @@ public: void completeComponent(const CompleteComponentCommand &command) override; void removeSharedMemory(const RemoveSharedMemoryCommand &command) override; void changePropertyValues(const ChangeValuesCommand &command) override; + void changePropertyBindings(const ChangeBindingsCommand &command) override; protected: void collectItemChangesAndSendChangeCommands() override; diff --git a/src/tools/qml2puppet/qmlprivategate/qmlprivategate.cpp b/src/tools/qml2puppet/qmlprivategate/qmlprivategate.cpp index 928f4bf2956..096ac362441 100644 --- a/src/tools/qml2puppet/qmlprivategate/qmlprivategate.cpp +++ b/src/tools/qml2puppet/qmlprivategate/qmlprivategate.cpp @@ -540,7 +540,9 @@ void tweakObjects(QObject *object) void createNewDynamicProperty(QObject *object, QQmlEngine *engine, const QString &name) { - QQuickDesignerSupportProperties::createNewDynamicProperty(object, engine, name); + QQmlProperty qmlProp(object, name, engine->contextForObject(object)); + if (!qmlProp.isValid()) + QQuickDesignerSupportProperties::createNewDynamicProperty(object, engine, name); } void registerNodeInstanceMetaObject(QObject *object, QQmlEngine *engine)