From ccc8c7c99785d17445a88f1db54e66f7edb52ffd Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Tue, 9 Aug 2022 13:45:50 +0200 Subject: [PATCH] QmlDesigner: rotBlock is using it own aux type rotBlock was using the mechanism to overwrite values but actually it is only for communication to the puppet. So now there is NodeInstanceAuxiliary as a generic way. NodeInstance was renamed NodeInstancePropertyOverwrite to make it clear that it is for overwriting properties. Task-number: QDS-7338 Change-Id: Id5ab1f5c4761a184964a347f00d1449ae2d7d77f Reviewed-by: Reviewed-by: Tim Jenssen --- .../qmlpuppet/interfaces/nodeinstanceglobal.h | 8 +++- .../instances/nodeinstanceserver.cpp | 2 +- .../qt5informationnodeinstanceserver.cpp | 3 +- .../components/debugview/debugview.cpp | 7 +++- .../formeditor/formeditorwidget.cpp | 2 +- .../imagecache/imagecachecollector.cpp | 2 +- .../include/auxiliarydataproperties.h | 11 ++++-- .../instances/nodeinstanceview.cpp | 38 +++++++++---------- .../designercore/model/qml3dnode.cpp | 15 ++++---- .../designercore/model/qmltimeline.cpp | 2 +- src/plugins/qmldesigner/documentmanager.cpp | 6 +-- 11 files changed, 56 insertions(+), 40 deletions(-) diff --git a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceglobal.h b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceglobal.h index b1e08943784..5aca843cd73 100644 --- a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceglobal.h +++ b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceglobal.h @@ -37,5 +37,11 @@ using PropertyNameList = QList; using PropertyNames = std::vector; using TypeName = QByteArray; -enum class AuxiliaryDataType { None, Temporary, Document, NodeInstance }; +enum class AuxiliaryDataType { + None, + Temporary, + Document, + NodeInstancePropertyOverwrite, + NodeInstanceAuxiliary +}; } diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp index 780ea1289b3..21abeb5975e 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp @@ -1009,7 +1009,7 @@ void NodeInstanceServer::setInstancePropertyVariant(const PropertyValueContainer void NodeInstanceServer::setInstanceAuxiliaryData(const PropertyValueContainer &auxiliaryContainer) { - if (auxiliaryContainer.auxiliaryDataType() == AuxiliaryDataType::NodeInstance) { + if (auxiliaryContainer.auxiliaryDataType() == AuxiliaryDataType::NodeInstancePropertyOverwrite) { if (!auxiliaryContainer.value().isNull()) setInstancePropertyVariant(auxiliaryContainer); else diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index e89ed6e6375..1161cb94391 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -349,7 +349,8 @@ void Qt5InformationNodeInstanceServer::updateRotationBlocks( QSet unblockedNodes; const PropertyName rotBlocked = "rotBlocked"; for (const auto &container : valueChanges) { - if (container.name() == rotBlocked) { + if (container.name() == rotBlocked + && container.auxiliaryDataType() == AuxiliaryDataType::NodeInstanceAuxiliary) { ServerNodeInstance instance = instanceForId(container.instanceId()); if (instance.isValid()) { auto node = qobject_cast(instance.internalObject()); diff --git a/src/plugins/qmldesigner/components/debugview/debugview.cpp b/src/plugins/qmldesigner/components/debugview/debugview.cpp index 66ed8facad0..86899d4373c 100644 --- a/src/plugins/qmldesigner/components/debugview/debugview.cpp +++ b/src/plugins/qmldesigner/components/debugview/debugview.cpp @@ -250,8 +250,11 @@ QTextStream &operator<<(QTextStream &stream, AuxiliaryDataType type) case AuxiliaryDataType::None: stream << "None"; break; - case AuxiliaryDataType::NodeInstance: - stream << "NodeInstance"; + case AuxiliaryDataType::NodeInstancePropertyOverwrite: + stream << "NodeInstancePropertyOverwrite"; + break; + case AuxiliaryDataType::NodeInstanceAuxiliary: + stream << "NodeInstanceAuxiliary"; break; case AuxiliaryDataType::Document: stream << "Permanent"; diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp index 891b67fc8eb..89be229721f 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp @@ -63,7 +63,7 @@ namespace QmlDesigner { namespace { -constexpr AuxiliaryDataKeyView formeditorZoomProperty{AuxiliaryDataType::NodeInstance, +constexpr AuxiliaryDataKeyView formeditorZoomProperty{AuxiliaryDataType::NodeInstancePropertyOverwrite, "formeditorZoom"}; } diff --git a/src/plugins/qmldesigner/designercore/imagecache/imagecachecollector.cpp b/src/plugins/qmldesigner/designercore/imagecache/imagecachecollector.cpp index b1ecdca4172..d7f25058951 100644 --- a/src/plugins/qmldesigner/designercore/imagecache/imagecachecollector.cpp +++ b/src/plugins/qmldesigner/designercore/imagecache/imagecachecollector.cpp @@ -109,7 +109,7 @@ void ImageCacheCollector::start(Utils::SmallStringView name, if (is3DRoot) { if (auto libIcon = Utils::get_if(&auxiliaryData)) - rewriterView.rootModelNode().setAuxiliaryData(AuxiliaryDataType::NodeInstance, + rewriterView.rootModelNode().setAuxiliaryData(AuxiliaryDataType::NodeInstancePropertyOverwrite, "isLibraryIcon", libIcon->enable); } diff --git a/src/plugins/qmldesigner/designercore/include/auxiliarydataproperties.h b/src/plugins/qmldesigner/designercore/include/auxiliarydataproperties.h index 54a470da2e7..d2d0442913e 100644 --- a/src/plugins/qmldesigner/designercore/include/auxiliarydataproperties.h +++ b/src/plugins/qmldesigner/designercore/include/auxiliarydataproperties.h @@ -60,8 +60,10 @@ public: inline constexpr AuxiliaryDataKeyDefaultValue customIdProperty{AuxiliaryDataType::Document, "customId", QStringView{}}; -inline constexpr AuxiliaryDataKeyDefaultValue widthProperty{AuxiliaryDataType::NodeInstance, "width", 4}; -inline constexpr AuxiliaryDataKeyView heightProperty{AuxiliaryDataType::NodeInstance, "height"}; +inline constexpr AuxiliaryDataKeyDefaultValue widthProperty{ + AuxiliaryDataType::NodeInstancePropertyOverwrite, "width", 4}; +inline constexpr AuxiliaryDataKeyView heightProperty{AuxiliaryDataType::NodeInstancePropertyOverwrite, + "height"}; inline constexpr AuxiliaryDataKeyDefaultValue breakPointProperty{AuxiliaryDataType::Document, "breakPoint", 50}; @@ -132,13 +134,16 @@ inline constexpr AuxiliaryDataKeyView transitionDurationProperty{AuxiliaryDataTy "transitionDuration"}; inline constexpr AuxiliaryDataKeyView targetProperty{AuxiliaryDataType::Document, "target"}; inline constexpr AuxiliaryDataKeyView propertyProperty{AuxiliaryDataType::Document, "property"}; -inline constexpr AuxiliaryDataKeyView currentFrameProperty{AuxiliaryDataType::NodeInstance, +inline constexpr AuxiliaryDataKeyView currentFrameProperty{AuxiliaryDataType::NodeInstancePropertyOverwrite, "currentFrame"}; inline constexpr AuxiliaryDataKeyView annotationProperty{AuxiliaryDataType::Document, "annotation"}; inline constexpr AuxiliaryDataKeyView globalAnnotationProperty{AuxiliaryDataType::Document, "globalAnnotation"}; inline constexpr AuxiliaryDataKeyView globalAnnotationStatus{AuxiliaryDataType::Document, "globalAnnotationStatus"}; +inline constexpr AuxiliaryDataKeyView rotBlockProperty{AuxiliaryDataType::NodeInstanceAuxiliary, + "rotBlock"}; + template QVariant getDefaultValueAsQVariant(const Type &key) { diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index 3e351486a15..871ed8e24e5 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -76,6 +76,7 @@ #include "nanotracecommand.h" #include "nanotrace/nanotrace.h" +#include #include #include #include @@ -676,7 +677,19 @@ void NodeInstanceView::auxiliaryDataChanged(const ModelNode &node, }; break; - case AuxiliaryDataType::NodeInstance: + case AuxiliaryDataType::NodeInstanceAuxiliary: + if (hasInstanceForModelNode(node)) { + NodeInstance instance = instanceForModelNode(node); + PropertyValueContainer container{instance.instanceId(), + PropertyName{key.name}, + value, + TypeName(), + key.type}; + m_nodeInstanceServer->changeAuxiliaryValues({{container}}); + }; + break; + + case AuxiliaryDataType::NodeInstancePropertyOverwrite: if (hasInstanceForModelNode(node)) { NodeInstance instance = instanceForModelNode(node); if (value.isValid()) { @@ -707,18 +720,6 @@ void NodeInstanceView::auxiliaryDataChanged(const ModelNode &node, break; case AuxiliaryDataType::Temporary: - if (key.name == "rotBlocked" && hasInstanceForModelNode(node)) { - NodeInstance instance = instanceForModelNode(node); - if (value.isValid()) { - PropertyValueContainer container{instance.instanceId(), - PropertyName{key.name}, - value, - TypeName(), - key.type}; - m_nodeInstanceServer->changeAuxiliaryValues({{container}}); - } - }; - if (node.isRootNode()) { if (key.name == "language") { const QString languageAsString = value.toString(); @@ -1037,9 +1038,9 @@ QList filterNodesForSkipItems(const QList &nodeList) namespace { bool shouldSendAuxiliary(const AuxiliaryDataKey &key) { - return key == invisibleProperty || key == lockedProperty - || key.type == AuxiliaryDataType::NodeInstance - || (key.type == AuxiliaryDataType::Temporary && key.name == "rotBlocked"); + return key.type == AuxiliaryDataType::NodeInstancePropertyOverwrite + || key.type == AuxiliaryDataType::NodeInstanceAuxiliary || key == invisibleProperty + || key == lockedProperty; } } // namespace @@ -2237,12 +2238,11 @@ void NodeInstanceView::updateRotationBlocks() } } if (!qml3DNodes.isEmpty()) { - const PropertyName auxDataProp{"rotBlocked"}; for (const auto &node : qAsConst(qml3DNodes)) { if (rotationKeyframeTargets.contains(node)) - node.setAuxiliaryData(AuxiliaryDataType::Temporary, auxDataProp, true); + node.setAuxiliaryData(rotBlockProperty, true); else - node.setAuxiliaryData(AuxiliaryDataType::Temporary, auxDataProp, false); + node.setAuxiliaryData(rotBlockProperty, false); } } } diff --git a/src/plugins/qmldesigner/designercore/model/qml3dnode.cpp b/src/plugins/qmldesigner/designercore/model/qml3dnode.cpp index d917db46e5f..f2a29dbcc3d 100644 --- a/src/plugins/qmldesigner/designercore/model/qml3dnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qml3dnode.cpp @@ -24,15 +24,16 @@ ****************************************************************************/ #include "qml3dnode.h" -#include -#include "qmlchangeset.h" -#include "nodelistproperty.h" -#include "nodehints.h" -#include "variantproperty.h" +#include "auxiliarydataproperties.h" #include "bindingproperty.h" -#include "qmlanchors.h" #include "invalidmodelnodeexception.h" #include "itemlibraryinfo.h" +#include "nodehints.h" +#include "nodelistproperty.h" +#include "qmlanchors.h" +#include "qmlchangeset.h" +#include "variantproperty.h" +#include #include "plaintexteditmodifier.h" #include "rewriterview.h" @@ -92,7 +93,7 @@ void Qml3DNode::setBindingProperty(const PropertyName &name, const QString &expr bool Qml3DNode::isBlocked(const PropertyName &propName) const { if (modelNode().isValid() && propName.startsWith("eulerRotation")) - return modelNode().auxiliaryDataWithDefault(AuxiliaryDataType::Temporary, "rotBlocked").toBool(); + return modelNode().auxiliaryDataWithDefault(rotBlockProperty).toBool(); return false; } diff --git a/src/plugins/qmldesigner/designercore/model/qmltimeline.cpp b/src/plugins/qmldesigner/designercore/model/qmltimeline.cpp index 23d25ee520b..1ada6863af3 100644 --- a/src/plugins/qmldesigner/designercore/model/qmltimeline.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmltimeline.cpp @@ -302,7 +302,7 @@ void QmlTimeline::insertKeyframe(const ModelNode &target, const PropertyName &pr QTC_ASSERT(timelineFrames.isValid(), return ); - const qreal frame = modelNode().auxiliaryData(currentFrameProperty)->toReal(); + const qreal frame = modelNode().auxiliaryDataWithDefault(currentFrameProperty).toReal(); const QVariant value = QmlObjectNode(targetNode).instanceValue(propertyName); timelineFrames.setValue(value, frame); diff --git a/src/plugins/qmldesigner/documentmanager.cpp b/src/plugins/qmldesigner/documentmanager.cpp index 4c468efb258..08f227f432c 100644 --- a/src/plugins/qmldesigner/documentmanager.cpp +++ b/src/plugins/qmldesigner/documentmanager.cpp @@ -93,17 +93,17 @@ static inline QHash getProperties(const ModelNode &node) static inline void applyProperties(ModelNode &node, const QHash &propertyHash) { - const auto auxiliaryData = node.auxiliaryData(AuxiliaryDataType::NodeInstance); + const auto auxiliaryData = node.auxiliaryData(AuxiliaryDataType::NodeInstancePropertyOverwrite); for (const auto &element : auxiliaryData) - node.removeAuxiliaryData(AuxiliaryDataType::NodeInstance, element.first); + node.removeAuxiliaryData(AuxiliaryDataType::NodeInstancePropertyOverwrite, element.first); for (auto propertyIterator = propertyHash.cbegin(), end = propertyHash.cend(); propertyIterator != end; ++propertyIterator) { const PropertyName propertyName = propertyIterator.key(); if (propertyName == "width" || propertyName == "height") { - node.setAuxiliaryData(AuxiliaryDataType::NodeInstance, + node.setAuxiliaryData(AuxiliaryDataType::NodeInstancePropertyOverwrite, propertyIterator.key(), propertyIterator.value()); }