diff --git a/share/qtcreator/qml/qmlpuppet/commands/valueschangedcommand.cpp b/share/qtcreator/qml/qmlpuppet/commands/valueschangedcommand.cpp index 73c8138a436..c5468bc999b 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/valueschangedcommand.cpp +++ b/share/qtcreator/qml/qmlpuppet/commands/valueschangedcommand.cpp @@ -50,7 +50,7 @@ ValuesChangedCommand::ValuesChangedCommand(const QVector { } -QVector ValuesChangedCommand::valueChanges() const +const QVector ValuesChangedCommand::valueChanges() const { return m_valueChangeVector; } diff --git a/share/qtcreator/qml/qmlpuppet/commands/valueschangedcommand.h b/share/qtcreator/qml/qmlpuppet/commands/valueschangedcommand.h index 96050aee7fe..bf7fe1e43d4 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/valueschangedcommand.h +++ b/share/qtcreator/qml/qmlpuppet/commands/valueschangedcommand.h @@ -42,7 +42,7 @@ public: ValuesChangedCommand(); explicit ValuesChangedCommand(const QVector &valueChangeVector); - QVector valueChanges() const; + const QVector valueChanges() const; quint32 keyNumber() const; static void removeSharedMemorys(const QVector &keyNumberVector); @@ -59,6 +59,26 @@ QDataStream &operator>>(QDataStream &in, ValuesChangedCommand &command); bool operator ==(const ValuesChangedCommand &first, const ValuesChangedCommand &second); QDebug operator <<(QDebug debug, const ValuesChangedCommand &instance); + +/* ValuesChangedCommand is used to notify that the values of a specific instatiated + * QObject changed. + * The ValuesModifiedCommand is used to notify that a user changed a QML property and + * that this property should be changed in the data model. + */ + +class ValuesModifiedCommand : public ValuesChangedCommand +{ +public: + ValuesModifiedCommand() + {} + explicit ValuesModifiedCommand(const QVector &valueChangeVector) + : ValuesChangedCommand(valueChangeVector) + {} + +}; + } // namespace QmlDesigner + +Q_DECLARE_METATYPE(QmlDesigner::ValuesModifiedCommand) Q_DECLARE_METATYPE(QmlDesigner::ValuesChangedCommand) diff --git a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.cpp b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.cpp index a4b9324699e..3e57baffd0d 100644 --- a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.cpp +++ b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.cpp @@ -130,6 +130,7 @@ bool compareCommands(const QVariant &command, const QVariant &controlCommand) { static const int informationChangedCommandType = QMetaType::type("InformationChangedCommand"); static const int valuesChangedCommandType = QMetaType::type("ValuesChangedCommand"); + static const int valuesModifiedCommandType = QMetaType::type("ValuesModifiedCommand"); static const int pixmapChangedCommandType = QMetaType::type("PixmapChangedCommand"); static const int childrenChangedCommandType = QMetaType::type("ChildrenChangedCommand"); static const int statePreviewImageChangedCommandType = QMetaType::type("StatePreviewImageChangedCommand"); @@ -144,7 +145,9 @@ bool compareCommands(const QVariant &command, const QVariant &controlCommand) return command.value() == controlCommand.value(); else if (command.userType() == valuesChangedCommandType) return command.value() == controlCommand.value(); - else if (command.userType() == pixmapChangedCommandType) + else if (command.userType() == valuesModifiedCommandType) + return command.value() == controlCommand.value(); + else if (command.userType() == pixmapChangedCommandType) return command.value() == controlCommand.value(); else if (command.userType() == childrenChangedCommandType) return command.value() == controlCommand.value(); @@ -202,6 +205,11 @@ void NodeInstanceClientProxy::valuesChanged(const ValuesChangedCommand &command) writeCommand(QVariant::fromValue(command)); } +void NodeInstanceClientProxy::valuesModified(const ValuesModifiedCommand &command) +{ + writeCommand(QVariant::fromValue(command)); +} + void NodeInstanceClientProxy::pixmapChanged(const PixmapChangedCommand &command) { writeCommand(QVariant::fromValue(command)); diff --git a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.h b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.h index 8590a48a957..edf290f38a0 100644 --- a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.h +++ b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.h @@ -67,6 +67,7 @@ public: void informationChanged(const InformationChangedCommand &command) override; void valuesChanged(const ValuesChangedCommand &command) override; + void valuesModified(const ValuesModifiedCommand &command) override; void pixmapChanged(const PixmapChangedCommand &command) override; void childrenChanged(const ChildrenChangedCommand &command) override; void statePreviewImagesChanged(const StatePreviewImageChangedCommand &command) override; diff --git a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceclientinterface.h b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceclientinterface.h index 1f49f277f51..0b5a5ca334b 100644 --- a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceclientinterface.h +++ b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceclientinterface.h @@ -30,6 +30,7 @@ namespace QmlDesigner { class ValuesChangedCommand; +class ValuesModifiedCommand; class PixmapChangedCommand; class InformationChangedCommand; class ChildrenChangedCommand; @@ -46,6 +47,7 @@ class NodeInstanceClientInterface public: virtual void informationChanged(const InformationChangedCommand &command) = 0; virtual void valuesChanged(const ValuesChangedCommand &command) = 0; + virtual void valuesModified(const ValuesModifiedCommand &command) = 0; virtual void pixmapChanged(const PixmapChangedCommand &command) = 0; virtual void childrenChanged(const ChildrenChangedCommand &command) = 0; virtual void statePreviewImagesChanged(const StatePreviewImageChangedCommand &command) = 0; diff --git a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.cpp b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.cpp index 90907b50929..d2b7cb26207 100644 --- a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.cpp +++ b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.cpp @@ -125,6 +125,9 @@ void NodeInstanceServerInterface::registerCommands() qRegisterMetaType("ValuesChangedCommand"); qRegisterMetaTypeStreamOperators("ValuesChangedCommand"); + qRegisterMetaType("ValuesModifiedCommand"); + qRegisterMetaTypeStreamOperators("ValuesModifiedCommand"); + qRegisterMetaType("PixmapChangedCommand"); qRegisterMetaTypeStreamOperators("PixmapChangedCommand"); diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h index 258fc9aa2d0..1e1032900bf 100644 --- a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h +++ b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h @@ -120,6 +120,7 @@ public: void updatePosition(const QList& propertyList); void valuesChanged(const ValuesChangedCommand &command) override; + void valuesModified(const ValuesModifiedCommand &command) override; void pixmapChanged(const PixmapChangedCommand &command) override; void informationChanged(const InformationChangedCommand &command) override; void childrenChanged(const ChildrenChangedCommand &command) override; diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp index c5b98bf3258..3d57b3a16a7 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp @@ -271,6 +271,7 @@ void NodeInstanceServerProxy::dispatchCommand(const QVariant &command, PuppetStr { static const int informationChangedCommandType = QMetaType::type("InformationChangedCommand"); static const int valuesChangedCommandType = QMetaType::type("ValuesChangedCommand"); + static const int valuesModifiedCommandType = QMetaType::type("ValuesModifiedCommand"); static const int pixmapChangedCommandType = QMetaType::type("PixmapChangedCommand"); static const int childrenChangedCommandType = QMetaType::type("ChildrenChangedCommand"); static const int statePreviewImageChangedCommandType = QMetaType::type("StatePreviewImageChangedCommand"); @@ -285,11 +286,13 @@ void NodeInstanceServerProxy::dispatchCommand(const QVariant &command, PuppetStr return; qCInfo(instanceViewBenchmark) << "dispatching command" << command.userType() << command.typeName(); - if (command.userType() == informationChangedCommandType) { + if (command.userType() == informationChangedCommandType) { nodeInstanceClient()->informationChanged(command.value()); - } else if (command.userType() == valuesChangedCommandType) { + } else if (command.userType() == valuesChangedCommandType) { nodeInstanceClient()->valuesChanged(command.value()); - } else if (command.userType() == pixmapChangedCommandType) { + } else if (command.userType() == valuesModifiedCommandType) { + nodeInstanceClient()->valuesModified(command.value()); + } else if (command.userType() == pixmapChangedCommandType) { nodeInstanceClient()->pixmapChanged(command.value()); } else if (command.userType() == childrenChangedCommandType) { nodeInstanceClient()->childrenChanged(command.value()); diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index 5d44e5069c4..7200231267a 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -1190,6 +1190,20 @@ void NodeInstanceView::valuesChanged(const ValuesChangedCommand &command) emitInstancePropertyChange(valuePropertyChangeList); } +void NodeInstanceView::valuesModified(const ValuesModifiedCommand &command) +{ + if (!model()) + return; + + for (const PropertyValueContainer &container : command.valueChanges()) { + if (hasInstanceForId(container.instanceId())) { + NodeInstance instance = instanceForId(container.instanceId()); + if (instance.isValid()) + instance.modelNode().variantProperty(container.name()).setValue(container.value()); + } + } +} + void NodeInstanceView::pixmapChanged(const PixmapChangedCommand &command) { if (!model())