From 946943203566167a2f8d3e785d6250ed8a8a87cd Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 23 Oct 2019 16:29:31 +0200 Subject: [PATCH] QmlDesigner: Add Qt5InformationNodeInstanceServer::modifyProperties() This method allows to modify properties in the data model from the puppet. For performance reasons, properties should be modified in bulks. Each bulk will be one step on the undo stack. Change-Id: I7dbef02781706c8638981512ca0ec45d24c54545 Reviewed-by: Miikka Heikkinen Reviewed-by: Thomas Hartmann --- .../instances/nodeinstanceserver.cpp | 25 +++++++++++++++++++ .../qml2puppet/instances/nodeinstanceserver.h | 7 ++++++ .../qt5informationnodeinstanceserver.cpp | 9 +++++++ .../qt5informationnodeinstanceserver.h | 1 + 4 files changed, 42 insertions(+) diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp index bd293488f19..9103ef5de01 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp @@ -1190,6 +1190,31 @@ ValuesChangedCommand NodeInstanceServer::createValuesChangedCommand(const QVecto return ValuesChangedCommand(valueVector); } +ValuesModifiedCommand NodeInstanceServer::createValuesModifiedCommand( + const QVector &propertyList) const +{ + QVector valueVector; + + for (const InstancePropertyValueTriple &property : propertyList) { + const PropertyName propertyName = property.propertyName; + const ServerNodeInstance instance = property.instance; + const QVariant propertyValue = property.propertyValue; + + if (instance.isValid()) { + if (QMetaType::isRegistered(propertyValue.userType()) + && supportedVariantType(propertyValue.type())) { + valueVector.append(PropertyValueContainer(instance.instanceId(), + propertyName, + propertyValue, + PropertyName())); + } + } + } + + return ValuesModifiedCommand(valueVector); +} + + QByteArray NodeInstanceServer::importCode() const { return m_importCode; diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h index 65c2bdfac14..7af63c0b5be 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h @@ -60,6 +60,7 @@ namespace QmlDesigner { class NodeInstanceClientInterface; class ValuesChangedCommand; +class ValuesModifiedCommand; class PixmapChangedCommand; class InformationChangedCommand; class ChildrenChangedCommand; @@ -82,6 +83,11 @@ public: using IdPropertyPair = QPair; using InstancePropertyPair= QPair; using DummyPair = QPair >; + using InstancePropertyValueTriple = struct { + ServerNodeInstance instance; + PropertyName propertyName; + QVariant propertyValue; + }; explicit NodeInstanceServer(NodeInstanceClientInterface *nodeInstanceClient); @@ -168,6 +174,7 @@ protected: ValuesChangedCommand createValuesChangedCommand(const QList &instanceList) const; ValuesChangedCommand createValuesChangedCommand(const QVector &propertyList) const; + ValuesModifiedCommand createValuesModifiedCommand(const QVector &propertyList) const; PixmapChangedCommand createPixmapChangedCommand(const QList &instanceList) const; InformationChangedCommand createAllInformationChangedCommand(const QList &instanceList, bool initial = false) const; ChildrenChangedCommand createChildrenChangedCommand(const ServerNodeInstance &parentInstance, const QList &instanceList) const; diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index 9413c74c0cb..b8aabfffc76 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -165,6 +165,15 @@ void Qt5InformationNodeInstanceServer::selectInstance(const ServerNodeInstance & nodeInstanceClient()->selectionChanged(createChangeSelectionCommand({instance})); } +/* This method allows changing property values from the puppet + * For performance reasons (and the undo stack) properties should always be modifed in 'bulks'. + */ +void Qt5InformationNodeInstanceServer::modifyProperties( + const QVector &properties) +{ + nodeInstanceClient()->valuesModified(createValuesModifiedCommand(properties)); +} + QObject *Qt5InformationNodeInstanceServer::findRootNodeOf3DViewport( const QList &instanceList) const { diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h index 962336ccdc4..6f05659426e 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h @@ -51,6 +51,7 @@ protected: bool isDirtyRecursiveForNonInstanceItems(QQuickItem *item) const; bool isDirtyRecursiveForParentInstances(QQuickItem *item) const; void selectInstance(const ServerNodeInstance &instance); + void modifyProperties(const QVector &properties); private: void setup3DEditView(const QList &instanceList);