diff --git a/share/qtcreator/qml/qmlpuppet/container/propertyvaluecontainer.cpp b/share/qtcreator/qml/qmlpuppet/container/propertyvaluecontainer.cpp index c460bbc712b..8500617caac 100644 --- a/share/qtcreator/qml/qmlpuppet/container/propertyvaluecontainer.cpp +++ b/share/qtcreator/qml/qmlpuppet/container/propertyvaluecontainer.cpp @@ -34,11 +34,16 @@ PropertyValueContainer::PropertyValueContainer() { } -PropertyValueContainer::PropertyValueContainer(qint32 instanceId, const PropertyName &name, const QVariant &value, const TypeName &dynamicTypeName) - : m_instanceId(instanceId), - m_name(name), - m_value(value), - m_dynamicTypeName(dynamicTypeName) +PropertyValueContainer::PropertyValueContainer(qint32 instanceId, + const PropertyName &name, + const QVariant &value, + const TypeName &dynamicTypeName, + AuxiliaryDataType auxiliaryDataType) + : m_instanceId(instanceId) + , m_name(name) + , m_value(value) + , m_dynamicTypeName(dynamicTypeName) + , m_auxiliaryDataType{auxiliaryDataType} { } @@ -90,13 +95,19 @@ bool PropertyValueContainer::isReflected() const return m_isReflected; } +AuxiliaryDataType PropertyValueContainer::auxiliaryDataType() const +{ + return m_auxiliaryDataType; +} + QDataStream &operator<<(QDataStream &out, const PropertyValueContainer &container) { - out << container.instanceId(); - out << container.name(); - out << container.value(); - out << container.dynamicTypeName(); - out << container.isReflected(); + out << container.m_instanceId; + out << container.m_name; + out << container.m_value; + out << container.m_dynamicTypeName; + out << container.m_isReflected; + out << container.m_auxiliaryDataType; return out; } @@ -108,17 +119,17 @@ QDataStream &operator>>(QDataStream &in, PropertyValueContainer &container) in >> container.m_value; in >> container.m_dynamicTypeName; in >> container.m_isReflected; + in >> container.m_auxiliaryDataType; return in; } bool operator ==(const PropertyValueContainer &first, const PropertyValueContainer &second) { - return first.m_instanceId == second.m_instanceId - && first.m_name == second.m_name - && first.m_value == second.m_value - && first.m_dynamicTypeName == second.m_dynamicTypeName - && first.m_isReflected == second.m_isReflected; + return first.m_instanceId == second.m_instanceId && first.m_name == second.m_name + && first.m_value == second.m_value && first.m_dynamicTypeName == second.m_dynamicTypeName + && first.m_isReflected == second.m_isReflected + && first.m_auxiliaryDataType == second.m_auxiliaryDataType; } bool operator <(const PropertyValueContainer &first, const PropertyValueContainer &second) diff --git a/share/qtcreator/qml/qmlpuppet/container/propertyvaluecontainer.h b/share/qtcreator/qml/qmlpuppet/container/propertyvaluecontainer.h index 8770355cfde..876e6620f38 100644 --- a/share/qtcreator/qml/qmlpuppet/container/propertyvaluecontainer.h +++ b/share/qtcreator/qml/qmlpuppet/container/propertyvaluecontainer.h @@ -36,13 +36,13 @@ namespace QmlDesigner { class PropertyValueContainer { - friend QDataStream &operator>>(QDataStream &in, PropertyValueContainer &container); - friend bool operator ==(const PropertyValueContainer &first, const PropertyValueContainer &second); - friend bool operator <(const PropertyValueContainer &first, const PropertyValueContainer &second); - public: PropertyValueContainer(); - PropertyValueContainer(qint32 instanceId, const PropertyName &name, const QVariant &value, const TypeName &dynamicTypeName); + PropertyValueContainer(qint32 instanceId, + const PropertyName &name, + const QVariant &value, + const TypeName &dynamicTypeName, + AuxiliaryDataType auxiliaryDataType = AuxiliaryDataType::None); PropertyValueContainer(qint32 option); qint32 instanceId() const; @@ -52,20 +52,23 @@ public: TypeName dynamicTypeName() const; void setReflectionFlag(bool b); bool isReflected() const; + AuxiliaryDataType auxiliaryDataType() const; + + friend QDataStream &operator<<(QDataStream &out, const PropertyValueContainer &container); + friend QDataStream &operator>>(QDataStream &in, PropertyValueContainer &container); + friend bool operator==(const PropertyValueContainer &first, + const PropertyValueContainer &second); + friend bool operator<(const PropertyValueContainer &first, const PropertyValueContainer &second); private: qint32 m_instanceId; PropertyName m_name; QVariant m_value; TypeName m_dynamicTypeName; + AuxiliaryDataType m_auxiliaryDataType = AuxiliaryDataType::None; bool m_isReflected = false; }; -QDataStream &operator<<(QDataStream &out, const PropertyValueContainer &container); -QDataStream &operator>>(QDataStream &in, PropertyValueContainer &container); - -bool operator ==(const PropertyValueContainer &first, const PropertyValueContainer &second); -bool operator <(const PropertyValueContainer &first, const PropertyValueContainer &second); QDebug operator <<(QDebug debug, const PropertyValueContainer &container); } // namespace QmlDesigner diff --git a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceglobal.h b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceglobal.h index 6466ace7f9c..b1e08943784 100644 --- a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceglobal.h +++ b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceglobal.h @@ -37,4 +37,5 @@ using PropertyNameList = QList; using PropertyNames = std::vector; using TypeName = QByteArray; +enum class AuxiliaryDataType { None, Temporary, Document, NodeInstance }; } diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp index 53e42b0a714..780ea1289b3 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp @@ -1009,38 +1009,28 @@ void NodeInstanceServer::setInstancePropertyVariant(const PropertyValueContainer void NodeInstanceServer::setInstanceAuxiliaryData(const PropertyValueContainer &auxiliaryContainer) { - if (auxiliaryContainer.instanceId() == 0 && (auxiliaryContainer.name() == "width" || - auxiliaryContainer.name() == "height")) { + if (auxiliaryContainer.auxiliaryDataType() == AuxiliaryDataType::NodeInstance) { if (!auxiliaryContainer.value().isNull()) setInstancePropertyVariant(auxiliaryContainer); else rootNodeInstance().resetProperty(auxiliaryContainer.name()); - } - if (auxiliaryContainer.name().endsWith("@NodeInstance")) { - PropertyName propertyName = auxiliaryContainer.name().left(auxiliaryContainer.name().count() - 13); - if (!auxiliaryContainer.value().isNull()) { - setInstancePropertyVariant(PropertyValueContainer(auxiliaryContainer.instanceId(), - propertyName, - auxiliaryContainer.value(), - auxiliaryContainer.dynamicTypeName())); - } else { - rootNodeInstance().resetProperty(propertyName); - } - } else if (auxiliaryContainer.name() == "invisible") { - if (hasInstanceForId(auxiliaryContainer.instanceId())) { - ServerNodeInstance instance = instanceForId(auxiliaryContainer.instanceId()); - if (!auxiliaryContainer.value().isNull()) - instance.setHiddenInEditor(auxiliaryContainer.value().toBool()); - else - instance.setHiddenInEditor(false); - } - } else if (auxiliaryContainer.name() == "locked") { - if (hasInstanceForId(auxiliaryContainer.instanceId())) { - ServerNodeInstance instance = instanceForId(auxiliaryContainer.instanceId()); - if (!auxiliaryContainer.value().isNull()) - instance.setLockedInEditor(auxiliaryContainer.value().toBool()); - else - instance.setLockedInEditor(false); + } else if (auxiliaryContainer.auxiliaryDataType() == AuxiliaryDataType::Document) { + if (auxiliaryContainer.name() == "invisible") { + if (hasInstanceForId(auxiliaryContainer.instanceId())) { + ServerNodeInstance instance = instanceForId(auxiliaryContainer.instanceId()); + if (!auxiliaryContainer.value().isNull()) + instance.setHiddenInEditor(auxiliaryContainer.value().toBool()); + else + instance.setHiddenInEditor(false); + } + } else if (auxiliaryContainer.name() == "locked") { + if (hasInstanceForId(auxiliaryContainer.instanceId())) { + ServerNodeInstance instance = instanceForId(auxiliaryContainer.instanceId()); + if (!auxiliaryContainer.value().isNull()) + instance.setLockedInEditor(auxiliaryContainer.value().toBool()); + else + instance.setLockedInEditor(false); + } } } } diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index 8af22d48771..e89ed6e6375 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -347,9 +347,9 @@ void Qt5InformationNodeInstanceServer::updateRotationBlocks( if (helper) { QSet blockedNodes; QSet unblockedNodes; - const PropertyName propName = "rotBlocked@Internal"; + const PropertyName rotBlocked = "rotBlocked"; for (const auto &container : valueChanges) { - if (container.name() == propName) { + if (container.name() == rotBlocked) { ServerNodeInstance instance = instanceForId(container.instanceId()); if (instance.isValid()) { auto node = qobject_cast(instance.internalObject()); diff --git a/src/libs/utils/smallstringview.h b/src/libs/utils/smallstringview.h index b56f0e6735e..03dac62ef94 100644 --- a/src/libs/utils/smallstringview.h +++ b/src/libs/utils/smallstringview.h @@ -92,6 +92,11 @@ public: return QString::fromUtf8(data(), int(size())); } + explicit operator QByteArray() const + { + return QByteArray(data(), int(size())); + } + constexpr bool startsWith(SmallStringView subStringToSearch) const noexcept { if (size() >= subStringToSearch.size()) diff --git a/src/plugins/qmldesigner/assetexporterplugin/assetexporter.cpp b/src/plugins/qmldesigner/assetexporterplugin/assetexporter.cpp index d56c593a83c..68d5a5cf0c0 100644 --- a/src/plugins/qmldesigner/assetexporterplugin/assetexporter.cpp +++ b/src/plugins/qmldesigner/assetexporterplugin/assetexporter.cpp @@ -40,6 +40,8 @@ #include "projectexplorer/session.h" #include "projectexplorer/project.h" +#include + #include #include #include @@ -181,7 +183,7 @@ const QPixmap &AssetExporter::generateAsset(const ModelNode &node) if (m_cancelled) return nullPixmap; - const QString uuid = node.auxiliaryData(Constants::UuidAuxTag).toString(); + const QString uuid = node.auxiliaryDataWithDefault(uuidProperty).toString(); QTC_ASSERT(!uuid.isEmpty(), return nullPixmap); if (!m_assets.contains(uuid)) { @@ -196,7 +198,7 @@ const QPixmap &AssetExporter::generateAsset(const ModelNode &node) Utils::FilePath AssetExporter::assetPath(const ModelNode &node, const Component *component, const QString &suffix) const { - const QString uuid = node.auxiliaryData(Constants::UuidAuxTag).toString(); + const QString uuid = node.auxiliaryDataWithDefault(uuidProperty).toString(); if (!component || uuid.isEmpty()) return {}; @@ -324,7 +326,7 @@ void AssetExporter::preprocessQmlFile(const Utils::FilePath &path) } // Cache component UUID - const QString uuid = rootNode.auxiliaryData(Constants::UuidAuxTag).toString(); + const QString uuid = rootNode.auxiliaryDataWithDefault(uuidProperty).toString(); m_componentUuidCache[path.toString()] = uuid; } @@ -334,11 +336,11 @@ bool AssetExporter::assignUuids(const ModelNode &root) // Return true if an assignment takes place. bool changed = false; for (const ModelNode &node : root.allSubModelNodesAndThisNode()) { - const QString uuid = node.auxiliaryData(Constants::UuidAuxTag).toString(); + const QString uuid = node.auxiliaryDataWithDefault(uuidProperty).toString(); if (uuid.isEmpty()) { // Assign an unique identifier to the node. QByteArray uuid = generateUuid(node); - node.setAuxiliaryData(Constants::UuidAuxTag, QString::fromLatin1(uuid)); + node.setAuxiliaryData(uuidProperty, QString::fromLatin1(uuid)); changed = true; } } diff --git a/src/plugins/qmldesigner/assetexporterplugin/assetexportpluginconstants.h b/src/plugins/qmldesigner/assetexporterplugin/assetexportpluginconstants.h index 9a3e0e2b197..f53fa589683 100644 --- a/src/plugins/qmldesigner/assetexporterplugin/assetexportpluginconstants.h +++ b/src/plugins/qmldesigner/assetexporterplugin/assetexportpluginconstants.h @@ -24,13 +24,14 @@ ****************************************************************************/ #pragma once +#include + namespace QmlDesigner { namespace Constants { const char EXPORT_QML[] = "Designer.ExportPlugin.ExportQml"; const char TASK_CATEGORY_ASSET_EXPORT[] = "AssetExporter.Export"; -const char UuidAuxTag[] = "uuid"; //*************************************************************************** // Metadata tags diff --git a/src/plugins/qmldesigner/assetexporterplugin/dumpers/nodedumper.cpp b/src/plugins/qmldesigner/assetexporterplugin/dumpers/nodedumper.cpp index 58f2af2a4cc..ae18081c786 100644 --- a/src/plugins/qmldesigner/assetexporterplugin/dumpers/nodedumper.cpp +++ b/src/plugins/qmldesigner/assetexporterplugin/dumpers/nodedumper.cpp @@ -25,6 +25,8 @@ #include "nodedumper.h" #include "assetexportpluginconstants.h" +#include + namespace QmlDesigner { NodeDumper::NodeDumper(const QByteArrayList &lineage, const ModelNode &node) : m_node(node), @@ -41,7 +43,7 @@ QVariant NodeDumper::propertyValue(const PropertyName &name) const QString NodeDumper::uuid() const { - return m_node.auxiliaryData(Constants::UuidAuxTag).toString(); + return m_node.auxiliaryDataWithDefault(uuidProperty).toString(); } } diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp index 8dce6828509..00dc1f50f72 100644 --- a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp +++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp @@ -629,13 +629,14 @@ public: } } }; - +namespace { const char xProperty[] = "x"; const char yProperty[] = "y"; const char zProperty[] = "z"; const char widthProperty[] = "width"; const char heightProperty[] = "height"; const char triggerSlot[] = "trigger"; +} // namespace using namespace SelectionContextFunctors; diff --git a/src/plugins/qmldesigner/components/componentcore/layoutingridlayout.cpp b/src/plugins/qmldesigner/components/componentcore/layoutingridlayout.cpp index b44c4daf670..9d4e58bdddd 100644 --- a/src/plugins/qmldesigner/components/componentcore/layoutingridlayout.cpp +++ b/src/plugins/qmldesigner/components/componentcore/layoutingridlayout.cpp @@ -426,7 +426,9 @@ void LayoutInGridLayout::fillEmptyCells() } m_layoutedNodes.append(m_spacerNodes); } - +namespace { +constexpr AuxiliaryDataKeyView extraSpanningProperty{AuxiliaryDataType::Document, "extraSpanning"}; +} void LayoutInGridLayout::setSpanning(const ModelNode &layoutNode) { //Define a post layout operation to set columns/rows and the spanning @@ -450,8 +452,8 @@ void LayoutInGridLayout::setSpanning(const ModelNode &layoutNode) rowSpan = 1; } - if (modelNode.hasAuxiliaryData("extraSpanning")) - columnSpan += modelNode.auxiliaryData("extraSpanning").toInt(); + if (auto data = modelNode.auxiliaryData(extraSpanningProperty)) + columnSpan += data->toInt(); if (columnSpan > 1) qmlItemNode.setVariantProperty("Layout.columnSpan", columnSpan); @@ -472,11 +474,11 @@ void LayoutInGridLayout::removeSpacersBySpanning(QList &nodes) m_layoutedNodes.removeAll(node); nodes.removeAll(node); ModelNode(node).destroy(); - if (before.hasAuxiliaryData("extraSpanning")) { - before.setAuxiliaryData("extraSpanning", before.auxiliaryData("extraSpanning").toInt() + 1); - } else { - before.setAuxiliaryData("extraSpanning", 1); - } + auto extraSpanningData = before.auxiliaryData(extraSpanningProperty); + if (extraSpanningData) + before.setAuxiliaryData(extraSpanningProperty, extraSpanningData->toInt() + 1); + else + before.setAuxiliaryData(extraSpanningProperty, 1); } } diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp index 79a3e75888b..9b50ccb905f 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp +++ b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp @@ -74,6 +74,7 @@ #include #include #include +#include #include #include @@ -95,7 +96,14 @@ namespace QmlDesigner { -const PropertyName auxDataString("anchors_"); +namespace { +const Utils::SmallString auxDataString("anchors_"); + +Utils::SmallString auxPropertyString(Utils::SmallStringView name) +{ + return auxDataString + name; +} +} // namespace static inline void reparentTo(const ModelNode &node, const QmlItemNode &parent) { @@ -376,20 +384,24 @@ void reverse(const SelectionContext &selectionState) static inline void backupPropertyAndRemove(const ModelNode &node, const PropertyName &propertyName) { if (node.hasVariantProperty(propertyName)) { - node.setAuxiliaryData(auxDataString + propertyName, node.variantProperty(propertyName).value()); + node.setAuxiliaryData(AuxiliaryDataType::Document, + auxPropertyString(propertyName), + node.variantProperty(propertyName).value()); node.removeProperty(propertyName); } if (node.hasBindingProperty(propertyName)) { - node.setAuxiliaryData(auxDataString + propertyName, QmlItemNode(node).instanceValue(propertyName)); + node.setAuxiliaryData(AuxiliaryDataType::Document, + auxPropertyString(propertyName), + QmlItemNode(node).instanceValue(propertyName)); node.removeProperty(propertyName); } } -static inline void restoreProperty(const ModelNode &node, const PropertyName &propertyName) +static void restoreProperty(const ModelNode &node, const PropertyName &propertyName) { - if (node.hasAuxiliaryData(auxDataString + propertyName)) - node.variantProperty(propertyName).setValue(node.auxiliaryData(auxDataString + propertyName)); + if (auto data = node.auxiliaryData(AuxiliaryDataType::Document, auxPropertyString(propertyName))) + node.variantProperty(propertyName).setValue(*data); } void anchorsFill(const SelectionContext &selectionState) diff --git a/src/plugins/qmldesigner/components/connectioneditor/connectionview.cpp b/src/plugins/qmldesigner/components/connectioneditor/connectionview.cpp index e84e0063e3c..92e224d5b8b 100644 --- a/src/plugins/qmldesigner/components/connectioneditor/connectionview.cpp +++ b/src/plugins/qmldesigner/components/connectioneditor/connectionview.cpp @@ -177,11 +177,11 @@ void ConnectionView::selectedNodesChanged(const QList & selectedNodeL } void ConnectionView::auxiliaryDataChanged([[maybe_unused]] const ModelNode &node, - const PropertyName &name, + AuxiliaryDataKeyView key, const QVariant &data) { // Check if the auxiliary data is actually the locked property or if it is unlocked - if (name != QmlDesigner::lockedProperty || !data.toBool()) + if (key != lockedProperty || !data.toBool()) return; QItemSelectionModel *selectionModel = connectionTableView()->selectionModel(); diff --git a/src/plugins/qmldesigner/components/connectioneditor/connectionview.h b/src/plugins/qmldesigner/components/connectioneditor/connectionview.h index 7bf3064f830..8e6cb66df1d 100644 --- a/src/plugins/qmldesigner/components/connectioneditor/connectionview.h +++ b/src/plugins/qmldesigner/components/connectioneditor/connectionview.h @@ -70,7 +70,9 @@ public: void selectedNodesChanged(const QList &selectedNodeList, const QList &lastSelectedNodeList) override; - void auxiliaryDataChanged(const ModelNode &node, const PropertyName &name, const QVariant &data) override; + void auxiliaryDataChanged(const ModelNode &node, + AuxiliaryDataKeyView key, + const QVariant &data) override; void importsChanged(const QList &addedImports, const QList &removedImports) override; diff --git a/src/plugins/qmldesigner/components/curveeditor/curveeditormodel.cpp b/src/plugins/qmldesigner/components/curveeditor/curveeditormodel.cpp index fb60298e612..13d43ecbd13 100644 --- a/src/plugins/qmldesigner/components/curveeditor/curveeditormodel.cpp +++ b/src/plugins/qmldesigner/components/curveeditor/curveeditormodel.cpp @@ -261,7 +261,7 @@ TreeItem *CurveEditorModel::createTopLevelItem(const QmlDesigner::QmlTimeline &t return nullptr; auto *nodeItem = new NodeTreeItem(node.id(), node.typeIcon(), parentIds(node)); - if (node.hasAuxiliaryData("locked")) + if (node.locked()) nodeItem->setLocked(true); for (auto &&grp : timeline.keyframeGroupsForTarget(node)) { @@ -272,10 +272,10 @@ TreeItem *CurveEditorModel::createTopLevelItem(const QmlDesigner::QmlTimeline &t auto propertyItem = new PropertyTreeItem(name, curve); QmlDesigner::ModelNode target = grp.modelNode(); - if (target.hasAuxiliaryData("locked")) + if (target.locked()) propertyItem->setLocked(true); - if (target.hasAuxiliaryData("pinned")) + if (target.hasAuxiliaryData(pinnedProperty)) propertyItem->setPinned(true); nodeItem->addChild(propertyItem); @@ -388,8 +388,8 @@ AnimationCurve CurveEditorModel::createDoubleCurve(const QmlDesigner::QmlTimelin QString str; QmlDesigner::ModelNode target = group.modelNode(); - if (target.hasAuxiliaryData("unified")) - str = target.auxiliaryData("unified").toString(); + if (auto data = target.auxiliaryData(unifiedProperty)) + str = data->toString(); if (str.size() == static_cast(keyframes.size())) { for (int i = 0; i < str.size(); ++i) { diff --git a/src/plugins/qmldesigner/components/curveeditor/curveeditormodel.h b/src/plugins/qmldesigner/components/curveeditor/curveeditormodel.h index aa804058c64..cfeca1dc696 100644 --- a/src/plugins/qmldesigner/components/curveeditor/curveeditormodel.h +++ b/src/plugins/qmldesigner/components/curveeditor/curveeditormodel.h @@ -43,6 +43,9 @@ class AnimationCurve; class PropertyTreeItem; class TreeItem; +inline constexpr AuxiliaryDataKeyView pinnedProperty{AuxiliaryDataType::Document, "pinned"}; +inline constexpr AuxiliaryDataKeyView unifiedProperty{AuxiliaryDataType::Document, "unified"}; + class CurveEditorModel : public TreeModel { Q_OBJECT diff --git a/src/plugins/qmldesigner/components/curveeditor/curveeditorview.cpp b/src/plugins/qmldesigner/components/curveeditor/curveeditorview.cpp index b24764a2f3c..d7e211164e2 100644 --- a/src/plugins/qmldesigner/components/curveeditor/curveeditorview.cpp +++ b/src/plugins/qmldesigner/components/curveeditor/curveeditorview.cpp @@ -29,13 +29,14 @@ #include "curvesegment.h" #include "treeitem.h" +#include #include #include #include +#include #include #include #include -#include #include @@ -125,10 +126,10 @@ void CurveEditorView::nodeReparented([[maybe_unused]] const ModelNode &node, } void CurveEditorView::auxiliaryDataChanged(const ModelNode &node, - const PropertyName &name, + AuxiliaryDataKeyView key, const QVariant &data) { - if (name == "locked") { + if (key == lockedProperty) { if (auto *item = m_model->find(node.id())) { QSignalBlocker blocker(m_model); m_model->setLocked(item, data.toBool()); @@ -300,20 +301,20 @@ void commitAuxiliaryData(ModelNode &node, TreeItem *item) { if (node.isValid()) { if (item->locked()) - node.setAuxiliaryData("locked", true); + node.setLocked(true); else - node.removeAuxiliaryData("locked"); + node.setLocked(false); if (item->pinned()) - node.setAuxiliaryData("pinned", true); + node.setAuxiliaryData(pinnedProperty, true); else - node.removeAuxiliaryData("pinned"); + node.removeAuxiliaryData(pinnedProperty); if (auto *pitem = item->asPropertyItem()) { if (pitem->hasUnified()) - node.setAuxiliaryData("unified", pitem->unifyString()); + node.setAuxiliaryData(unifiedProperty, pitem->unifyString()); else - node.removeAuxiliaryData("unified"); + node.removeAuxiliaryData(unifiedProperty); } } } @@ -383,7 +384,7 @@ void CurveEditorView::commitCurrentFrame(int frame) { QmlTimeline timeline = activeTimeline(); if (timeline.isValid()) - timeline.modelNode().setAuxiliaryData("currentFrame@NodeInstance", frame); + timeline.modelNode().setAuxiliaryData(currentFrameProperty, frame); } void CurveEditorView::commitStartFrame(int frame) diff --git a/src/plugins/qmldesigner/components/curveeditor/curveeditorview.h b/src/plugins/qmldesigner/components/curveeditor/curveeditorview.h index cdfc762191a..1eb2b0cdd42 100644 --- a/src/plugins/qmldesigner/components/curveeditor/curveeditorview.h +++ b/src/plugins/qmldesigner/components/curveeditor/curveeditorview.h @@ -60,7 +60,7 @@ public: PropertyChangeFlags propertyChange) override; void auxiliaryDataChanged(const ModelNode &node, - const PropertyName &name, + AuxiliaryDataKeyView key, const QVariant &data) override; void instancePropertyChanged(const QList> &propertyList) override; diff --git a/src/plugins/qmldesigner/components/debugview/debugview.cpp b/src/plugins/qmldesigner/components/debugview/debugview.cpp index 76e31d9c72c..66ed8facad0 100644 --- a/src/plugins/qmldesigner/components/debugview/debugview.cpp +++ b/src/plugins/qmldesigner/components/debugview/debugview.cpp @@ -38,6 +38,7 @@ #include #include +#include namespace { const QString lineBreak = QStringLiteral("
"); @@ -242,6 +243,28 @@ void DebugView::rootNodeTypeChanged(const QString &type, int majorVersion, int m } } +namespace { +QTextStream &operator<<(QTextStream &stream, AuxiliaryDataType type) +{ + switch (type) { + case AuxiliaryDataType::None: + stream << "None"; + break; + case AuxiliaryDataType::NodeInstance: + stream << "NodeInstance"; + break; + case AuxiliaryDataType::Document: + stream << "Permanent"; + break; + case AuxiliaryDataType::Temporary: + stream << "Temporary"; + break; + } + + return stream; +} +} // namespace + void DebugView::selectedNodesChanged(const QList &selectedNodes /*selectedNodeList*/, const QList & /*lastSelectedNodeList*/) { @@ -286,12 +309,14 @@ void DebugView::selectedNodesChanged(const QList &selectedNodes /*sel message << lineBreak; } - const QHash data = selectedNode.auxiliaryData(); + auto auxiliaryData = selectedNode.auxiliaryData(); - PropertyNameList names = data.keys(); - Utils::sort(names); - for (const PropertyName &name : qAsConst(names)) { - message << name << ' ' << data.value(name).toString() << lineBreak; + Utils::sort(auxiliaryData, [](const auto &first, const auto &second) { + return first.first < second.first; + }); + for (const auto &element : auxiliaryData) { + message << element.first.type << ' ' << element.first.name.data() << ' ' + << element.second.toString() << lineBreak; } log("::selectedNodesChanged:", string); @@ -315,7 +340,9 @@ void DebugView::propertiesRemoved(const QList &propertyList) } } -void DebugView::auxiliaryDataChanged(const ModelNode &node, const PropertyName &name, const QVariant &data) +void DebugView::auxiliaryDataChanged(const ModelNode &node, + AuxiliaryDataKeyView key, + const QVariant &data) { if (isDebugViewEnabled()) { QTextStream message; @@ -323,7 +350,8 @@ void DebugView::auxiliaryDataChanged(const ModelNode &node, const PropertyName & message.setString(&string); message << node; - message << name; + message << key.type; + message << QByteArray{key.name}; message << data.toString(); log("::auxiliaryDataChanged:", string); diff --git a/src/plugins/qmldesigner/components/debugview/debugview.h b/src/plugins/qmldesigner/components/debugview/debugview.h index 3e986917e14..fd65fb6372d 100644 --- a/src/plugins/qmldesigner/components/debugview/debugview.h +++ b/src/plugins/qmldesigner/components/debugview/debugview.h @@ -64,7 +64,9 @@ public: void scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList) override; void propertiesRemoved(const QList &propertyList) override; - void auxiliaryDataChanged(const ModelNode &node, const PropertyName &name, const QVariant &data) override; + void auxiliaryDataChanged(const ModelNode &node, + AuxiliaryDataKeyView type, + const QVariant &data) override; void documentMessagesChanged(const QList &errors, const QList &warnings) override; void rewriterBeginTransaction() override; diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp index 768e121e6df..a45009d131c 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp @@ -31,16 +31,18 @@ #include "edit3dviewconfig.h" #include "backgroundcolorselection.h" +#include #include #include #include #include #include #include +#include #include #include #include -#include + #include #include @@ -127,7 +129,7 @@ void Edit3DView::updateActiveScene3D(const QVariantMap &sceneState) if (sceneState.contains(sceneKey)) { qint32 newActiveScene = sceneState[sceneKey].value(); edit3DWidget()->canvas()->updateActiveScene(newActiveScene); - rootModelNode().setAuxiliaryData("active3dScene@Internal", newActiveScene); + rootModelNode().setAuxiliaryData(active3dSceneProperty, newActiveScene); } if (sceneState.contains(selectKey)) diff --git a/src/plugins/qmldesigner/components/formeditor/formeditoritem.cpp b/src/plugins/qmldesigner/components/formeditor/formeditoritem.cpp index 6421b933f24..92f712db03d 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditoritem.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditoritem.cpp @@ -26,8 +26,9 @@ #include "formeditoritem.h" #include "formeditorscene.h" -#include +#include #include +#include #include #include @@ -123,7 +124,7 @@ void FormEditorItem::setup() setContentVisible(qmlItemNode().instanceValue("visible").toBool()); - if (qmlItemNode().modelNode().auxiliaryData("invisible").toBool()) + if (qmlItemNode().modelNode().auxiliaryDataWithDefault(invisibleProperty).toBool()) setVisible(false); setFlag(QGraphicsItem::ItemIsMovable, true); @@ -633,11 +634,11 @@ void FormEditorFlowItem::paint(QPainter *painter, const QStyleOptionGraphicsItem QColor flowColor(0xe71919); - if (qmlItemNode().rootModelNode().hasAuxiliaryData("areaColor")) - flowColor = qmlItemNode().rootModelNode().auxiliaryData("areaColor").value(); + if (auto data = qmlItemNode().rootModelNode().auxiliaryData(areaColorProperty); data) + flowColor = data->value(); - if (qmlItemNode().modelNode().hasAuxiliaryData("color")) - flowColor = qmlItemNode().modelNode().auxiliaryData("color").value(); + if (auto data = qmlItemNode().modelNode().auxiliaryData(colorProperty)) + flowColor = data->value(); pen.setColor(flowColor); @@ -650,11 +651,10 @@ void FormEditorFlowItem::paint(QPainter *painter, const QStyleOptionGraphicsItem pen.setWidthF(width); - bool dash = false; - if (qmlItemNode().modelNode().hasAuxiliaryData("dash")) - dash = qmlItemNode().modelNode().auxiliaryData("dash").toBool(); + if (auto data = qmlItemNode().modelNode().auxiliaryData(dashProperty); data) + dash = data->toBool(); if (dash) pen.setStyle(Qt::DashLine); @@ -738,23 +738,23 @@ void FormEditorFlowActionItem::paint(QPainter *painter, const QStyleOptionGraphi QColor flowColor(0xe71919); - if (qmlItemNode().rootModelNode().hasAuxiliaryData("areaColor")) - flowColor = qmlItemNode().rootModelNode().auxiliaryData("areaColor").value(); + if (auto data = qmlItemNode().rootModelNode().auxiliaryData(areaColorProperty)) + flowColor = data->value(); - if (qmlItemNode().modelNode().hasAuxiliaryData("color")) - flowColor = qmlItemNode().modelNode().auxiliaryData("color").value(); + if (auto data = qmlItemNode().modelNode().auxiliaryData(colorProperty)) + flowColor = data->value(); qreal width = 2; - if (qmlItemNode().modelNode().hasAuxiliaryData("width")) - width = qmlItemNode().modelNode().auxiliaryData("width").toInt(); + if (auto data = qmlItemNode().modelNode().auxiliaryData(widthProperty)) + width = data->toInt(); width *= getLineScaleFactor(); bool dash = false; - if (qmlItemNode().modelNode().hasAuxiliaryData("dash")) - dash = qmlItemNode().modelNode().auxiliaryData("dash").toBool(); + if (auto data = qmlItemNode().modelNode().auxiliaryData(dashProperty)) + dash = data->toBool(); pen.setColor(flowColor); if (dash) @@ -768,11 +768,11 @@ void FormEditorFlowActionItem::paint(QPainter *painter, const QStyleOptionGraphi QColor fillColor = QColor(Qt::transparent); - if (qmlItemNode().rootModelNode().hasAuxiliaryData("areaFillColor")) - fillColor = qmlItemNode().rootModelNode().auxiliaryData("areaFillColor").value(); + if (auto data = qmlItemNode().rootModelNode().auxiliaryData(areaFillColorProperty)) + fillColor = data->value(); - if (qmlItemNode().modelNode().hasAuxiliaryData("fillColor")) - fillColor = qmlItemNode().modelNode().auxiliaryData("fillColor").value(); + if (auto data = qmlItemNode().modelNode().auxiliaryData(fillColorProperty)) + fillColor = data->value(); if (fillColor.alpha() > 0) painter->setBrush(fillColor); @@ -882,8 +882,9 @@ public: areaNode = ModelNode(); } - if (f.modelNode().hasAuxiliaryData("joinConnection")) - joinConnection = f.modelNode().auxiliaryData("joinConnection").toBool(); + if (auto data = f.modelNode().auxiliaryData(joinConnectionProperty)) { + joinConnection = data->toBool(); + } } else { if (f == node.rootModelNode()) isStartLine = true; @@ -937,8 +938,8 @@ public: , events() { // width - if (node.modelNode().hasAuxiliaryData("width")) - width = node.modelNode().auxiliaryData("width").toFloat(); + if (auto data = node.modelNode().auxiliaryData(widthProperty)) + width = data->toFloat(); // adjusted width if (node.modelNode().isSelected()) width += 2; @@ -949,41 +950,46 @@ public: color = QColor("blue"); if (resolveConnection.isWildcardLine) color = QColor("green"); - if (node.rootModelNode().hasAuxiliaryData("transitionColor")) - color = node.rootModelNode().auxiliaryData("transitionColor").value(); - if (node.modelNode().hasAuxiliaryData("color")) - color = node.modelNode().auxiliaryData("color").value(); + if (auto data = node.rootModelNode().auxiliaryData(transitionColorProperty)) { + color = data->value(); + } + if (auto data = node.modelNode().auxiliaryData(colorProperty)) + color = data->value(); // linbe brush lineBrush = QBrush(color); // pen style // dash - if (node.modelNode().hasAuxiliaryData("dash") && node.modelNode().auxiliaryData("dash").toBool()) + if (auto data = node.modelNode().auxiliaryData(dashProperty); data && data->toBool()) { penStyle = Qt::DashLine; + } // in/out offset - if (node.modelNode().hasAuxiliaryData("outOffset")) - outOffset = node.modelNode().auxiliaryData("outOffset").toInt(); - if (node.modelNode().hasAuxiliaryData("inOffset")) - inOffset = node.modelNode().auxiliaryData("inOffset").toInt(); + if (auto data = node.modelNode().auxiliaryData(outOffsetProperty)) + outOffset = data->toInt(); + if (auto data = node.modelNode().auxiliaryData(inOffsetProperty)) + inOffset = data->toInt(); // break offset - if (node.modelNode().hasAuxiliaryData("breakPoint")) - breakOffset = node.modelNode().auxiliaryData("breakPoint").toInt(); + if (auto data = node.modelNode().auxiliaryData(breakPointProperty)) + breakOffset = data->toInt(); // radius - if (node.rootModelNode().hasAuxiliaryData("transitionRadius")) - radius = node.rootModelNode().auxiliaryData("transitionRadius").toInt(); - if (node.modelNode().hasAuxiliaryData("radius")) - radius = node.modelNode().auxiliaryData("radius").toInt(); + if (auto data = node.rootModelNode().auxiliaryData(transitionRadiusProperty)) { + radius = data->toInt(); + } + if (auto data = node.modelNode().auxiliaryData(radiusProperty)) + radius = data->toInt(); // bezier - if (node.rootModelNode().hasAuxiliaryData("transitionBezier")) - bezier = node.rootModelNode().auxiliaryData("transitionBezier").toInt(); - if (node.modelNode().hasAuxiliaryData("bezier")) - bezier = node.modelNode().auxiliaryData("bezier").toInt(); + if (auto data = node.rootModelNode().auxiliaryData(transitionBezierProperty)) { + bezier = data->toInt(); + } + if (auto data = node.modelNode().auxiliaryData(bezierProperty)) + bezier = data->toInt(); // type - if (node.rootModelNode().hasAuxiliaryData("transitionType")) - type = static_cast(node.rootModelNode().auxiliaryData("transitionType").toInt()); - if (node.modelNode().hasAuxiliaryData("type")) - type = static_cast(node.modelNode().auxiliaryData("type").toInt()); + if (auto data = node.rootModelNode().auxiliaryData(transitionTypeProperty)) { + type = static_cast(data->toInt()); + } + if (auto data = node.modelNode().auxiliaryData(typeProperty)) + type = static_cast(data->toInt()); // label if (node.modelNode().hasBindingProperty("condition")) label = node.modelNode().bindingProperty("condition").expression(); @@ -992,11 +998,11 @@ public: // label offset // label position - if (node.modelNode().hasAuxiliaryData("labelPosition")) - labelPosition = node.modelNode().auxiliaryData("labelPosition").toReal(); + if (auto data = node.modelNode().auxiliaryData(labelPositionProperty)) + labelPosition = data->toReal(); // label flip side - if (node.modelNode().hasAuxiliaryData("labelFlipSide")) - labelFlipSide = node.modelNode().auxiliaryData("labelFlipSide").toBool(); + if (auto data = node.modelNode().auxiliaryData(labelFlipSideProperty)) + labelFlipSide = data->toBool(); isSelected = node.modelNode().isSelected(); @@ -1246,8 +1252,8 @@ public: { if (from.isFlowDecision()) { int size = flowBlockSize; - if (from.modelNode().hasAuxiliaryData("blockSize")) - size = from.modelNode().auxiliaryData("blockSize").toInt(); + if (auto data = from.modelNode().auxiliaryData(blockSizeProperty)) + size = data->toInt(); fromRect = QRectF(0, 0, size, size); @@ -1259,8 +1265,8 @@ public: fromRect = transform.mapRect(fromRect); } else if (from.isFlowWildcard()) { int size = flowBlockSize; - if (from.modelNode().hasAuxiliaryData("blockSize")) - size = from.modelNode().auxiliaryData("blockSize").toInt(); + if (auto data = from.modelNode().auxiliaryData(blockSizeProperty)) + size = data->toInt(); fromRect = QRectF(0, 0, size, size); } else if (from.isFlowView()) { fromRect = QRectF(0, 0, flowBlockSize, flowBlockSize); @@ -1278,8 +1284,8 @@ public: if (to.isFlowDecision()) { int size = flowBlockSize; - if (to.modelNode().hasAuxiliaryData("blockSize")) - size = to.modelNode().auxiliaryData("blockSize").toInt(); + if (auto data = to.modelNode().auxiliaryData(blockSizeProperty)) + size = data->toInt(); toRect = QRectF(0, 0, size, size); @@ -1998,8 +2004,8 @@ void FormEditorFlowDecisionItem::updateGeometry() prepareGeometryChange(); int size = flowBlockSize; - if (qmlItemNode().modelNode().hasAuxiliaryData("blockSize")) - size = qmlItemNode().modelNode().auxiliaryData("blockSize").toInt(); + if (auto data = qmlItemNode().modelNode().auxiliaryData(blockSizeProperty)) + size = data->toInt(); QRectF boundingRect(0, 0, size, size); QRectF selectionRect = boundingRect; @@ -2012,8 +2018,9 @@ void FormEditorFlowDecisionItem::updateGeometry() // If drawing the dialog title is requested we need to add it to the bounding rect. QRectF labelBoundingRect; bool showDialogLabel = false; - if (qmlItemNode().modelNode().hasAuxiliaryData("showDialogLabel")) - showDialogLabel = qmlItemNode().modelNode().auxiliaryData("showDialogLabel").toBool(); + if (auto data = qmlItemNode().modelNode().auxiliaryData(showDialogLabelProperty)) { + showDialogLabel = data->toBool(); + } if (showDialogLabel) { QString dialogTitle; @@ -2034,8 +2041,8 @@ void FormEditorFlowDecisionItem::updateGeometry() QRectF textRect(0, 0, 100, 20); Qt::Corner corner = Qt::TopRightCorner; - if (qmlItemNode().modelNode().hasAuxiliaryData("dialogLabelPosition")) - corner = qmlItemNode().modelNode().auxiliaryData("dialogLabelPosition").value(); + if (auto data = qmlItemNode().modelNode().auxiliaryData(showDialogLabelProperty)) + corner = data->value(); int flag = 0; switch (corner) { @@ -2093,26 +2100,27 @@ void FormEditorFlowDecisionItem::paint(QPainter *painter, QColor flowColor(0xe71919); - if (qmlItemNode().rootModelNode().hasAuxiliaryData("blockColor")) - flowColor = qmlItemNode().rootModelNode().auxiliaryData("blockColor").value(); + if (auto data = qmlItemNode().rootModelNode().auxiliaryData(blockColorProperty)) { + flowColor = data->value(); + } - if (qmlItemNode().modelNode().hasAuxiliaryData("color")) - flowColor = qmlItemNode().modelNode().auxiliaryData("color").value(); + if (auto data = qmlItemNode().modelNode().auxiliaryData(colorProperty)) + flowColor = data->value(); pen.setColor(flowColor); qreal width = 2; - if (qmlItemNode().modelNode().hasAuxiliaryData("width")) - width = qmlItemNode().modelNode().auxiliaryData("width").toInt(); + if (auto data = qmlItemNode().modelNode().auxiliaryData(widthProperty)) + width = data->toInt(); width *= getLineScaleFactor(); pen.setWidthF(width); bool dash = false; - if (qmlItemNode().modelNode().hasAuxiliaryData("dash")) - dash = qmlItemNode().modelNode().auxiliaryData("dash").toBool(); + if (auto data = qmlItemNode().modelNode().auxiliaryData(dashProperty)) + dash = data->toBool(); if (dash) pen.setStyle(Qt::DashLine); @@ -2123,8 +2131,8 @@ void FormEditorFlowDecisionItem::paint(QPainter *painter, QColor fillColor = QColor(Qt::transparent); - if (qmlItemNode().modelNode().hasAuxiliaryData("fillColor")) - fillColor = qmlItemNode().modelNode().auxiliaryData("fillColor").value(); + if (auto data = qmlItemNode().modelNode().auxiliaryData(fillColorProperty)) + fillColor = data->value(); painter->save(); @@ -2132,12 +2140,13 @@ void FormEditorFlowDecisionItem::paint(QPainter *painter, painter->setBrush(fillColor); int radius = blockRadius; - if (qmlItemNode().modelNode().hasAuxiliaryData("blockRadius")) - radius = qmlItemNode().modelNode().auxiliaryData("blockRadius").toInt(); + if (auto data = qmlItemNode().modelNode().auxiliaryData(blockRadiusProperty)) { + radius = data->toInt(); + } int size = flowBlockSize; - if (qmlItemNode().modelNode().hasAuxiliaryData("blockSize")) - size = qmlItemNode().modelNode().auxiliaryData("blockSize").toInt(); + if (auto data = qmlItemNode().modelNode().auxiliaryData(blockSizeProperty)) + size = data->toInt(); QRectF boundingRect(0, 0, size, size); QTransform transform; @@ -2162,8 +2171,9 @@ void FormEditorFlowDecisionItem::paint(QPainter *painter, // Draw the dialog title inside the form view if requested. Decision item only. bool showDialogLabel = false; - if (qmlItemNode().modelNode().hasAuxiliaryData("showDialogLabel")) - showDialogLabel = qmlItemNode().modelNode().auxiliaryData("showDialogLabel").toBool(); + if (auto data = qmlItemNode().modelNode().auxiliaryData(showDialogLabelProperty)) { + showDialogLabel = data->toBool(); + } if (showDialogLabel && viewportTransform().m11() >= labelShowThreshold) { QString dialogTitle; @@ -2179,8 +2189,8 @@ void FormEditorFlowDecisionItem::paint(QPainter *painter, QRectF textRect(0, 0, 100, 20); Qt::Corner corner = Qt::TopRightCorner; - if (qmlItemNode().modelNode().hasAuxiliaryData("dialogLabelPosition")) - corner = qmlItemNode().modelNode().auxiliaryData("dialogLabelPosition").value(); + if (auto data = qmlItemNode().modelNode().auxiliaryData(dialogLabelPositionProperty)) + corner = data->value(); int flag = 0; switch (corner) { diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp index 170c50713f7..1d870685b3a 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp @@ -36,18 +36,19 @@ #include "formeditorscene.h" #include "abstractcustomtool.h" +#include #include -#include #include #include -#include #include +#include #include #include #include #include -#include +#include #include +#include #include #include @@ -125,9 +126,9 @@ void FormEditorView::setupFormEditorItemTree(const QmlItemNode &qmlItemNode) FormEditorItem *rootItem = m_scene->addFormEditorItem(qmlItemNode, FormEditorScene::Flow); ModelNode node = qmlItemNode.modelNode(); - if (!node.hasAuxiliaryData("width") && !node.hasAuxiliaryData("height")) { - node.setAuxiliaryData("width", 10000); - node.setAuxiliaryData("height", 10000); + if (!node.hasAuxiliaryData(widthProperty) && !node.hasAuxiliaryData(heightProperty)) { + node.setAuxiliaryData(widthProperty, 10000); + node.setAuxiliaryData(heightProperty, 10000); } m_scene->synchronizeTransformation(rootItem); @@ -604,11 +605,22 @@ void FormEditorView::registerTool(std::unique_ptr &&tool) m_customTools.push_back(std::move(tool)); } -void FormEditorView::auxiliaryDataChanged(const ModelNode &node, const PropertyName &name, const QVariant &data) +namespace { + +template +constexpr bool contains(const Tuple &tuple, AuxiliaryDataKeyView key) +{ + return std::apply([=](const auto &...keys) { return ((key == keys) || ...); }, tuple); +} +} // namespace + +void FormEditorView::auxiliaryDataChanged(const ModelNode &node, + AuxiliaryDataKeyView key, + const QVariant &data) { QmlItemNode item(node); - AbstractView::auxiliaryDataChanged(node, name, data); - if (name == "invisible") { + + if (key == invisibleProperty) { if (FormEditorItem *item = scene()->itemForQmlItemNode(QmlItemNode(node))) { bool isInvisible = data.toBool(); item->setVisible(!isInvisible); @@ -616,29 +628,39 @@ void FormEditorView::auxiliaryDataChanged(const ModelNode &node, const PropertyN if (isInvisible) newNode.deselectNode(); } - } else if (item.isFlowTransition() || item.isFlowActionArea() - || item.isFlowDecision() || item.isFlowWildcard()) { + } else if (item.isFlowTransition() || item.isFlowActionArea() || item.isFlowDecision() + || item.isFlowWildcard()) { if (FormEditorItem *editorItem = m_scene->itemForQmlItemNode(item)) { // Update the geomtry if one of the following auxiliary properties has changed - static const QStringList updateGeometryPropertyNames = { - "breakPoint", "bezier", "transitionBezier", "type", "tranitionType", "radius", - "transitionRadius", "labelPosition", "labelFlipSide", "inOffset", "outOffset", - "blockSize", "blockRadius", "showDialogLabel", "dialogLabelPosition" - }; - if (updateGeometryPropertyNames.contains(QString::fromUtf8(name))) + auto updateGeometryPropertyNames = std::make_tuple(breakPointProperty, + bezierProperty, + transitionBezierProperty, + typeProperty, + transitionTypeProperty, + radiusProperty, + transitionRadiusProperty, + labelPositionProperty, + labelFlipSideProperty, + inOffsetProperty, + outOffsetProperty, + blockSizeProperty, + blockRadiusProperty, + showDialogLabelProperty, + dialogLabelPositionProperty); + if (contains(updateGeometryPropertyNames, key)) editorItem->updateGeometry(); editorItem->update(); } } else if (item.isFlowView() || item.isFlowItem()) { scene()->update(); - } else if (name == "annotation" || name == "customId") { + } else if (key == annotationProperty || key == customIdProperty) { if (FormEditorItem *editorItem = scene()->itemForQmlItemNode(item)) { editorItem->update(); } } - if (name == "FrameColor@Internal") { + if (key.name == "FrameColor") { if (FormEditorItem *editorItem = scene()->itemForQmlItemNode(item)) editorItem->setFrameColor(data.value()); } @@ -682,6 +704,10 @@ void FormEditorView::instancesCompleted(const QVector &completedNodeL currentTool()->instancesCompleted(itemNodeList); } +namespace { +constexpr AuxiliaryDataKeyView autoSizeProperty{AuxiliaryDataType::Temporary, "autoSize"}; +} + void FormEditorView::instanceInformationsChanged(const QMultiHash &informationChangedHash) { QList changedItems; @@ -700,19 +726,19 @@ void FormEditorView::instanceInformationsChanged(const QMultiHashupdateActions(); } else { - if (rootModelNode().hasAuxiliaryData("autoSize") - && (qmlItemNode.propertyAffectedByCurrentState("width") - || qmlItemNode.propertyAffectedByCurrentState("height"))) { - rootModelNode().setAuxiliaryData("width", QVariant()); - rootModelNode().setAuxiliaryData("height", QVariant()); - rootModelNode().removeAuxiliaryData("autoSize"); + if (rootModelNode().hasAuxiliaryData(autoSizeProperty) + && (qmlItemNode.propertyAffectedByCurrentState("width") + || qmlItemNode.propertyAffectedByCurrentState("height"))) { + rootModelNode().removeAuxiliaryData(widthProperty); + rootModelNode().removeAuxiliaryData(heightProperty); + rootModelNode().removeAuxiliaryData(autoSizeProperty); formEditorWidget()->updateActions(); } } diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.h b/src/plugins/qmldesigner/components/formeditor/formeditorview.h index c15f73498b5..5e87954a46c 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorview.h +++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.h @@ -115,7 +115,9 @@ public: void registerTool(std::unique_ptr &&tool); - void auxiliaryDataChanged(const ModelNode &node, const PropertyName &name, const QVariant &data) override; + void auxiliaryDataChanged(const ModelNode &node, + AuxiliaryDataKeyView name, + const QVariant &data) override; void instancesCompleted(const QVector &completedNodeList) override; void instanceInformationsChanged(const QMultiHash &informationChangedHash) override; diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp index 6991c561414..891b67fc8eb 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp @@ -32,14 +32,15 @@ #include "qmldesignericons.h" #include "qmldesignerplugin.h" #include "viewmanager.h" -#include -#include +#include #include #include #include #include #include +#include +#include #include #include @@ -61,6 +62,11 @@ namespace QmlDesigner { +namespace { +constexpr AuxiliaryDataKeyView formeditorZoomProperty{AuxiliaryDataType::NodeInstance, + "formeditorZoom"}; +} + FormEditorWidget::FormEditorWidget(FormEditorView *view) : m_formEditorView(view) { @@ -178,10 +184,9 @@ FormEditorWidget::FormEditorWidget(FormEditorView *view) auto writeZoomLevel = [this]() { double level = m_graphicsView->transform().m11(); if (level == 1.0) { - if (m_formEditorView->rootModelNode().hasAuxiliaryData("formeditorZoom")) - m_formEditorView->rootModelNode().setAuxiliaryData("formeditorZoom", {}); + m_formEditorView->rootModelNode().removeAuxiliaryData(formeditorZoomProperty); } else { - m_formEditorView->rootModelNode().setAuxiliaryData("formeditorZoom", level); + m_formEditorView->rootModelNode().setAuxiliaryData(formeditorZoomProperty, level); } }; @@ -312,31 +317,39 @@ void FormEditorWidget::changeRootItemWidth(const QString &widthText) { bool canConvert; int width = widthText.toInt(&canConvert); - if (canConvert) - m_formEditorView->rootModelNode().setAuxiliaryData("width", width); - else - m_formEditorView->rootModelNode().setAuxiliaryData("width", QVariant()); + if (canConvert) { + m_formEditorView->rootModelNode().setAuxiliaryData(widthProperty, width); + } else { + m_formEditorView->rootModelNode().removeAuxiliaryData(widthProperty); + } } void FormEditorWidget::changeRootItemHeight(const QString &heighText) { bool canConvert; int height = heighText.toInt(&canConvert); - if (canConvert) - m_formEditorView->rootModelNode().setAuxiliaryData("height", height); - else - m_formEditorView->rootModelNode().setAuxiliaryData("height", QVariant()); + if (canConvert) { + m_formEditorView->rootModelNode().setAuxiliaryData(heightProperty, height); + } else { + m_formEditorView->rootModelNode().removeAuxiliaryData(heightProperty); + } +} + +namespace { +constexpr AuxiliaryDataKeyView formeditorColorProperty{AuxiliaryDataType::Temporary, + "formeditorColor"}; } void FormEditorWidget::changeBackgound(const QColor &color) { if (color.alpha() == 0) { m_graphicsView->activateCheckboardBackground(); - if (m_formEditorView->rootModelNode().hasAuxiliaryData("formeditorColor")) - m_formEditorView->rootModelNode().setAuxiliaryData("formeditorColor", {}); + if (m_formEditorView->rootModelNode().hasAuxiliaryData(formeditorColorProperty)) { + m_formEditorView->rootModelNode().setAuxiliaryData(formeditorColorProperty, {}); + } } else { m_graphicsView->activateColoredBackground(color); - m_formEditorView->rootModelNode().setAuxiliaryData("formeditorColor", color); + m_formEditorView->rootModelNode().setAuxiliaryData(formeditorColorProperty, color); } } @@ -353,8 +366,9 @@ void FormEditorWidget::initialize() { double defaultZoom = 1.0; if (m_formEditorView->model() && m_formEditorView->rootModelNode().isValid()) { - if (m_formEditorView->rootModelNode().hasAuxiliaryData("formeditorZoom")) - defaultZoom = m_formEditorView->rootModelNode().auxiliaryData("formeditorZoom").toDouble(); + if (auto data = m_formEditorView->rootModelNode().auxiliaryData(formeditorZoomProperty)) { + defaultZoom = data->toDouble(); + } } m_graphicsView->setZoomFactor(defaultZoom); if (m_formEditorView->scene() && m_formEditorView->scene()->rootFormEditorItem()) @@ -366,25 +380,23 @@ void FormEditorWidget::initialize() void FormEditorWidget::updateActions() { if (m_formEditorView->model() && m_formEditorView->rootModelNode().isValid()) { - if (m_formEditorView->rootModelNode().hasAuxiliaryData("width") - && m_formEditorView->rootModelNode().auxiliaryData("width").isValid()) - m_rootWidthAction->setLineEditText( - m_formEditorView->rootModelNode().auxiliaryData("width").toString()); - else + if (auto data = m_formEditorView->rootModelNode().auxiliaryData(widthProperty)) { + m_rootWidthAction->setLineEditText(data->toString()); + } else { m_rootWidthAction->clearLineEditText(); - if (m_formEditorView->rootModelNode().hasAuxiliaryData("height") - && m_formEditorView->rootModelNode().auxiliaryData("height").isValid()) - m_rootHeightAction->setLineEditText( - m_formEditorView->rootModelNode().auxiliaryData("height").toString()); - else + } + + if (auto data = m_formEditorView->rootModelNode().auxiliaryData(heightProperty)) { + m_rootHeightAction->setLineEditText(data->toString()); + } else { m_rootHeightAction->clearLineEditText(); + } - if (m_formEditorView->rootModelNode().hasAuxiliaryData("formeditorColor")) - m_backgroundAction->setColor( - m_formEditorView->rootModelNode().auxiliaryData("formeditorColor").value()); - else + if (auto data = m_formEditorView->rootModelNode().auxiliaryData(formeditorColorProperty)) { + m_backgroundAction->setColor(data->value()); + } else { m_backgroundAction->setColor(Qt::transparent); - + } } else { m_rootWidthAction->clearLineEditText(); m_rootHeightAction->clearLineEditText(); diff --git a/src/plugins/qmldesigner/components/integration/designdocument.cpp b/src/plugins/qmldesigner/components/integration/designdocument.cpp index c0b1b4ce1b1..87a8af19fa4 100644 --- a/src/plugins/qmldesigner/components/integration/designdocument.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocument.cpp @@ -26,18 +26,19 @@ #include "designdocument.h" #include "designdocumentview.h" #include "documentmanager.h" - -#include -#include -#include -#include -#include -#include -#include -#include #include "qmldesignerconstants.h" #include "qmlvisualnode.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + #include #include #include @@ -589,11 +590,13 @@ void DesignDocument::paste() [](const ModelNode &node) { return !node.isSubclassOf("QtQuick3D.Node"); }) == selectedNodes.cend(); if (all3DNodes) { - int activeSceneId = rootModelNode().auxiliaryData("active3dScene@Internal").toInt(); - if (activeSceneId != -1) { - NodeListProperty sceneNodeProperty - = QmlVisualNode::findSceneNodeProperty(rootModelNode().view(), activeSceneId); - targetNode = sceneNodeProperty.parentModelNode(); + auto data = rootModelNode().auxiliaryData(active3dSceneProperty); + if (data) { + if (int activeSceneId = data->toInt(); activeSceneId != -1) { + NodeListProperty sceneNodeProperty = QmlVisualNode::findSceneNodeProperty( + rootModelNode().view(), activeSceneId); + targetNode = sceneNodeProperty.parentModelNode(); + } } } } @@ -636,11 +639,13 @@ void DesignDocument::paste() } else { // if selection is empty and this is a 3D Node, paste it under the active scene if (pastedNode.isSubclassOf("QtQuick3D.Node")) { - int activeSceneId = rootModelNode().auxiliaryData("active3dScene@Internal").toInt(); - if (activeSceneId != -1) { - NodeListProperty sceneNodeProperty - = QmlVisualNode::findSceneNodeProperty(rootModelNode().view(), activeSceneId); - targetNode = sceneNodeProperty.parentModelNode(); + auto data = rootModelNode().auxiliaryData(active3dSceneProperty); + if (data) { + if (int activeSceneId = data->toInt(); activeSceneId != -1) { + NodeListProperty sceneNodeProperty = QmlVisualNode::findSceneNodeProperty( + rootModelNode().view(), activeSceneId); + targetNode = sceneNodeProperty.parentModelNode(); + } } } } diff --git a/src/plugins/qmldesigner/components/materialeditor/materialeditorqmlbackend.cpp b/src/plugins/qmldesigner/components/materialeditor/materialeditorqmlbackend.cpp index 6769c0ddbf4..09c55178c4b 100644 --- a/src/plugins/qmldesigner/components/materialeditor/materialeditorqmlbackend.cpp +++ b/src/plugins/qmldesigner/components/materialeditor/materialeditorqmlbackend.cpp @@ -333,10 +333,11 @@ void MaterialEditorQmlBackend::emitSelectionChanged() m_backendModelNode.emitSelectionChanged(); } -void MaterialEditorQmlBackend::setValueforAuxiliaryProperties(const QmlObjectNode &qmlObjectNode, const PropertyName &name) +void MaterialEditorQmlBackend::setValueforAuxiliaryProperties(const QmlObjectNode &qmlObjectNode, + AuxiliaryDataKeyView key) { - const PropertyName propertyName = auxNamePostFix(name); - setValue(qmlObjectNode, propertyName, qmlObjectNode.modelNode().auxiliaryData(name)); + const PropertyName propertyName = auxNamePostFix(PropertyName(key.name)); + setValue(qmlObjectNode, propertyName, qmlObjectNode.modelNode().auxiliaryDataWithDefault(key)); } } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/materialeditor/materialeditorqmlbackend.h b/src/plugins/qmldesigner/components/materialeditor/materialeditorqmlbackend.h index 503f4a2667c..f7ec6ad089c 100644 --- a/src/plugins/qmldesigner/components/materialeditor/materialeditorqmlbackend.h +++ b/src/plugins/qmldesigner/components/materialeditor/materialeditorqmlbackend.h @@ -72,7 +72,7 @@ public: void emitSelectionToBeChanged(); void emitSelectionChanged(); - void setValueforAuxiliaryProperties(const QmlObjectNode &qmlObjectNode, const PropertyName &name); + void setValueforAuxiliaryProperties(const QmlObjectNode &qmlObjectNode, AuxiliaryDataKeyView key); private: void createPropertyEditorValue(const QmlObjectNode &qmlObjectNode, diff --git a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp index 101269d2af4..52018307341 100644 --- a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp +++ b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp @@ -504,9 +504,9 @@ void MaterialEditorView::commitAuxValueToModel(const PropertyName &propertyName, try { if (value.isValid()) - m_selectedMaterial.setAuxiliaryData(name, value); + m_selectedMaterial.setAuxiliaryData(AuxiliaryDataType::Document, name, value); else - m_selectedMaterial.removeAuxiliaryData(name); + m_selectedMaterial.removeAuxiliaryData(AuxiliaryDataType::Document, name); } catch (const Exception &e) { e.showException(); @@ -625,13 +625,15 @@ void MaterialEditorView::bindingPropertiesChanged(const QList & requestPreviewRender(); } -void MaterialEditorView::auxiliaryDataChanged(const ModelNode &node, const PropertyName &name, const QVariant &) +void MaterialEditorView::auxiliaryDataChanged(const ModelNode &node, + AuxiliaryDataKeyView key, + const QVariant &) { if (noValidSelection() || !node.isSelected()) return; - m_qmlBackEnd->setValueforAuxiliaryProperties(m_selectedMaterial, name); + m_qmlBackEnd->setValueforAuxiliaryProperties(m_selectedMaterial, key); } // request render image for the selected material node diff --git a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.h b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.h index ff734ed30b8..ba16ea38b77 100644 --- a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.h +++ b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.h @@ -61,7 +61,9 @@ public: void variantPropertiesChanged(const QList &propertyList, PropertyChangeFlags propertyChange) override; void bindingPropertiesChanged(const QList &propertyList, PropertyChangeFlags propertyChange) override; - void auxiliaryDataChanged(const ModelNode &node, const PropertyName &name, const QVariant &data) override; + void auxiliaryDataChanged(const ModelNode &node, + AuxiliaryDataKeyView key, + const QVariant &data) override; void resetView(); void currentStateChanged(const ModelNode &node) override; diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp index d8f8de7a802..ef271ecc165 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp @@ -403,10 +403,9 @@ void NavigatorView::nodeTypeChanged(const ModelNode &modelNode, const TypeName & } void NavigatorView::auxiliaryDataChanged(const ModelNode &modelNode, - [[maybe_unused]] const PropertyName &name, + [[maybe_unused]] AuxiliaryDataKeyView key, [[maybe_unused]] const QVariant &data) { - m_currentModelInterface->notifyDataChanged(modelNode); } diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.h b/src/plugins/qmldesigner/components/navigator/navigatorview.h index ee29e7691ad..739398cf8a2 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorview.h +++ b/src/plugins/qmldesigner/components/navigator/navigatorview.h @@ -87,7 +87,9 @@ public: void selectedNodesChanged(const QList &selectedNodeList , const QList &lastSelectedNodeList) override; - void auxiliaryDataChanged(const ModelNode &node, const PropertyName &name, const QVariant &data) override; + void auxiliaryDataChanged(const ModelNode &node, + AuxiliaryDataKeyView key, + const QVariant &data) override; void instanceErrorChanged(const QVector &errorNodeList) override; void bindingPropertiesChanged(const QList &propertyList, PropertyChangeFlags) override; diff --git a/src/plugins/qmldesigner/components/propertyeditor/aligndistribute.cpp b/src/plugins/qmldesigner/components/propertyeditor/aligndistribute.cpp index f2cef3ead30..9a413597b54 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/aligndistribute.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/aligndistribute.cpp @@ -29,6 +29,7 @@ #include #include +#include #include #include @@ -466,7 +467,7 @@ void AlignDistribute::distributeObjects(Target target, AlignTo alignTo, const QS currentPosition = position.y(); position.ry() += equidistant; } - modelNode.setAuxiliaryData("tmp", + modelNode.setAuxiliaryData(tmpProperty, qRound(currentPosition - distributePosition(target, qmlItemNode))); } @@ -482,7 +483,7 @@ void AlignDistribute::distributeObjects(Target target, AlignTo alignTo, const QS const auto keyObjectModelNode = view->modelNodeForId(keyObject); const QmlItemNode keyObjectQmlItemNode(keyObjectModelNode); const auto scenePosition = keyObjectQmlItemNode.instanceScenePosition(); - keyObjectModelNode.setAuxiliaryData("tmp", + keyObjectModelNode.setAuxiliaryData(tmpProperty, (getDimension(target) == Dimension::X ? scenePosition.x() : scenePosition.y())); @@ -513,9 +514,9 @@ void AlignDistribute::distributeObjects(Target target, AlignTo alignTo, const QS } } qmlItemNode.setVariantProperty(propertyName, - modelNode.auxiliaryData("tmp").toReal() + modelNode.auxiliaryDataWithDefault(tmpProperty).toReal() - parentPosition); - modelNode.removeAuxiliaryData("tmp"); + modelNode.removeAuxiliaryData(tmpProperty); } } }); @@ -601,7 +602,7 @@ void AlignDistribute::distributeSpacing(Dimension dimension, currentPosition = position.y(); position.ry() += height(qmlItemNode) + equidistant; } - modelNode.setAuxiliaryData("tmp", qRound(currentPosition)); + modelNode.setAuxiliaryData(AuxiliaryDataType::Temporary, "tmp", qRound(currentPosition)); } } @@ -615,7 +616,7 @@ void AlignDistribute::distributeSpacing(Dimension dimension, const auto keyObjectModelNode = view->modelNodeForId(keyObject); const QmlItemNode keyObjectQmlItemNode(keyObjectModelNode); const auto scenePosition = keyObjectQmlItemNode.instanceScenePosition(); - keyObjectModelNode.setAuxiliaryData("tmp", + keyObjectModelNode.setAuxiliaryData(tmpProperty, (dimension == Dimension::X ? scenePosition.x() : scenePosition.y())); selectedNodes.append(keyObjectModelNode); @@ -646,8 +647,9 @@ void AlignDistribute::distributeSpacing(Dimension dimension, } } qmlItemNode.setVariantProperty(propertyName, - modelNode.auxiliaryData("tmp").toReal() - parentPos); - modelNode.removeAuxiliaryData("tmp"); + modelNode.auxiliaryDataWithDefault(tmpProperty).toReal() + - parentPos); + modelNode.removeAuxiliaryData(tmpProperty); } } }); diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp index c336d02314e..2e43c1107e4 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp @@ -28,22 +28,23 @@ #include "propertyeditortransaction.h" #include "propertyeditorvalue.h" #include "propertymetainfo.h" -#include -#include -#include -#include +#include +#include #include #include -#include +#include +#include +#include +#include #include #include -#include -#include #include #include +#include +#include #include #include @@ -54,6 +55,8 @@ #include +#include + static Q_LOGGING_CATEGORY(propertyEditorBenchmark, "qtc.propertyeditor.load", QtWarningMsg) static QmlJS::SimpleReaderNode::Ptr s_templateConfiguration = QmlJS::SimpleReaderNode::Ptr(); @@ -137,74 +140,22 @@ void PropertyEditorQmlBackend::setupPropertyEditorValue(const PropertyName &name valueObject->setValue(QVariant(QLatin1String("#000000"))); else valueObject->setValue(QVariant(1)); - } - -PropertyName auxNamePostFix(const PropertyName &propertyName) +namespace { +PropertyName auxNamePostFix(Utils::SmallStringView propertyName) { - return propertyName + "__AUX"; + return PropertyName(propertyName) + "__AUX"; } QVariant properDefaultAuxiliaryProperties(const QmlObjectNode &qmlObjectNode, - const PropertyName &propertyName) + AuxiliaryDataKeyDefaultValue key) { const ModelNode node = qmlObjectNode.modelNode(); - const PropertyName auxName = propertyName; - if (node.hasAuxiliaryData(auxName)) - return node.auxiliaryData(auxName); - if (propertyName == "transitionColor") - return QColor(Qt::red); - if (propertyName == "areaColor") - return QColor(Qt::red); - if (propertyName == "blockColor") - return QColor(Qt::red); - if (propertyName == "areaFillColor") - return QColor(Qt::transparent); - else if (propertyName == "color") - return QColor(Qt::red); - else if (propertyName == "fillColor") - return QColor(Qt::transparent); - else if (propertyName == "width") - return 4; - else if (propertyName == "dash") - return false; - else if (propertyName == "inOffset") - return 0; - else if (propertyName == "outOffset") - return 0; - else if (propertyName == "breakPoint") - return 50; - else if (propertyName == "transitionType") - return 0; - else if (propertyName == "type") - return 0; - else if (propertyName == "transitionRadius") - return 8; - else if (propertyName == "radius") - return 8; - else if (propertyName == "transitionBezier") - return 50; - else if (propertyName == "bezier") - return 50; - else if (propertyName == "labelPosition") - return 50.0; - else if (propertyName == "labelFlipSide") - return false; - else if (propertyName == "customId") - return QString(); - else if (propertyName == "joinConnection") - return false; - else if (propertyName == "blockSize") - return 200; - else if (propertyName == "blockRadius") - return 18; - else if (propertyName == "showDialogLabel") - return false; - else if (propertyName == "dialogLabelPosition") - return Qt::TopRightCorner; + if (auto data = node.auxiliaryData(key)) + return *data; - return {}; + return getDefaultValueAsQVariant(key); } QVariant properDefaultLayoutAttachedProperties(const QmlObjectNode &qmlObjectNode, @@ -241,6 +192,7 @@ QVariant properDefaultLayoutAttachedProperties(const QmlObjectNode &qmlObjectNod return QVariant(); } +} // namespace void PropertyEditorQmlBackend::setupLayoutAttachedProperties(const QmlObjectNode &qmlObjectNode, PropertyEditorView *propertyEditor) { @@ -260,32 +212,74 @@ void PropertyEditorQmlBackend::setupLayoutAttachedProperties(const QmlObjectNode void PropertyEditorQmlBackend::setupAuxiliaryProperties(const QmlObjectNode &qmlObjectNode, PropertyEditorView *propertyEditor) { - const QmlItemNode itemNode(qmlObjectNode); - PropertyNameList propertyNames; + auto createProperty = [&](auto &&...properties) { + (createPropertyEditorValue(qmlObjectNode, + auxNamePostFix(properties.name), + properDefaultAuxiliaryProperties(qmlObjectNode, properties), + propertyEditor), + ...); + }; - propertyNames.append("customId"); + constexpr auto commonProperties = std::make_tuple(customIdProperty); if (itemNode.isFlowTransition()) { - propertyNames.append({"color", "width", "inOffset", "outOffset", "dash", "breakPoint", "type", "radius", "bezier", "labelPosition", "labelFlipSide"}); + constexpr auto properties = std::make_tuple(colorProperty, + widthProperty, + inOffsetProperty, + dashProperty, + breakPointProperty, + typeProperty, + radiusProperty, + bezierProperty, + labelPositionProperty, + labelFlipSideProperty); + std::apply(createProperty, std::tuple_cat(commonProperties, properties)); } else if (itemNode.isFlowItem()) { - propertyNames.append({"color", "width", "inOffset", "outOffset", "joinConnection"}); + constexpr auto properties = std::make_tuple(colorProperty, + widthProperty, + inOffsetProperty, + outOffsetProperty, + joinConnectionProperty); + std::apply(createProperty, std::tuple_cat(commonProperties, properties)); } else if (itemNode.isFlowActionArea()) { - propertyNames.append({"color", "width", "fillColor", "outOffset", "dash"}); + constexpr auto properties = std::make_tuple(colorProperty, + widthProperty, + fillColorProperty, + outOffsetProperty, + dashProperty); + std::apply(createProperty, std::tuple_cat(commonProperties, properties)); } else if (itemNode.isFlowDecision()) { - propertyNames.append({"color", "width", "fillColor", "dash", "blockSize", "blockRadius", "showDialogLabel", "dialogLabelPosition"}); + constexpr auto properties = std::make_tuple(colorProperty, + widthProperty, + fillColorProperty, + dashProperty, + blockSizeProperty, + blockRadiusProperty, + showDialogLabelProperty, + dialogLabelPositionProperty); + std::apply(createProperty, std::tuple_cat(commonProperties, properties)); } else if (itemNode.isFlowWildcard()) { - propertyNames.append({"color", "width", "fillColor", "dash", "blockSize", "blockRadius"}); + constexpr auto properties = std::make_tuple(colorProperty, + widthProperty, + fillColorProperty, + dashProperty, + blockSizeProperty, + blockRadiusProperty); + std::apply(createProperty, std::tuple_cat(commonProperties, properties)); } else if (itemNode.isFlowView()) { - propertyNames.append({"transitionColor", "areaColor", "areaFillColor", "blockColor", "transitionType", "transitionRadius", "transitionBezier"}); + constexpr auto properties = std::make_tuple(transitionColorProperty, + areaColorProperty, + areaFillColorProperty, + blockColorProperty, + transitionTypeProperty, + transitionRadiusProperty, + transitionBezierProperty); + std::apply(createProperty, std::tuple_cat(commonProperties, properties)); + } else { + std::apply(createProperty, commonProperties); } - - for (const PropertyName &propertyName : propertyNames) { - createPropertyEditorValue(qmlObjectNode, auxNamePostFix(propertyName), - properDefaultAuxiliaryProperties(qmlObjectNode, propertyName), propertyEditor); - } - } void PropertyEditorQmlBackend::createPropertyEditorValue(const QmlObjectNode &qmlObjectNode, @@ -906,10 +900,11 @@ void PropertyEditorQmlBackend::setValueforLayoutAttachedProperties(const QmlObje } } -void PropertyEditorQmlBackend::setValueforAuxiliaryProperties(const QmlObjectNode &qmlObjectNode, const PropertyName &name) +void PropertyEditorQmlBackend::setValueforAuxiliaryProperties(const QmlObjectNode &qmlObjectNode, + AuxiliaryDataKeyView key) { - const PropertyName propertyName = auxNamePostFix(name); - setValue(qmlObjectNode, propertyName, qmlObjectNode.modelNode().auxiliaryData(name)); + const PropertyName propertyName = auxNamePostFix(key.name); + setValue(qmlObjectNode, propertyName, qmlObjectNode.modelNode().auxiliaryDataWithDefault(key)); } QUrl PropertyEditorQmlBackend::getQmlUrlForMetaInfo(const NodeMetaInfo &metaInfo, TypeName &className) diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.h b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.h index 7abfc550d87..e71382ecebd 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.h +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.h @@ -80,7 +80,7 @@ public: void emitSelectionChanged(); void setValueforLayoutAttachedProperties(const QmlObjectNode &qmlObjectNode, const PropertyName &name); - void setValueforAuxiliaryProperties(const QmlObjectNode &qmlObjectNode, const PropertyName &name); + void setValueforAuxiliaryProperties(const QmlObjectNode &qmlObjectNode, AuxiliaryDataKeyView key); void setupLayoutAttachedProperties(const QmlObjectNode &qmlObjectNode, PropertyEditorView *propertyEditor); void setupAuxiliaryProperties(const QmlObjectNode &qmlObjectNode, PropertyEditorView *propertyEditor); diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp index 6d00c56d3ac..c9183c467c0 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp @@ -556,11 +556,11 @@ void PropertyEditorView::commitAuxValueToModel(const PropertyName &propertyName, try { if (value.isValid()) { for (const ModelNode &node : m_selectedNode.view()->selectedModelNodes()) { - node.setAuxiliaryData(name, value); + node.setAuxiliaryData(AuxiliaryDataType::Document, name, value); } } else { for (const ModelNode &node : m_selectedNode.view()->selectedModelNodes()) { - node.removeAuxiliaryData(name); + node.removeAuxiliaryData(AuxiliaryDataType::Document, name); } } } @@ -721,7 +721,9 @@ void PropertyEditorView::bindingPropertiesChanged(const QList& } } -void PropertyEditorView::auxiliaryDataChanged(const ModelNode &node, const PropertyName &name, const QVariant &) +void PropertyEditorView::auxiliaryDataChanged(const ModelNode &node, + [[maybe_unused]] AuxiliaryDataKeyView key, + const QVariant &) { if (noValidSelection()) @@ -730,8 +732,7 @@ void PropertyEditorView::auxiliaryDataChanged(const ModelNode &node, const Prope if (!node.isSelected()) return; - m_qmlBackEndForCurrentType->setValueforAuxiliaryProperties(m_selectedNode, name); - + m_qmlBackEndForCurrentType->setValueforAuxiliaryProperties(m_selectedNode, key); } void PropertyEditorView::instanceInformationsChanged(const QMultiHash &informationChangedHash) diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.h b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.h index 09d6dc7f419..867ae6753cb 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.h +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.h @@ -69,7 +69,9 @@ public: void variantPropertiesChanged(const QList& propertyList, PropertyChangeFlags propertyChange) override; void bindingPropertiesChanged(const QList& propertyList, PropertyChangeFlags propertyChange) override; - void auxiliaryDataChanged(const ModelNode &node, const PropertyName &name, const QVariant &data) override; + void auxiliaryDataChanged(const ModelNode &node, + AuxiliaryDataKeyView key, + const QVariant &data) override; void instanceInformationsChanged(const QMultiHash &informationChangedHash) override; diff --git a/src/plugins/qmldesigner/components/propertyeditor/qmlanchorbindingproxy.cpp b/src/plugins/qmldesigner/components/propertyeditor/qmlanchorbindingproxy.cpp index fd16a282920..b67adcef292 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/qmlanchorbindingproxy.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/qmlanchorbindingproxy.cpp @@ -25,33 +25,44 @@ #include "qmlanchorbindingproxy.h" -#include #include -#include +#include #include -#include #include +#include +#include +#include - -#include #include +#include namespace QmlDesigner { class ModelNode; class NodeState; -const PropertyName auxDataString("anchors_"); +namespace { +const Utils::SmallString auxDataString("anchors_"); + +Utils::SmallString auxPropertyString(Utils::SmallStringView name) +{ + return auxDataString + name; +} +} // namespace static inline void backupPropertyAndRemove(const ModelNode &node, const PropertyName &propertyName) { if (node.hasVariantProperty(propertyName)) { - node.setAuxiliaryData(auxDataString + propertyName, node.variantProperty(propertyName).value()); + node.setAuxiliaryData(AuxiliaryDataType::Document, + auxPropertyString(propertyName), + node.variantProperty(propertyName).value()); node.removeProperty(propertyName); } if (node.hasBindingProperty(propertyName)) { - node.setAuxiliaryData(auxDataString + propertyName, QmlItemNode(node).instanceValue(propertyName)); + node.setAuxiliaryData(AuxiliaryDataType::Document, + auxPropertyString(propertyName), + QmlItemNode(node).instanceValue(propertyName)); node.removeProperty(propertyName); } } @@ -59,8 +70,8 @@ static inline void backupPropertyAndRemove(const ModelNode &node, const Property static inline void restoreProperty(const ModelNode &node, const PropertyName &propertyName) { - if (node.hasAuxiliaryData(auxDataString + propertyName)) - node.variantProperty(propertyName).setValue(node.auxiliaryData(auxDataString + propertyName)); + if (auto value = node.auxiliaryData(AuxiliaryDataType::Document, auxPropertyString(propertyName))) + node.variantProperty(propertyName).setValue(*value); } namespace Internal { diff --git a/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp b/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp index b12810c1d52..f0044450e6d 100644 --- a/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp +++ b/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp @@ -223,7 +223,9 @@ void TextEditorView::changeToCustomTool() { } -void TextEditorView::auxiliaryDataChanged(const ModelNode &/*node*/, const PropertyName &/*name*/, const QVariant &/*data*/) +void TextEditorView::auxiliaryDataChanged(const ModelNode & /*node*/, + AuxiliaryDataKeyView /*type*/, + const QVariant & /*data*/) { } diff --git a/src/plugins/qmldesigner/components/texteditor/texteditorview.h b/src/plugins/qmldesigner/components/texteditor/texteditorview.h index 345af0052bc..96932fa73f5 100644 --- a/src/plugins/qmldesigner/components/texteditor/texteditorview.h +++ b/src/plugins/qmldesigner/components/texteditor/texteditorview.h @@ -83,7 +83,9 @@ public: void changeToTransformTools(); void changeToCustomTool(); - void auxiliaryDataChanged(const ModelNode &node, const PropertyName &name, const QVariant &data) override; + void auxiliaryDataChanged(const ModelNode &node, + AuxiliaryDataKeyView key, + const QVariant &data) override; void instancesCompleted(const QVector &completedNodeList) override; void instanceInformationsChanged(const QMultiHash &informationChangeHash) override; diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelineactions.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelineactions.cpp index cf938a73d5d..bfd5ea81cc0 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelineactions.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelineactions.cpp @@ -28,6 +28,7 @@ #include "timelineutils.h" #include "timelineview.h" +#include #include #include #include @@ -148,10 +149,10 @@ void TimelineActions::copyKeyframes(const QList &keyframes) BindingProperty bp = property.toBindingProperty(); ModelNode bpNode = bp.resolveToModelNode(); if (bpNode.isValid()) - node.setAuxiliaryData(name, bpNode.id()); + node.setAuxiliaryData(AuxiliaryDataType::Document, name, bpNode.id()); } else if (property.isVariantProperty()) { VariantProperty vp = property.toVariantProperty(); - node.setAuxiliaryData(name, vp.value()); + node.setAuxiliaryData(AuxiliaryDataType::Document, name, vp.value()); } } @@ -187,14 +188,14 @@ QmlTimelineKeyframeGroup getFrameGroup(const ModelNode &node, AbstractView *timelineView, const QmlTimeline &timeline) { - QVariant targetId = node.auxiliaryData("target"); - QVariant property = node.auxiliaryData("property"); + auto targetId = node.auxiliaryData(targetProperty); + auto property = node.auxiliaryData(propertyProperty); - if (targetId.isValid() && property.isValid()) { - ModelNode targetNode = timelineView->modelNodeForId(targetId.toString()); + if (targetId && property) { + ModelNode targetNode = timelineView->modelNodeForId(targetId->toString()); if (targetNode.isValid()) { for (QmlTimelineKeyframeGroup frameGrp : timeline.keyframeGroupsForTarget(targetNode)) { - if (frameGrp.propertyName() == property.toByteArray()) + if (frameGrp.propertyName() == property->toByteArray()) return frameGrp; } } diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelineconstants.h b/src/plugins/qmldesigner/components/timelineeditor/timelineconstants.h index 54119db9fd4..e6dcce0821b 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelineconstants.h +++ b/src/plugins/qmldesigner/components/timelineeditor/timelineconstants.h @@ -72,8 +72,6 @@ const char C_CURVE_EDITOR[] = "QmlDesigner.CurveEditor"; const char C_ZOOM_IN[] = "QmlDesigner.ZoomIn"; const char C_ZOOM_OUT[] = "QmlDesigner.ZoomOut"; -const char C_BAR_ITEM_OVERRIDE[] = "Timeline.OverrideColor"; - const int keyFrameSize = 17; const int keyFrameMargin = 2; } // namespace TimelineConstants diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.cpp index 8511ebcfaf6..dbfd64fe259 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinegraphicsscene.cpp @@ -37,6 +37,7 @@ #include "timelineview.h" #include "timelinewidget.h" +#include #include #include #include @@ -238,7 +239,7 @@ void TimelineGraphicsScene::setCurrentFrame(int frame) QmlTimeline timeline(timelineModelNode()); if (timeline.isValid()) { - timeline.modelNode().setAuxiliaryData("currentFrame@NodeInstance", frame); + timeline.modelNode().setAuxiliaryData(currentFrameProperty, frame); m_currentFrameIndicator->setPosition(frame); } else { m_currentFrameIndicator->setPosition(0); @@ -363,7 +364,7 @@ void TimelineGraphicsScene::setZoom(int scaleFactor, double pivot) if (timeline.isValid()) setCurrenFrame(timeline, - timeline.modelNode().auxiliaryData("currentFrame@NodeInstance").toReal()); + timeline.modelNode().auxiliaryDataWithDefault(currentFrameProperty).toReal()); invalidateScrollbar(); update(); @@ -375,7 +376,7 @@ void TimelineGraphicsScene::commitCurrentFrame(qreal frame) if (timeline.isValid()) { frame = setCurrenFrame(timeline, qRound(frame)); - timeline.modelNode().setAuxiliaryData("currentFrame@NodeInstance", qRound(frame)); + timeline.modelNode().setAuxiliaryData(currentFrameProperty, qRound(frame)); invalidateCurrentValues(); } } diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinepropertyitem.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelinepropertyitem.cpp index 65d567a7b3b..62c94f386f8 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinepropertyitem.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinepropertyitem.cpp @@ -34,6 +34,7 @@ #include "timelinetoolbar.h" #include "timelinetoolbutton.h" +#include #include #include #include @@ -342,7 +343,7 @@ void TimelinePropertyItem::changePropertyValue(const QVariant &value) QmlTimelineKeyframeGroup frames = m_frames; auto deferredFunc = [frames, value, timeline]() { auto constFrames = frames; - qreal frame = timeline.modelNode().auxiliaryData("currentFrame@NodeInstance").toReal(); + qreal frame = timeline.modelNode().auxiliaryDataWithDefault(currentFrameProperty).toReal(); try { constFrames.setValue(value, frame); } catch (const RewritingException &e) { diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinesectionitem.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelinesectionitem.cpp index bf23f201259..e3b3e1c13d3 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinesectionitem.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinesectionitem.cpp @@ -484,7 +484,7 @@ void TimelineSectionItem::invalidateFrames() bool TimelineSectionItem::collapsed() const { return m_targetNode.isValid() - && (!m_targetNode.hasAuxiliaryData("timeline_expanded") || m_targetNode.locked()); + && (!m_targetNode.hasAuxiliaryData(timelineExpandedProperty) || m_targetNode.locked()); } void TimelineSectionItem::createPropertyItems() @@ -509,9 +509,9 @@ void TimelineSectionItem::toggleCollapsed() QTC_ASSERT(m_targetNode.isValid(), return ); if (collapsed()) - m_targetNode.setAuxiliaryData("timeline_expanded", true); + m_targetNode.setAuxiliaryData(timelineExpandedProperty, true); else - m_targetNode.removeAuxiliaryData("timeline_expanded"); + m_targetNode.removeAuxiliaryData(timelineExpandedProperty); invalidateHeight(); } @@ -1002,6 +1002,11 @@ void TimelineBarItem::scrollOffsetChanged() sectionItem()->invalidateBar(); } +namespace { +constexpr AuxiliaryDataKeyView timelineOverrideColorProperty{AuxiliaryDataType::Document, + "Timeline.OverrideColor"}; +} // namespace + void TimelineBarItem::paint(QPainter *painter, [[maybe_unused]] const QStyleOptionGraphicsItem *option, [[maybe_unused]] QWidget *widget) @@ -1012,7 +1017,8 @@ void TimelineBarItem::paint(QPainter *painter, ModelNode target = sectionItem()->targetNode(); if (target.isValid()) { - QColor overrideColor = target.auxiliaryData(TimelineConstants::C_BAR_ITEM_OVERRIDE).value(); + QColor overrideColor = target.auxiliaryDataWithDefault(timelineOverrideColorProperty) + .value(); if (overrideColor.isValid()) { brushColorSelected = overrideColor; brushColor = brushColorSelected.darker(120); @@ -1082,10 +1088,11 @@ void TimelineBarItem::contextMenuEvent(QGraphicsSceneContextMenuEvent* event) auto setColor = [this] () { ModelNode target = sectionItem()->targetNode(); if (target.isValid()) { - QColor current = target.auxiliaryData(TimelineConstants::C_BAR_ITEM_OVERRIDE).value(); + QColor current = target.auxiliaryDataWithDefault(timelineOverrideColorProperty) + .value(); QColor color = QColorDialog::getColor(current, nullptr); if (color.isValid()) - target.setAuxiliaryData(TimelineConstants::C_BAR_ITEM_OVERRIDE, color); + target.setAuxiliaryData(timelineOverrideColorProperty, color); } }; @@ -1095,7 +1102,7 @@ void TimelineBarItem::contextMenuEvent(QGraphicsSceneContextMenuEvent* event) auto reset = [this]() { ModelNode target = sectionItem()->targetNode(); if (target.isValid()) - target.removeAuxiliaryData(TimelineConstants::C_BAR_ITEM_OVERRIDE); + target.removeAuxiliaryData(timelineOverrideColorProperty); }; QObject::connect(resetColor, &QAction::triggered, reset); diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelineview.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelineview.cpp index c85d5588c58..affaff3b06a 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelineview.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelineview.cpp @@ -35,6 +35,7 @@ #include "timelinesettingsdialog.h" #include "timelinetoolbar.h" +#include #include #include #include @@ -99,6 +100,10 @@ void TimelineView::modelAboutToBeDetached(Model *model) void TimelineView::nodeCreated(const ModelNode & /*createdNode*/) {} +namespace { +constexpr AuxiliaryDataKeyView removedProperty{AuxiliaryDataType::Temporary, "removed"}; +} + void TimelineView::nodeAboutToBeRemoved(const ModelNode &removedNode) { if (removedNode.isValid()) { @@ -109,7 +114,7 @@ void TimelineView::nodeAboutToBeRemoved(const ModelNode &removedNode) toolBar->removeTimeline(QmlTimeline(removedNode)); QString currentId = toolBar->currentTimelineId(); - removedNode.setAuxiliaryData("removed@Internal", true); + removedNode.setAuxiliaryData(removedProperty, true); if (currentId.isEmpty()) m_timelineWidget->graphicsScene()->clearTimeline(); @@ -239,12 +244,12 @@ void TimelineView::selectedNodesChanged(const QList & /*selectedNodeL } void TimelineView::auxiliaryDataChanged(const ModelNode &modelNode, - const PropertyName &name, + AuxiliaryDataKeyView key, const QVariant &data) { - if (name == QmlDesigner::lockedProperty && data.toBool() && modelNode.isValid()) { + if (key == lockedProperty && data.toBool() && modelNode.isValid()) { for (const auto &node : modelNode.allSubModelNodesAndThisNode()) { - if (node.hasAuxiliaryData("timeline_expanded")) + if (node.hasAuxiliaryData(timelineExpandedProperty)) m_timelineWidget->graphicsScene()->invalidateHeightForTarget(node); } } @@ -470,7 +475,7 @@ void TimelineView::customNotification(const AbstractView * /*view*/, if (identifier == QStringLiteral("reset QmlPuppet")) { QmlTimeline timeline = widget()->graphicsScene()->currentTimeline(); if (timeline.isValid()) - timeline.modelNode().removeAuxiliaryData("currentFrame@NodeInstance"); + timeline.modelNode().removeAuxiliaryData(currentFrameProperty); } } @@ -494,7 +499,7 @@ QList TimelineView::getTimelines() const for (const ModelNode &modelNode : allModelNodes()) { if (QmlTimeline::isValidQmlTimeline(modelNode) - && !modelNode.hasAuxiliaryData("removed@Internal")) { + && !modelNode.hasAuxiliaryData(removedProperty)) { timelines.append(modelNode); } } diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelineview.h b/src/plugins/qmldesigner/components/timelineeditor/timelineview.h index 13efe40ba3e..2f5c057fcad 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelineview.h +++ b/src/plugins/qmldesigner/components/timelineeditor/timelineview.h @@ -63,7 +63,7 @@ public: void selectedNodesChanged(const QList &selectedNodeList, const QList &lastSelectedNodeList) override; void auxiliaryDataChanged(const ModelNode &node, - const PropertyName &name, + AuxiliaryDataKeyView key, const QVariant &data) override; void propertiesAboutToBeRemoved(const QList &propertyList) override; diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinewidget.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelinewidget.cpp index f4124610177..4c7605b87e6 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinewidget.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinewidget.cpp @@ -36,6 +36,7 @@ #include "timelineview.h" #include "navigation2d.h" +#include #include #include #include @@ -108,8 +109,8 @@ static qreal getcurrentFrame(const QmlTimeline &timeline) if (!timeline.isValid()) return 0; - if (timeline.modelNode().hasAuxiliaryData("currentFrame@NodeInstance")) - return timeline.modelNode().auxiliaryData("currentFrame@NodeInstance").toReal(); + if (auto data = timeline.modelNode().auxiliaryData(currentFrameProperty)) + return data->toReal(); return timeline.currentKeyframe(); } diff --git a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorgraphicslayout.cpp b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorgraphicslayout.cpp index 5abff4d6116..399aa8d2d2c 100644 --- a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorgraphicslayout.cpp +++ b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorgraphicslayout.cpp @@ -31,6 +31,8 @@ #include "timelineview.h" #include "transitioneditorsectionitem.h" +#include + #include #include @@ -114,8 +116,10 @@ void TransitionEditorGraphicsLayout::setTransition(const ModelNode &transition) m_rulerItem->setParentItem(this); qreal duration = 2000; - if (transition.isValid() && transition.hasAuxiliaryData("transitionDuration")) - duration = transition.auxiliaryData("transitionDuration").toDouble(); + if (transition.isValid()) { + if (auto data = transition.auxiliaryData(transitionDurationProperty)) + duration = data->toDouble(); + } setDuration(duration); m_layout->addItem(m_rulerItem); diff --git a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorgraphicsscene.cpp b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorgraphicsscene.cpp index a78ad3c7502..3fa55b9c96f 100644 --- a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorgraphicsscene.cpp +++ b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorgraphicsscene.cpp @@ -41,6 +41,7 @@ #include "timelinesectionitem.h" #include "timelineutils.h" +#include #include #include #include @@ -148,7 +149,7 @@ void TransitionEditorGraphicsScene::invalidateLayout() void TransitionEditorGraphicsScene::setDuration(int duration) { if (m_transition.isValid()) - m_transition.setAuxiliaryData("transitionDuration", duration); + m_transition.setAuxiliaryData(transitionDurationProperty, duration); m_layout->setDuration(duration); qreal scaling = m_layout->rulerScaling(); setZoom(scaling); diff --git a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorsectionitem.cpp b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorsectionitem.cpp index 1d40bd4a9d7..014d86dedee 100644 --- a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorsectionitem.cpp +++ b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorsectionitem.cpp @@ -508,7 +508,7 @@ void TransitionEditorSectionItem::invalidateProperties() bool TransitionEditorSectionItem::collapsed() const { return m_targetNode.isValid() - && (!m_targetNode.hasAuxiliaryData("transition_expanded") || m_targetNode.locked()); + && (!m_targetNode.hasAuxiliaryData(transitionExpandedPropery) || m_targetNode.locked()); } qreal TransitionEditorSectionItem::rulerWidth() const @@ -521,9 +521,9 @@ void TransitionEditorSectionItem::toggleCollapsed() QTC_ASSERT(m_targetNode.isValid(), return ); if (collapsed()) - m_targetNode.setAuxiliaryData("transition_expanded", true); + m_targetNode.setAuxiliaryData(transitionExpandedPropery, true); else - m_targetNode.removeAuxiliaryData("transition_expanded"); + m_targetNode.removeAuxiliaryData(transitionExpandedPropery); invalidateHeight(); } diff --git a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorview.cpp b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorview.cpp index bfe7ae0cd3c..30bb635eafb 100644 --- a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorview.cpp +++ b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorview.cpp @@ -31,6 +31,7 @@ #include "transitioneditorgraphicsscene.h" #include "transitioneditorsettingsdialog.h" +#include #include #include #include @@ -147,12 +148,12 @@ void TransitionEditorView::selectedNodesChanged(const QList & /*selec } void TransitionEditorView::auxiliaryDataChanged(const ModelNode &modelNode, - const PropertyName &name, + AuxiliaryDataKeyView key, const QVariant &data) { - if (name == QmlDesigner::lockedProperty && data.toBool() && modelNode.isValid()) { + if (key == lockedProperty && data.toBool() && modelNode.isValid()) { for (const auto &node : modelNode.allSubModelNodesAndThisNode()) { - if (node.hasAuxiliaryData("transition_expanded")) + if (node.hasAuxiliaryData(transitionExpandedPropery)) m_transitionEditorWidget->graphicsScene()->invalidateHeightForTarget(node); } } @@ -265,7 +266,7 @@ ModelNode TransitionEditorView::addNewTransition() "to", "*", }}); - transition.setAuxiliaryData("transitionDuration", 2000); + transition.setAuxiliaryData(transitionDurationProperty, 2000); transition.validId(); root.nodeListProperty("transitions").reparentHere(transition); diff --git a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorview.h b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorview.h index 5a60d05a202..32cd64d0eae 100644 --- a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorview.h +++ b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorview.h @@ -61,7 +61,7 @@ public: void selectedNodesChanged(const QList &selectedNodeList, const QList &lastSelectedNodeList) override; void auxiliaryDataChanged(const ModelNode &node, - const PropertyName &name, + AuxiliaryDataKeyView key, const QVariant &data) override; void propertiesAboutToBeRemoved(const QList &propertyList) override; diff --git a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorwidget.cpp b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorwidget.cpp index 68d40776c17..54ada52119b 100644 --- a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorwidget.cpp +++ b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorwidget.cpp @@ -35,6 +35,7 @@ #include #include +#include #include #include #include @@ -363,9 +364,10 @@ void TransitionEditorWidget::init(int zoom) m_toolbar->setCurrentTransition(transition); qreal duration = 2000; - if (transition.isValid() && transition.hasAuxiliaryData("transitionDuration")) - duration = transition.auxiliaryData("transitionDuration").toDouble(); - + if (transition.isValid()) { + if (auto data = transition.auxiliaryData(transitionDurationProperty)) + duration = data->toDouble(); + } m_toolbar->setDuration(duration); m_graphicsScene->setZoom(zoom); diff --git a/src/plugins/qmldesigner/designercore/imagecache/imagecachecollector.cpp b/src/plugins/qmldesigner/designercore/imagecache/imagecachecollector.cpp index 0a225d1ab09..b1ecdca4172 100644 --- a/src/plugins/qmldesigner/designercore/imagecache/imagecachecollector.cpp +++ b/src/plugins/qmldesigner/designercore/imagecache/imagecachecollector.cpp @@ -109,7 +109,9 @@ void ImageCacheCollector::start(Utils::SmallStringView name, if (is3DRoot) { if (auto libIcon = Utils::get_if(&auxiliaryData)) - rewriterView.rootModelNode().setAuxiliaryData("isLibraryIcon@NodeInstance", libIcon->enable); + rewriterView.rootModelNode().setAuxiliaryData(AuxiliaryDataType::NodeInstance, + "isLibraryIcon", + libIcon->enable); } ModelNode stateNode = rewriterView.modelNodeForId(QString{state}); diff --git a/src/plugins/qmldesigner/designercore/include/abstractview.h b/src/plugins/qmldesigner/designercore/include/abstractview.h index 518498aefb9..d6464b45355 100644 --- a/src/plugins/qmldesigner/designercore/include/abstractview.h +++ b/src/plugins/qmldesigner/designercore/include/abstractview.h @@ -116,7 +116,7 @@ public: int majorVersion, int minorVersion, const PropertyListType &propertyList = PropertyListType(), - const PropertyListType &auxPropertyList = PropertyListType(), + const AuxiliaryDatas &auxPropertyList = {}, const QString &nodeSource = {}, ModelNode::NodeSourceType nodeSourceType = ModelNode::NodeWithoutSource, const QString &behaviorPropertyName = {}); @@ -220,7 +220,9 @@ public: virtual void possibleImportsChanged(const QList &possibleImports); virtual void usedImportsChanged(const QList &usedImports); - virtual void auxiliaryDataChanged(const ModelNode &node, const PropertyName &name, const QVariant &data); + virtual void auxiliaryDataChanged(const ModelNode &node, + AuxiliaryDataKeyView type, + const QVariant &data); virtual void customNotification(const AbstractView *view, const QString &identifier, const QList &nodeList, const QList &data); diff --git a/src/plugins/qmldesigner/designercore/include/annotation.h b/src/plugins/qmldesigner/designercore/include/annotation.h index 548a3c52aa7..f49aed5f15a 100644 --- a/src/plugins/qmldesigner/designercore/include/annotation.h +++ b/src/plugins/qmldesigner/designercore/include/annotation.h @@ -35,11 +35,6 @@ namespace QmlDesigner { -static const PropertyName customIdProperty = {("customId")}; -static const PropertyName annotationProperty = {("annotation")}; -static const PropertyName globalAnnotationProperty = {("globalAnnotation")}; -static const PropertyName globalAnnotationStatus = {("globalAnnotationStatus")}; - class QMLDESIGNERCORE_EXPORT GlobalAnnotationStatus { public: @@ -118,6 +113,7 @@ class QMLDESIGNERCORE_EXPORT Annotation { public: Annotation(); + Annotation(const QString &string) { fromQString(string); } ~Annotation() = default; QVector comments() const; diff --git a/src/plugins/qmldesigner/designercore/include/auxiliarydata.h b/src/plugins/qmldesigner/designercore/include/auxiliarydata.h new file mode 100644 index 00000000000..7c45d547600 --- /dev/null +++ b/src/plugins/qmldesigner/designercore/include/auxiliarydata.h @@ -0,0 +1,79 @@ +/**************************************************************************** +** +** Copyright (C) 2022 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +#include + +#include + +#include + +namespace QmlDesigner { + +template +class BasicAuxiliaryDataKey +{ +public: + constexpr BasicAuxiliaryDataKey() = default; + constexpr BasicAuxiliaryDataKey(AuxiliaryDataType type, NameType name) + : type{type} + , name{std::move(name)} + {} + + template>> + constexpr explicit BasicAuxiliaryDataKey(const BasicAuxiliaryDataKey &other) + : type{other.type} + , name{NameType{other.name}} + {} + +public: + AuxiliaryDataType type = AuxiliaryDataType::None; + NameType name; +}; + +template +bool operator<(const BasicAuxiliaryDataKey &first, const BasicAuxiliaryDataKey &second) +{ + return std::tie(first.type, first.name) < std::tie(second.type, second.name); +} + +template +bool operator==(const BasicAuxiliaryDataKey &first, const BasicAuxiliaryDataKey &second) +{ + return first.type == second.type && first.name == second.name; +} + +template +bool operator!=(const BasicAuxiliaryDataKey &first, const BasicAuxiliaryDataKey &second) +{ + return !(first == second); +} + +using AuxiliaryDataKey = BasicAuxiliaryDataKey; +using AuxiliaryDataKeyView = BasicAuxiliaryDataKey; +using AuxiliaryDatas = std::vector>; +using AuxiliaryDatasForType = std::vector>; +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/include/auxiliarydataproperties.h b/src/plugins/qmldesigner/designercore/include/auxiliarydataproperties.h new file mode 100644 index 00000000000..54a470da2e7 --- /dev/null +++ b/src/plugins/qmldesigner/designercore/include/auxiliarydataproperties.h @@ -0,0 +1,151 @@ +/**************************************************************************** +** +** Copyright (C) 2022 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +#include +#include + +#include +#include + +#include + +namespace QmlDesigner { + +using PropertyValue = Utils::variant; + +inline QVariant toQVariant(const PropertyValue &variant) +{ + return Utils::visit([](const auto &value) { return QVariant::fromValue(value); }, variant); +} + +class AuxiliaryDataKeyDefaultValue : public AuxiliaryDataKeyView +{ +public: + constexpr AuxiliaryDataKeyDefaultValue() = default; + constexpr AuxiliaryDataKeyDefaultValue(AuxiliaryDataType type, + Utils::SmallStringView name, + PropertyValue defaultValue) + : AuxiliaryDataKeyView{type, name} + , defaultValue{std::move(defaultValue)} + {} + +public: + PropertyValue defaultValue; +}; + +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 breakPointProperty{AuxiliaryDataType::Document, + "breakPoint", + 50}; +inline constexpr AuxiliaryDataKeyDefaultValue bezierProperty{AuxiliaryDataType::Document, "bezier", 50}; +inline constexpr AuxiliaryDataKeyDefaultValue transitionBezierProperty{AuxiliaryDataType::Document, + "transitionBezier", + 50}; +inline constexpr AuxiliaryDataKeyDefaultValue typeProperty{AuxiliaryDataType::Document, "type", 0}; +inline constexpr AuxiliaryDataKeyDefaultValue transitionTypeProperty{AuxiliaryDataType::Document, + "transitionType", + 0}; +inline constexpr AuxiliaryDataKeyDefaultValue radiusProperty{AuxiliaryDataType::Document, "radius", 8}; +inline constexpr AuxiliaryDataKeyDefaultValue transitionRadiusProperty{AuxiliaryDataType::Document, + "transitionRadius", + 8}; +inline constexpr AuxiliaryDataKeyDefaultValue labelPositionProperty{AuxiliaryDataType::Document, + "labelPosition", + 50.0}; +inline constexpr AuxiliaryDataKeyDefaultValue labelFlipSideProperty{AuxiliaryDataType::Document, + "labelFlipSide", + false}; +inline constexpr AuxiliaryDataKeyDefaultValue inOffsetProperty{AuxiliaryDataType::Document, + "inOffset", + 0}; +inline constexpr AuxiliaryDataKeyDefaultValue outOffsetProperty{AuxiliaryDataType::Document, + "outOffset", + 0}; +inline constexpr AuxiliaryDataKeyDefaultValue blockSizeProperty{AuxiliaryDataType::Document, + "blockSize", + 200}; +inline constexpr AuxiliaryDataKeyDefaultValue blockRadiusProperty{AuxiliaryDataType::Document, + "blockRadius", + 18}; +inline constexpr AuxiliaryDataKeyDefaultValue blockColorProperty{AuxiliaryDataType::Document, + "blockColor", + QColor{255, 0, 0}}; +inline constexpr AuxiliaryDataKeyDefaultValue showDialogLabelProperty{AuxiliaryDataType::Document, + "showDialogLabel", + false}; +inline constexpr AuxiliaryDataKeyDefaultValue dialogLabelPositionProperty{AuxiliaryDataType::Document, + "dialogLabelPosition", + Qt::TopRightCorner}; +inline constexpr AuxiliaryDataKeyDefaultValue transitionColorProperty{AuxiliaryDataType::Document, + "transitionColor", + QColor{255, 0, 0}}; +inline constexpr AuxiliaryDataKeyDefaultValue joinConnectionProperty{AuxiliaryDataType::Document, + "joinConnection", + false}; +inline constexpr AuxiliaryDataKeyDefaultValue areaColorProperty{AuxiliaryDataType::Document, + "areaColor", + QColor{255, 0, 0}}; +inline constexpr AuxiliaryDataKeyDefaultValue colorProperty{AuxiliaryDataType::Document, + "color", + QColor{255, 0, 0}}; +inline constexpr AuxiliaryDataKeyDefaultValue dashProperty{AuxiliaryDataType::Document, "dash", false}; +inline constexpr AuxiliaryDataKeyDefaultValue areaFillColorProperty{AuxiliaryDataType::Document, + "areaFillColor", + QColor{0, 0, 0, 0}}; +inline constexpr AuxiliaryDataKeyDefaultValue fillColorProperty{AuxiliaryDataType::Document, + "fillColor", + QColor{0, 0, 0, 0}}; +inline constexpr AuxiliaryDataKeyView uuidProperty{AuxiliaryDataType::Document, "uuid"}; +inline constexpr AuxiliaryDataKeyView active3dSceneProperty{AuxiliaryDataType::Temporary, + "active3dScene"}; +inline constexpr AuxiliaryDataKeyView tmpProperty{AuxiliaryDataType::Temporary, "tmp"}; +inline constexpr AuxiliaryDataKeyView recordProperty{AuxiliaryDataType::Temporary, "Record"}; +inline constexpr AuxiliaryDataKeyView transitionDurationProperty{AuxiliaryDataType::Document, + "transitionDuration"}; +inline constexpr AuxiliaryDataKeyView targetProperty{AuxiliaryDataType::Document, "target"}; +inline constexpr AuxiliaryDataKeyView propertyProperty{AuxiliaryDataType::Document, "property"}; +inline constexpr AuxiliaryDataKeyView currentFrameProperty{AuxiliaryDataType::NodeInstance, + "currentFrame"}; +inline constexpr AuxiliaryDataKeyView annotationProperty{AuxiliaryDataType::Document, "annotation"}; +inline constexpr AuxiliaryDataKeyView globalAnnotationProperty{AuxiliaryDataType::Document, + "globalAnnotation"}; +inline constexpr AuxiliaryDataKeyView globalAnnotationStatus{AuxiliaryDataType::Document, + "globalAnnotationStatus"}; +template +QVariant getDefaultValueAsQVariant(const Type &key) +{ + if constexpr (std::is_same_v) + return toQVariant(key.defaultvalue); + + return {}; +} + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/include/modelnode.h b/src/plugins/qmldesigner/designercore/include/modelnode.h index fe59b876726..ab9a5dc1817 100644 --- a/src/plugins/qmldesigner/designercore/include/modelnode.h +++ b/src/plugins/qmldesigner/designercore/include/modelnode.h @@ -25,7 +25,11 @@ #pragma once +#include "auxiliarydata.h" #include "qmldesignercorelib_global.h" + +#include + #include #include #include @@ -67,8 +71,13 @@ class Annotation; QMLDESIGNERCORE_EXPORT QList toInternalNodeList(const QList &nodeList); using PropertyListType = QList >; +using AuxiliaryPropertyListType = QList>; -static const PropertyName lockedProperty = {("locked")}; +inline constexpr AuxiliaryDataKeyView lockedProperty{AuxiliaryDataType::Document, "locked"}; +inline constexpr AuxiliaryDataKeyView timelineExpandedProperty{AuxiliaryDataType::Document, + "timeline_expanded"}; +inline constexpr AuxiliaryDataKeyView transitionExpandedPropery{AuxiliaryDataType::Document, + "transition_expanded"}; class QMLDESIGNERCORE_EXPORT ModelNode { @@ -191,12 +200,21 @@ public: static int variantUserType(); QVariant toVariant() const; - QVariant auxiliaryData(const PropertyName &name) const; - void setAuxiliaryData(const PropertyName &name, const QVariant &data) const; - void setAuxiliaryDataWithoutLock(const PropertyName &name, const QVariant &data) const; - void removeAuxiliaryData(const PropertyName &name) const; - bool hasAuxiliaryData(const PropertyName &name) const; - const QHash &auxiliaryData() const; + Utils::optional auxiliaryData(AuxiliaryDataKeyView key) const; + Utils::optional auxiliaryData(AuxiliaryDataType type, Utils::SmallStringView name) const; + QVariant auxiliaryDataWithDefault(AuxiliaryDataType type, Utils::SmallStringView name) const; + QVariant auxiliaryDataWithDefault(AuxiliaryDataKeyView key) const; + void setAuxiliaryData(AuxiliaryDataKeyView key, const QVariant &data) const; + void setAuxiliaryData(AuxiliaryDataType type, Utils::SmallStringView name, const QVariant &data) const; + void setAuxiliaryDataWithoutLock(AuxiliaryDataType type, + Utils::SmallStringView name, + const QVariant &data) const; + void removeAuxiliaryData(AuxiliaryDataKeyView key) const; + void removeAuxiliaryData(AuxiliaryDataType type, Utils::SmallStringView name) const; + bool hasAuxiliaryData(AuxiliaryDataKeyView key) const; + bool hasAuxiliaryData(AuxiliaryDataType type, Utils::SmallStringView name) const; + AuxiliaryDatasForType auxiliaryData(AuxiliaryDataType type) const; + const AuxiliaryDatas &auxiliaryData() const; QString customId() const; bool hasCustomId() const; diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h index d6e30746661..628c8bf526c 100644 --- a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h +++ b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h @@ -103,7 +103,9 @@ public: void nodeIdChanged(const ModelNode& node, const QString& newId, const QString& oldId) override; void nodeOrderChanged(const NodeListProperty &listProperty) override; void importsChanged(const QList &addedImports, const QList &removedImports) override; - void auxiliaryDataChanged(const ModelNode &node, const PropertyName &name, const QVariant &data) override; + void auxiliaryDataChanged(const ModelNode &node, + AuxiliaryDataKeyView key, + const QVariant &data) override; void customNotification(const AbstractView *view, const QString &identifier, const QList &nodeList, const QList &data) override; void nodeSourceChanged(const ModelNode &modelNode, const QString &newNodeSource) override; void capturedData(const CapturedDataCommand &capturedData) override; diff --git a/src/plugins/qmldesigner/designercore/include/qmldesignercorelib_global.h b/src/plugins/qmldesigner/designercore/include/qmldesignercorelib_global.h index d46e099b98c..9f1c743d472 100644 --- a/src/plugins/qmldesigner/designercore/include/qmldesignercorelib_global.h +++ b/src/plugins/qmldesigner/designercore/include/qmldesignercorelib_global.h @@ -28,6 +28,10 @@ #include #include +#include + +#include + // Unnecessary since core isn't a dll any more. #if defined(QMLDESIGNER_LIBRARY) @@ -62,4 +66,5 @@ enum AnchorLineType { AnchorLineVerticalMask = AnchorLineTop | AnchorLineBottom | AnchorLineVerticalCenter | AnchorLineBaseline, AnchorLineAllMask = AnchorLineVerticalMask | AnchorLineHorizontalMask }; -} + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h b/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h index af209245479..1e5c9eb64eb 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h +++ b/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h @@ -41,6 +41,8 @@ class QmlModelStateGroup; class QmlAnchors; class ItemLibraryEntry; +inline constexpr AuxiliaryDataKeyView invisibleProperty{AuxiliaryDataType::Document, "invisible"}; + class QMLDESIGNERCORE_EXPORT QmlVisualNode : public QmlObjectNode { friend class QmlAnchors; diff --git a/src/plugins/qmldesigner/designercore/include/rewriterview.h b/src/plugins/qmldesigner/designercore/include/rewriterview.h index c01bbcc499f..910570b55be 100644 --- a/src/plugins/qmldesigner/designercore/include/rewriterview.h +++ b/src/plugins/qmldesigner/designercore/include/rewriterview.h @@ -114,7 +114,9 @@ public: void reactivateTextMofifierChangeSignals(); void deactivateTextMofifierChangeSignals(); - void auxiliaryDataChanged(const ModelNode &node, const PropertyName &name, const QVariant &data) override; + void auxiliaryDataChanged(const ModelNode &node, + AuxiliaryDataKeyView key, + const QVariant &data) override; Internal::ModelNodePositionStorage *positionStorage() const; diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index 4522c14a54f..3e351486a15 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -656,36 +656,84 @@ void NodeInstanceView::importsChanged(const QList &/*addedImports*/, con } void NodeInstanceView::auxiliaryDataChanged(const ModelNode &node, - const PropertyName &name, + AuxiliaryDataKeyView key, const QVariant &value) { - QTC_ASSERT(m_nodeInstanceServer, return); - const bool forceAuxChange = name == "invisible" || name == "locked" || name == "rotBlocked@Internal"; - if (((node.isRootNode() && (name == "width" || name == "height")) || forceAuxChange) - || name.endsWith(PropertyName("@NodeInstance"))) { + QTC_ASSERT(m_nodeInstanceServer, return ); + + switch (key.type) { + case AuxiliaryDataType::Document: + if ((key == lockedProperty || key == invisibleProperty) && hasInstanceForModelNode(node)) { + NodeInstance instance = instanceForModelNode(node); + if (value.isValid()) { + PropertyValueContainer container{instance.instanceId(), + PropertyName{key.name}, + value, + TypeName(), + key.type}; + m_nodeInstanceServer->changeAuxiliaryValues({{container}}); + } + }; + break; + + case AuxiliaryDataType::NodeInstance: if (hasInstanceForModelNode(node)) { NodeInstance instance = instanceForModelNode(node); - if (value.isValid() || forceAuxChange) { - PropertyValueContainer container{instance.instanceId(), name, value, TypeName()}; + if (value.isValid()) { + PropertyValueContainer container{instance.instanceId(), + PropertyName{key.name}, + value, + TypeName(), + key.type}; m_nodeInstanceServer->changeAuxiliaryValues({{container}}); } else { + PropertyName name{key.name}; if (node.hasVariantProperty(name)) { - PropertyValueContainer container(instance.instanceId(), name, node.variantProperty(name).value(), TypeName()); + PropertyValueContainer container(instance.instanceId(), + name, + node.variantProperty(name).value(), + TypeName()); ChangeValuesCommand changeValueCommand({container}); m_nodeInstanceServer->changePropertyValues(changeValueCommand); } else if (node.hasBindingProperty(name)) { - PropertyBindingContainer container{instance.instanceId(), name, node.bindingProperty(name).expression(), TypeName()}; + PropertyBindingContainer container{instance.instanceId(), + name, + node.bindingProperty(name).expression(), + TypeName()}; m_nodeInstanceServer->changePropertyBindings({{container}}); } } - } - } else if (node.isRootNode() && name == "language@Internal") { - const QString languageAsString = value.toString(); - if (auto multiLanguageAspect = QmlProjectManager::QmlMultiLanguageAspect::current(m_currentTarget)) - multiLanguageAspect->setCurrentLocale(languageAsString); - m_nodeInstanceServer->changeLanguage({languageAsString}); - } else if (node.isRootNode() && name == "previewSize@Internal") { - m_nodeInstanceServer->changePreviewImageSize(value.toSize()); + }; + 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(); + if (auto multiLanguageAspect = QmlProjectManager::QmlMultiLanguageAspect::current( + m_currentTarget)) + multiLanguageAspect->setCurrentLocale(languageAsString); + m_nodeInstanceServer->changeLanguage({languageAsString}); + } else if (key.name == "previewSize") { + m_nodeInstanceServer->changePreviewImageSize(value.toSize()); + } + }; + break; + + default: + break; } } @@ -986,22 +1034,24 @@ QList filterNodesForSkipItems(const QList &nodeList) return filteredNodeList; } +namespace { +bool shouldSendAuxiliary(const AuxiliaryDataKey &key) +{ + return key == invisibleProperty || key == lockedProperty + || key.type == AuxiliaryDataType::NodeInstance + || (key.type == AuxiliaryDataType::Temporary && key.name == "rotBlocked"); +} +} // namespace CreateSceneCommand NodeInstanceView::createCreateSceneCommand() { QList nodeList = allModelNodes(); QList instanceList; - Utils::optional oldNodeInstanceHash = m_nodeInstanceCache.take(model()); - if (oldNodeInstanceHash - && oldNodeInstanceHash->instances.value(rootModelNode()).isValid()) { - instanceList = loadInstancesFromCache(nodeList, oldNodeInstanceHash.value()); - } else { - for (const ModelNode &node : std::as_const(nodeList)) { - NodeInstance instance = loadNode(node); - if (!isSkippedNode(node)) - instanceList.append(instance); - } + for (const ModelNode &node : std::as_const(nodeList)) { + NodeInstance instance = loadNode(node); + if (!isSkippedNode(node)) + instanceList.append(instance); } clearErrors(); @@ -1017,12 +1067,14 @@ CreateSceneCommand NodeInstanceView::createCreateSceneCommand() bindingPropertyList.append(node.bindingProperties()); if (node.isValid() && hasInstanceForModelNode(node)) { NodeInstance instance = instanceForModelNode(node); - const QHash aux = node.auxiliaryData(); - for (auto auxiliaryIterator = aux.cbegin(), end = aux.cend(); - auxiliaryIterator != end; - ++auxiliaryIterator) { - PropertyValueContainer container(instance.instanceId(), auxiliaryIterator.key(), auxiliaryIterator.value(), TypeName()); - auxiliaryContainerVector.append(container); + for (const auto &element : node.auxiliaryData()) { + if (shouldSendAuxiliary(element.first)) { + auxiliaryContainerVector.emplace_back(instance.instanceId(), + element.first.name.toQByteArray(), + element.second, + TypeName(), + element.first.type); + } } } } @@ -2185,12 +2237,12 @@ void NodeInstanceView::updateRotationBlocks() } } if (!qml3DNodes.isEmpty()) { - const PropertyName auxDataProp {"rotBlocked@Internal"}; + const PropertyName auxDataProp{"rotBlocked"}; for (const auto &node : qAsConst(qml3DNodes)) { if (rotationKeyframeTargets.contains(node)) - node.setAuxiliaryData(auxDataProp, true); + node.setAuxiliaryData(AuxiliaryDataType::Temporary, auxDataProp, true); else - node.setAuxiliaryData(auxDataProp, false); + node.setAuxiliaryData(AuxiliaryDataType::Temporary, auxDataProp, false); } } } diff --git a/src/plugins/qmldesigner/designercore/model/abstractview.cpp b/src/plugins/qmldesigner/designercore/model/abstractview.cpp index 3899d37d491..ae2dd2f8511 100644 --- a/src/plugins/qmldesigner/designercore/model/abstractview.cpp +++ b/src/plugins/qmldesigner/designercore/model/abstractview.cpp @@ -100,7 +100,7 @@ ModelNode AbstractView::createModelNode(const TypeName &typeName, int majorVersion, int minorVersion, const QList> &propertyList, - const QList> &auxPropertyList, + const AuxiliaryDatas &auxPropertyList, const QString &nodeSource, ModelNode::NodeSourceType nodeSourceType, const QString &behaviorPropertyName) @@ -376,7 +376,9 @@ void AbstractView::usedImportsChanged(const QList &/*usedImports*/) { } -void AbstractView::auxiliaryDataChanged(const ModelNode &/*node*/, const PropertyName &/*name*/, const QVariant &/*data*/) +void AbstractView::auxiliaryDataChanged(const ModelNode & /*node*/, + AuxiliaryDataKeyView /*key*/, + const QVariant & /*data*/) { } diff --git a/src/plugins/qmldesigner/designercore/model/internalnode.cpp b/src/plugins/qmldesigner/designercore/model/internalnode.cpp index 31e6bd2f960..4bf6177db35 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/internalnode.cpp @@ -29,9 +29,11 @@ #include "internalnodeproperty.h" #include "internalnodelistproperty.h" - #include +#include +#include + namespace QmlDesigner { namespace Internal { @@ -60,29 +62,75 @@ void InternalNode::resetParentProperty() m_parentProperty.clear(); } -QVariant InternalNode::auxiliaryData(const PropertyName &name) const +namespace { + +template +auto find(Type &&auxiliaryDatas, AuxiliaryDataKeyView key) { - return m_auxiliaryDataHash.value(name); + return std::find_if(auxiliaryDatas.begin(), auxiliaryDatas.end(), [&](const auto &element) { + return element.first == key; + }); } -void InternalNode::setAuxiliaryData(const PropertyName &name, const QVariant &data) +} // namespace + +Utils::optional InternalNode::auxiliaryData(AuxiliaryDataKeyView key) const { - m_auxiliaryDataHash.insert(name, data); + auto found = find(m_auxiliaryDatas, key); + + if (found != m_auxiliaryDatas.end()) + return found->second; + + return {}; } -void InternalNode::removeAuxiliaryData(const PropertyName &name) +bool InternalNode::setAuxiliaryData(AuxiliaryDataKeyView key, const QVariant &data) { - m_auxiliaryDataHash.remove(name); + auto found = find(m_auxiliaryDatas, key); + + if (found != m_auxiliaryDatas.end()) { + if (found->second == data) + return false; + found->second = data; + } else { + m_auxiliaryDatas.emplace_back(AuxiliaryDataKey{key}, data); + } + + return true; } -bool InternalNode::hasAuxiliaryData(const PropertyName &name) const +bool InternalNode::removeAuxiliaryData(AuxiliaryDataKeyView key) { - return m_auxiliaryDataHash.contains(name); + auto found = find(m_auxiliaryDatas, key); + + if (found == m_auxiliaryDatas.end()) + return false; + + *found = std::move(m_auxiliaryDatas.back()); + + m_auxiliaryDatas.pop_back(); + + return true; } -const QHash &InternalNode::auxiliaryData() const +bool InternalNode::hasAuxiliaryData(AuxiliaryDataKeyView key) const { - return m_auxiliaryDataHash; + auto found = find(m_auxiliaryDatas, key); + + return found != m_auxiliaryDatas.end(); +} + +AuxiliaryDatasForType InternalNode::auxiliaryData(AuxiliaryDataType type) const +{ + AuxiliaryDatasForType data; + data.reserve(m_auxiliaryDatas.size()); + + for (const auto &element : m_auxiliaryDatas) { + if (element.first.type == type) + data.emplace_back(element.first.name, element.second); + } + + return data; } InternalProperty::Pointer InternalNode::property(const PropertyName &name) const diff --git a/src/plugins/qmldesigner/designercore/model/internalnode_p.h b/src/plugins/qmldesigner/designercore/model/internalnode_p.h index 8206ea78133..a0ec885aefd 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnode_p.h +++ b/src/plugins/qmldesigner/designercore/model/internalnode_p.h @@ -25,18 +25,26 @@ #pragma once -#include -#include -#include -#include -#include -#include "internalproperty.h" -#include "internalvariantproperty.h" #include "internalbindingproperty.h" -#include "internalsignalhandlerproperty.h" +#include "internalnodeabstractproperty.h" #include "internalnodelistproperty.h" #include "internalnodeproperty.h" -#include "internalnodeabstractproperty.h" +#include "internalproperty.h" +#include "internalsignalhandlerproperty.h" +#include "internalvariantproperty.h" + +#include + +#include + +#include +#include +#include +#include +#include + +#include +#include #include @@ -74,11 +82,12 @@ public: void setParentProperty(const InternalNodeAbstractProperty::Pointer &parent); void resetParentProperty(); - QVariant auxiliaryData(const PropertyName &name) const; - void setAuxiliaryData(const PropertyName &name, const QVariant &data); - void removeAuxiliaryData(const PropertyName &name); - bool hasAuxiliaryData(const PropertyName &name) const; - const QHash &auxiliaryData() const; + Utils::optional auxiliaryData(AuxiliaryDataKeyView key) const; + bool setAuxiliaryData(AuxiliaryDataKeyView key, const QVariant &data); + bool removeAuxiliaryData(AuxiliaryDataKeyView key); + bool hasAuxiliaryData(AuxiliaryDataKeyView key) const; + AuxiliaryDatasForType auxiliaryData(AuxiliaryDataType type) const; + const AuxiliaryDatas &auxiliaryData() const { return m_auxiliaryDatas; } InternalProperty::Pointer property(const PropertyName &name) const; InternalBindingProperty::Pointer bindingProperty(const PropertyName &name) const; @@ -142,7 +151,7 @@ public: QStringList scriptFunctions; private: - QHash m_auxiliaryDataHash; + AuxiliaryDatas m_auxiliaryDatas; InternalNodeAbstractProperty::WeakPointer m_parentProperty; QHash m_namePropertyHash; }; diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp index 521b37ce3ac..dc12c2a0b33 100644 --- a/src/plugins/qmldesigner/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/designercore/model/model.cpp @@ -113,15 +113,8 @@ ModelPrivate::ModelPrivate( { m_metaInfoProxyModel = metaInfoProxyModel; - m_rootInternalNode = createNode(typeName, - major, - minor, - PropertyListType(), - PropertyListType(), - {}, - ModelNode::NodeWithoutSource, - {}, - true); + m_rootInternalNode = createNode( + typeName, major, minor, {}, {}, {}, ModelNode::NodeWithoutSource, {}, true); m_currentStateNode = m_rootInternalNode; m_currentTimelineNode = m_rootInternalNode; @@ -258,7 +251,7 @@ InternalNodePointer ModelPrivate::createNode(const TypeName &typeName, int majorVersion, int minorVersion, const QList> &propertyList, - const QList> &auxPropertyList, + const AuxiliaryDatas &auxiliaryDatas, const QString &nodeSource, ModelNode::NodeSourceType nodeSourceType, const QString &behaviorPropertyName, @@ -284,8 +277,8 @@ InternalNodePointer ModelPrivate::createNode(const TypeName &typeName, newNode->variantProperty(propertyPair.first)->setValue(propertyPair.second); } - for (const PropertyPair &propertyPair : auxPropertyList) - newNode->setAuxiliaryData(propertyPair.first, propertyPair.second); + for (const auto &auxiliaryData : auxiliaryDatas) + newNode->setAuxiliaryData(AuxiliaryDataKeyView{auxiliaryData.first}, auxiliaryData.second); m_nodeSet.insert(newNode); m_internalIdNodeHash.insert(newNode->internalId, newNode); @@ -462,12 +455,12 @@ void ModelPrivate::notifyInstanceChanges(Callable call) } void ModelPrivate::notifyAuxiliaryDataChanged(const InternalNodePointer &node, - const PropertyName &name, + AuxiliaryDataKeyView key, const QVariant &data) { notifyNodeInstanceViewLast([&](AbstractView *view) { ModelNode modelNode(node, m_model, view); - view->auxiliaryDataChanged(modelNode, name, data); + view->auxiliaryDataChanged(modelNode, key, data); }); } @@ -715,18 +708,18 @@ void ModelPrivate::notifyPropertiesAboutToBeRemoved( } void ModelPrivate::setAuxiliaryData(const InternalNodePointer &node, - const PropertyName &name, + const AuxiliaryDataKeyView &key, const QVariant &data) { - if (node->auxiliaryData(name) == data) - return; + bool changed = false; if (data.isValid()) - node->setAuxiliaryData(name, data); + changed = node->setAuxiliaryData(key, data); else - node->removeAuxiliaryData(name); + changed = node->removeAuxiliaryData(key); - notifyAuxiliaryDataChanged(node, name, data); + if (changed) + notifyAuxiliaryDataChanged(node, key, data); } void ModelPrivate::resetModelByRewriter(const QString &description) @@ -975,11 +968,12 @@ void ModelPrivate::clearSelectedNodes() changeSelectedNodes(m_selectedInternalNodeList, lastSelectedNodeList); } -void ModelPrivate::removeAuxiliaryData(const InternalNodePointer &node, const PropertyName &name) +void ModelPrivate::removeAuxiliaryData(const InternalNodePointer &node, const AuxiliaryDataKeyView &key) { - node->removeAuxiliaryData(name); + bool removed = node->removeAuxiliaryData(key); - notifyAuxiliaryDataChanged(node, name, QVariant()); + if (removed) + notifyAuxiliaryDataChanged(node, key, QVariant()); } QList ModelPrivate::toModelNodeList(const QList &nodeList, AbstractView *view) const diff --git a/src/plugins/qmldesigner/designercore/model/model_p.h b/src/plugins/qmldesigner/designercore/model/model_p.h index dcb6a28d696..af980a99a68 100644 --- a/src/plugins/qmldesigner/designercore/model/model_p.h +++ b/src/plugins/qmldesigner/designercore/model/model_p.h @@ -106,14 +106,13 @@ public: InternalNodePointer createNode(const TypeName &typeName, int majorVersion, int minorVersion, - const QList > &propertyList, - const QList > &auxPropertyList, + const QList> &propertyList, + const AuxiliaryDatas &auxPropertyList, const QString &nodeSource, ModelNode::NodeSourceType nodeSourceType, const QString &behaviorPropertyName, bool isRootNode = false); - /*factory methods for internal use in model and rewriter*/ void removeNode(const InternalNodePointer &node); void changeNodeId(const InternalNodePointer &node, const QString &id); @@ -169,7 +168,9 @@ public: const InternalNodePointer &node, int oldIndex); void notifyNodeOrderChanged(const InternalNodeListPropertyPointer &internalListProperty); - void notifyAuxiliaryDataChanged(const InternalNodePointer &node, const PropertyName &name, const QVariant &data); + void notifyAuxiliaryDataChanged(const InternalNodePointer &node, + AuxiliaryDataKeyView key, + const QVariant &data); void notifyNodeSourceChanged(const InternalNodePointer &node, const QString &newNodeSource); void notifyRootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion); @@ -209,8 +210,10 @@ public: void changeSelectedNodes(const QList &newSelectedNodeList, const QList &oldSelectedNodeList); - void setAuxiliaryData(const InternalNodePointer &node, const PropertyName &name, const QVariant &data); - void removeAuxiliaryData(const InternalNodePointer &node, const PropertyName &name); + void setAuxiliaryData(const InternalNodePointer &node, + const AuxiliaryDataKeyView &key, + const QVariant &data); + void removeAuxiliaryData(const InternalNodePointer &node, const AuxiliaryDataKeyView &key); [[noreturn]] void resetModelByRewriter(const QString &description); // Imports: diff --git a/src/plugins/qmldesigner/designercore/model/modelmerger.cpp b/src/plugins/qmldesigner/designercore/model/modelmerger.cpp index d2f4200e02d..501bdb408a1 100644 --- a/src/plugins/qmldesigner/designercore/model/modelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelmerger.cpp @@ -75,9 +75,8 @@ static void syncVariantProperties(ModelNode &outputNode, const ModelNode &inputN static void syncAuxiliaryProperties(ModelNode &outputNode, const ModelNode &inputNode) { - auto tmp = inputNode.auxiliaryData(); - for (auto iter = tmp.begin(); iter != tmp.end(); ++iter) - outputNode.setAuxiliaryData(iter.key(), iter.value()); + for (const auto &element : inputNode.auxiliaryData()) + outputNode.setAuxiliaryData(AuxiliaryDataKeyView{element.first}, element.second); } static void syncBindingProperties(ModelNode &outputNode, const ModelNode &inputNode, const QHash &idRenamingHash) diff --git a/src/plugins/qmldesigner/designercore/model/modelnode.cpp b/src/plugins/qmldesigner/designercore/model/modelnode.cpp index 98b80a2366f..cfe374fcf8a 100644 --- a/src/plugins/qmldesigner/designercore/model/modelnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelnode.cpp @@ -24,9 +24,7 @@ ****************************************************************************/ #include "modelnode.h" -#include -#include -#include + #include "internalnode_p.h" #include "invalidargumentexception.h" #include "invalididexception.h" @@ -39,9 +37,14 @@ #include "nodeabstractproperty.h" #include "nodelistproperty.h" #include "nodeproperty.h" -#include #include "annotation.h" +#include +#include +#include +#include +#include + #include #include @@ -1050,40 +1053,91 @@ QVariant ModelNode::toVariant() const return QVariant::fromValue(*this); } -QVariant ModelNode::auxiliaryData(const PropertyName &name) const +Utils::optional ModelNode::auxiliaryData(AuxiliaryDataKeyView key) const { if (!isValid()) throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); - return m_internalNode->auxiliaryData(name); + return m_internalNode->auxiliaryData(key); } -void ModelNode::setAuxiliaryData(const PropertyName &name, const QVariant &data) const +Utils::optional ModelNode::auxiliaryData(AuxiliaryDataType type, + Utils::SmallStringView name) const { - Internal::WriteLocker locker(m_model.data()); - m_model.data()->d->setAuxiliaryData(m_internalNode, name, data); + return auxiliaryData({type, name}); } -void ModelNode::setAuxiliaryDataWithoutLock(const PropertyName &name, const QVariant &data) const +QVariant ModelNode::auxiliaryDataWithDefault(AuxiliaryDataType type, Utils::SmallStringView name) const { - m_model.data()->d->setAuxiliaryData(m_internalNode, name, data); + return auxiliaryDataWithDefault({type, name}); } -void ModelNode::removeAuxiliaryData(const PropertyName &name) const -{ - Internal::WriteLocker locker(m_model.data()); - m_model.data()->d->removeAuxiliaryData(m_internalNode, name); -} - -bool ModelNode::hasAuxiliaryData(const PropertyName &name) const +QVariant ModelNode::auxiliaryDataWithDefault(AuxiliaryDataKeyView key) const { if (!isValid()) throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); - return m_internalNode->hasAuxiliaryData(name); + auto data = m_internalNode->auxiliaryData(key); + + if (data) + return *data; + + return {}; } -const QHash &ModelNode::auxiliaryData() const +void ModelNode::setAuxiliaryData(AuxiliaryDataType type, + Utils::SmallStringView name, + const QVariant &data) const +{ + setAuxiliaryData({type, name}, data); +} + +void ModelNode::setAuxiliaryData(AuxiliaryDataKeyView key, const QVariant &data) const +{ + Internal::WriteLocker locker(m_model.data()); + m_model->d->setAuxiliaryData(internalNode(), key, data); +} + +void ModelNode::setAuxiliaryDataWithoutLock(AuxiliaryDataType type, + Utils::SmallStringView name, + const QVariant &data) const +{ + m_model->d->setAuxiliaryData(internalNode(), {type, name}, data); +} + +void ModelNode::removeAuxiliaryData(AuxiliaryDataKeyView key) const +{ + Internal::WriteLocker locker(m_model.data()); + m_model->d->removeAuxiliaryData(internalNode(), key); +} + +void ModelNode::removeAuxiliaryData(AuxiliaryDataType type, Utils::SmallStringView name) const +{ + removeAuxiliaryData({type, name}); +} + +bool ModelNode::hasAuxiliaryData(AuxiliaryDataKeyView key) const +{ + if (!isValid()) + throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); + + return m_internalNode->hasAuxiliaryData(key); +} + +bool ModelNode::hasAuxiliaryData(AuxiliaryDataType type, Utils::SmallStringView name) const +{ + return hasAuxiliaryData({type, name}); +} + +AuxiliaryDatasForType ModelNode::auxiliaryData(AuxiliaryDataType type) const +{ + if (!isValid()) + throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); + + return m_internalNode->auxiliaryData(type); +} + +const AuxiliaryDatas &ModelNode::auxiliaryData() const { if (!isValid()) throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); @@ -1093,11 +1147,12 @@ const QHash &ModelNode::auxiliaryData() const QString ModelNode::customId() const { - QString result; - if (hasCustomId()) - result = auxiliaryData(customIdProperty).value(); + auto data = auxiliaryData(customIdProperty); - return result; + if (data) + return data->toString(); + + return {}; } bool ModelNode::hasCustomId() const @@ -1107,14 +1162,12 @@ bool ModelNode::hasCustomId() const void ModelNode::setCustomId(const QString &str) { - setAuxiliaryData(customIdProperty, QVariant::fromValue(str)); + setAuxiliaryData(customIdProperty, QVariant::fromValue(str)); } void ModelNode::removeCustomId() { - if (hasCustomId()) { - removeAuxiliaryData(customIdProperty); - } + removeAuxiliaryData(customIdProperty); } QVector ModelNode::comments() const @@ -1160,12 +1213,12 @@ bool ModelNode::updateComment(const Comment &com, int position) Annotation ModelNode::annotation() const { - Annotation result; + auto data = auxiliaryData(annotationProperty); - if (hasAnnotation()) - result.fromQString(auxiliaryData(annotationProperty).value()); + if (data) + return Annotation(data->toString()); - return result; + return {}; } bool ModelNode::hasAnnotation() const @@ -1175,14 +1228,12 @@ bool ModelNode::hasAnnotation() const void ModelNode::setAnnotation(const Annotation &annotation) { - setAuxiliaryData(annotationProperty, QVariant::fromValue(annotation.toQString())); + setAuxiliaryData(annotationProperty, QVariant::fromValue(annotation.toQString())); } void ModelNode::removeAnnotation() { - if (hasAnnotation()) { - removeAuxiliaryData(annotationProperty); - } + removeAuxiliaryData(annotationProperty); } Annotation ModelNode::globalAnnotation() const @@ -1190,10 +1241,12 @@ Annotation ModelNode::globalAnnotation() const Annotation result; ModelNode root = view()->rootModelNode(); - if (hasGlobalAnnotation()) - result.fromQString(root.auxiliaryData(globalAnnotationProperty).value()); + auto data = root.auxiliaryData(globalAnnotationProperty); - return result; + if (data) + return Annotation(data->toString()); + + return {}; } bool ModelNode::hasGlobalAnnotation() const @@ -1204,14 +1257,12 @@ bool ModelNode::hasGlobalAnnotation() const void ModelNode::setGlobalAnnotation(const Annotation &annotation) { view()->rootModelNode().setAuxiliaryData(globalAnnotationProperty, - QVariant::fromValue(annotation.toQString())); + QVariant::fromValue(annotation.toQString())); } void ModelNode::removeGlobalAnnotation() { - if (hasGlobalAnnotation()) { - view()->rootModelNode().removeAuxiliaryData(globalAnnotationProperty); - } + view()->rootModelNode().removeAuxiliaryData(globalAnnotationProperty); } GlobalAnnotationStatus ModelNode::globalStatus() const @@ -1219,9 +1270,10 @@ GlobalAnnotationStatus ModelNode::globalStatus() const GlobalAnnotationStatus result; ModelNode root = view()->rootModelNode(); - if (hasGlobalAnnotation()) { - result.fromQString(root.auxiliaryData(globalAnnotationStatus).value()); - } + auto data = root.auxiliaryData(globalAnnotationStatus); + + if (data) + result.fromQString(data->value()); return result; } @@ -1234,7 +1286,7 @@ bool ModelNode::hasGlobalStatus() const void ModelNode::setGlobalStatus(const GlobalAnnotationStatus &status) { view()->rootModelNode().setAuxiliaryData(globalAnnotationStatus, - QVariant::fromValue(status.toQString())); + QVariant::fromValue(status.toQString())); } void ModelNode::removeGlobalStatus() @@ -1246,8 +1298,10 @@ void ModelNode::removeGlobalStatus() bool ModelNode::locked() const { - if (hasLocked()) - return auxiliaryData(lockedProperty).toBool(); + auto data = auxiliaryData(lockedProperty); + + if (data) + return data->toBool(); return false; } @@ -1264,8 +1318,8 @@ void ModelNode::setLocked(bool value) // Remove newly locked node and all its descendants from potential selection for (ModelNode node : allSubModelNodesAndThisNode()) { node.deselectNode(); - node.removeAuxiliaryData("timeline_expanded"); - node.removeAuxiliaryData("transition_expanded"); + node.removeAuxiliaryData(timelineExpandedProperty); + node.removeAuxiliaryData(transitionExpandedPropery); } } else { removeAuxiliaryData(lockedProperty); diff --git a/src/plugins/qmldesigner/designercore/model/qml3dnode.cpp b/src/plugins/qmldesigner/designercore/model/qml3dnode.cpp index c6698df6e6f..d917db46e5f 100644 --- a/src/plugins/qmldesigner/designercore/model/qml3dnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qml3dnode.cpp @@ -92,7 +92,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().auxiliaryData("rotBlocked@Internal").toBool(); + return modelNode().auxiliaryDataWithDefault(AuxiliaryDataType::Temporary, "rotBlocked").toBool(); return false; } diff --git a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp index 61a87779562..e5e55d842ed 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp @@ -554,10 +554,15 @@ void QmlItemNode::setPostionInBaseState(const QPointF &position) modelNode().variantProperty("y").setValue(qRound(position.y())); } +namespace { +constexpr AuxiliaryDataKeyView flowXProperty{AuxiliaryDataType::Document, "flowX"}; +constexpr AuxiliaryDataKeyView flowYProperty{AuxiliaryDataType::Document, "flowY"}; +} // namespace + void QmlItemNode::setFlowItemPosition(const QPointF &position) { - modelNode().setAuxiliaryData("flowX", position.x()); - modelNode().setAuxiliaryData("flowY", position.y()); + modelNode().setAuxiliaryData(flowXProperty, position.x()); + modelNode().setAuxiliaryData(flowYProperty, position.y()); } QPointF QmlItemNode::flowPosition() const @@ -565,8 +570,8 @@ QPointF QmlItemNode::flowPosition() const if (!isValid()) return QPointF(); - return QPointF(modelNode().auxiliaryData("flowX").toInt(), - modelNode().auxiliaryData("flowY").toInt()); + return QPointF(modelNode().auxiliaryDataWithDefault(flowXProperty).toInt(), + modelNode().auxiliaryDataWithDefault(flowYProperty).toInt()); } bool QmlItemNode::isInLayout() const diff --git a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp index ee4d6fcd8a0..5c6f4707e24 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp @@ -24,20 +24,22 @@ ****************************************************************************/ #include "qmlobjectnode.h" +#include "abstractview.h" +#include "bindingproperty.h" +#include "nodeinstance.h" +#include "nodeinstanceview.h" +#include "nodelistproperty.h" +#include "nodemetainfo.h" +#include "nodeproperty.h" +#include "qml3dnode.h" #include "qmlitemnode.h" #include "qmlstate.h" #include "qmltimelinekeyframegroup.h" #include "qmlvisualnode.h" -#include "qml3dnode.h" #include "variantproperty.h" -#include "nodeproperty.h" + +#include #include -#include "abstractview.h" -#include "nodeinstance.h" -#include "nodemetainfo.h" -#include "bindingproperty.h" -#include "nodelistproperty.h" -#include "nodeinstanceview.h" #include @@ -63,7 +65,7 @@ void QmlObjectNode::setVariantProperty(const PropertyName &name, const QVariant Q_ASSERT(timelineFrames.isValid()); - qreal frame = currentTimeline().modelNode().auxiliaryData("currentFrame@NodeInstance").toReal(); + qreal frame = currentTimeline().modelNode().auxiliaryDataWithDefault(currentFrameProperty).toReal(); timelineFrames.setValue(value, frame); return; @@ -73,7 +75,10 @@ void QmlObjectNode::setVariantProperty(const PropertyName &name, const QVariant Q_ASSERT(timelineFrames.isValid()); if (timelineFrames.isRecording()) { - qreal frame = currentTimeline().modelNode().auxiliaryData("currentFrame@NodeInstance").toReal(); + qreal frame = currentTimeline() + .modelNode() + .auxiliaryDataWithDefault(currentFrameProperty) + .toReal(); timelineFrames.setValue(value, frame); return; @@ -220,7 +225,7 @@ QVariant QmlObjectNode::modelValue(const PropertyName &name) const Q_ASSERT(timelineFrames.isValid()); - qreal frame = currentTimeline().modelNode().auxiliaryData("currentFrame@NodeInstance").toReal(); + qreal frame = currentTimeline().modelNode().auxiliaryDataWithDefault(currentFrameProperty).toReal(); QVariant value = timelineFrames.value(frame); diff --git a/src/plugins/qmldesigner/designercore/model/qmltimeline.cpp b/src/plugins/qmldesigner/designercore/model/qmltimeline.cpp index d84f3387411..23d25ee520b 100644 --- a/src/plugins/qmldesigner/designercore/model/qmltimeline.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmltimeline.cpp @@ -24,15 +24,16 @@ ****************************************************************************/ #include "qmltimeline.h" -#include "qmltimelinekeyframegroup.h" #include "abstractview.h" -#include -#include -#include -#include -#include #include "bindingproperty.h" #include "qmlitemnode.h" +#include "qmltimelinekeyframegroup.h" + +#include +#include +#include +#include +#include #include @@ -224,7 +225,7 @@ bool QmlTimeline::isRecording() const { QTC_ASSERT(isValid(), return false); - return modelNode().hasAuxiliaryData("Record@Internal"); + return modelNode().hasAuxiliaryData(recordProperty); } void QmlTimeline::toogleRecording(bool record) const @@ -233,9 +234,9 @@ void QmlTimeline::toogleRecording(bool record) const if (!record) { if (isRecording()) - modelNode().removeAuxiliaryData("Record@Internal"); + modelNode().removeAuxiliaryData(recordProperty); } else { - modelNode().setAuxiliaryData("Record@Internal", true); + modelNode().setAuxiliaryData(recordProperty, true); } } @@ -301,7 +302,7 @@ void QmlTimeline::insertKeyframe(const ModelNode &target, const PropertyName &pr QTC_ASSERT(timelineFrames.isValid(), return ); - const qreal frame = modelNode().auxiliaryData("currentFrame@NodeInstance").toReal(); + const qreal frame = modelNode().auxiliaryData(currentFrameProperty)->toReal(); const QVariant value = QmlObjectNode(targetNode).instanceValue(propertyName); timelineFrames.setValue(value, frame); diff --git a/src/plugins/qmldesigner/designercore/model/qmltimelinekeyframegroup.cpp b/src/plugins/qmldesigner/designercore/model/qmltimelinekeyframegroup.cpp index 2a605e0102a..eca0013ec49 100644 --- a/src/plugins/qmldesigner/designercore/model/qmltimelinekeyframegroup.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmltimelinekeyframegroup.cpp @@ -27,6 +27,8 @@ #include "abstractview.h" #include "bindingproperty.h" #include "qmlitemnode.h" + +#include #include #include #include @@ -130,7 +132,7 @@ bool QmlTimelineKeyframeGroup::isRecording() const { QTC_ASSERT(isValid(), return false); - return modelNode().hasAuxiliaryData("Record@Internal"); + return modelNode().hasAuxiliaryData(recordProperty); } void QmlTimelineKeyframeGroup::toogleRecording(bool record) const @@ -139,9 +141,9 @@ void QmlTimelineKeyframeGroup::toogleRecording(bool record) const if (!record) { if (isRecording()) - modelNode().removeAuxiliaryData("Record@Internal"); + modelNode().removeAuxiliaryData(recordProperty); } else { - modelNode().setAuxiliaryData("Record@Internal", true); + modelNode().setAuxiliaryData(recordProperty, true); } } diff --git a/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp index a200fe45bbd..8a8d57f0d6f 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp @@ -162,15 +162,15 @@ bool QmlVisualNode::hasAnySubModelNodes() const void QmlVisualNode::setVisibilityOverride(bool visible) { if (visible) - modelNode().setAuxiliaryData("invisible", true); + modelNode().setAuxiliaryData(invisibleProperty, true); else - modelNode().removeAuxiliaryData("invisible"); + modelNode().removeAuxiliaryData(invisibleProperty); } bool QmlVisualNode::visibilityOverride() const { if (isValid()) - return modelNode().auxiliaryData("invisible").toBool(); + return modelNode().auxiliaryDataWithDefault(invisibleProperty).toBool(); return false; } diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp index b17c7032322..ff80243e83e 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp +++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp @@ -468,24 +468,13 @@ void RewriterView::deactivateTextMofifierChangeSignals() textModifier()->deactivateChangeSignals(); } -void RewriterView::auxiliaryDataChanged(const ModelNode &node, const PropertyName &name, const QVariant &) +void RewriterView::auxiliaryDataChanged(const ModelNode &, AuxiliaryDataKeyView key, const QVariant &) { if (m_restoringAuxData) return; - if (name.endsWith("@NodeInstance")) - return; - - if (name.endsWith("@Internal")) - return; - - if (node.isRootNode()) { - if (name == "width" || name == "height" || name == "autoSize" || name == "formeditorColor" - || name == "formeditorZoom") - return; - } - - m_textModifier->textDocument()->setModified(true); + if (key.type == AuxiliaryDataType::Document) + m_textModifier->textDocument()->setModified(true); } void RewriterView::applyModificationGroupChanges() @@ -613,8 +602,8 @@ QString RewriterView::auxiliaryDataAsQML() const const QRegularExpression safeName("^[a-z][a-zA-Z0-9]*$"); for (const auto &node : allModelNodes()) { - QHash data = node.auxiliaryData(); - if (!data.isEmpty()) { + auto data = node.auxiliaryData(AuxiliaryDataType::Document); + if (!data.empty()) { if (columnCount > 80) { str += "\n"; columnCount = 0; @@ -626,26 +615,18 @@ QString RewriterView::auxiliaryDataAsQML() const str += QString::number(m_canonicalModelNodeInt.value(node)); str += ";"; - QStringList keys = Utils::transform(data.keys(), [](const PropertyName &name) { - return QString::fromUtf8(name); + std::sort(data.begin(), data.end(), [](const auto &first, const auto &second) { + return first.first < second.first; }); - keys.sort(); - - for (const QString &key : keys) { - if (key.endsWith("@NodeInstance")) - continue; - - if (key.endsWith("@Internal")) - continue; - + for (const auto &[keyUtf8, value] : data) { + auto key = QString::fromUtf8(keyUtf8); if (idIsQmlKeyWord(key)) continue; if (!key.contains(safeName)) continue; hasAuxData = true; - const QVariant value = data.value(key.toUtf8()); QString strValue = value.toString(); auto metaType = static_cast(value.type()); @@ -1244,8 +1225,8 @@ void checkNode(const QmlJS::SimpleReaderNode::Ptr &node, RewriterView *view) for (auto i = properties.begin(); i != properties.end(); ++i) { if (i.key() != "i") { const PropertyName name = fixUpIllegalChars(i.key()).toUtf8(); - if (!modelNode.hasAuxiliaryData(name)) - modelNode.setAuxiliaryData(name, i.value().value); + if (!modelNode.hasAuxiliaryData(AuxiliaryDataType::Document, name)) + modelNode.setAuxiliaryData(AuxiliaryDataType::Document, name, i.value().value); } } @@ -1257,7 +1238,7 @@ void RewriterView::restoreAuxiliaryData() QTC_ASSERT(m_textModifier, return); const char auxRestoredFlag[] = "AuxRestored@Internal"; - if (rootModelNode().hasAuxiliaryData(auxRestoredFlag)) + if (rootModelNode().hasAuxiliaryData(AuxiliaryDataType::Document, auxRestoredFlag)) return; m_restoringAuxData = true; @@ -1279,7 +1260,7 @@ void RewriterView::restoreAuxiliaryData() checkChildNodes(reader.readFromSource(auxSource), this); } - rootModelNode().setAuxiliaryData(auxRestoredFlag, true); + rootModelNode().setAuxiliaryData(AuxiliaryDataType::Document, auxRestoredFlag, true); m_restoringAuxData = false; } diff --git a/src/plugins/qmldesigner/designercore/model/stylesheetmerger.cpp b/src/plugins/qmldesigner/designercore/model/stylesheetmerger.cpp index e12912811f8..b67b7a647b2 100644 --- a/src/plugins/qmldesigner/designercore/model/stylesheetmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/stylesheetmerger.cpp @@ -131,9 +131,8 @@ void StylesheetMerger::syncVariantProperties(ModelNode &outputNode, const ModelN void StylesheetMerger::syncAuxiliaryProperties(ModelNode &outputNode, const ModelNode &inputNode) { - auto tmp = inputNode.auxiliaryData(); - for (auto iter = tmp.begin(); iter != tmp.end(); ++iter) - outputNode.setAuxiliaryData(iter.key(), iter.value()); + for (const auto &element : inputNode.auxiliaryData()) + outputNode.setAuxiliaryData(AuxiliaryDataKeyView{element.first}, element.second); } void StylesheetMerger::syncBindingProperties(ModelNode &outputNode, const ModelNode &inputNode) @@ -177,7 +176,6 @@ void StylesheetMerger::setupIdRenamingHash() ModelNode StylesheetMerger::createReplacementNode(const ModelNode& styleNode, ModelNode &modelNode) { QList > propertyList; - QList > auxPropertyList; NodeMetaInfo nodeMetaInfo = m_templateView->model()->metaInfo(styleNode.type()); for (const VariantProperty &variantProperty : modelNode.variantProperties()) { @@ -187,8 +185,13 @@ ModelNode StylesheetMerger::createReplacementNode(const ModelNode& styleNode, Mo continue; propertyList.append(QPair(variantProperty.name(), variantProperty.value())); } - ModelNode newNode(m_templateView->createModelNode(styleNode.type(), nodeMetaInfo.majorVersion(), nodeMetaInfo.minorVersion(), - propertyList, auxPropertyList, styleNode.nodeSource(), styleNode.nodeSourceType())); + ModelNode newNode(m_templateView->createModelNode(styleNode.type(), + nodeMetaInfo.majorVersion(), + nodeMetaInfo.minorVersion(), + propertyList, + {}, + styleNode.nodeSource(), + styleNode.nodeSourceType())); syncAuxiliaryProperties(newNode, modelNode); syncBindingProperties(newNode, modelNode); diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index bf986d626a9..cc922fd8273 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -1795,7 +1795,7 @@ ModelNode TextToModelMerger::createModelNode(const TypeName &typeName, majorVersion, minorVersion, PropertyListType(), - PropertyListType(), + {}, nodeSource, nodeSourceType, onTokenProperty); diff --git a/src/plugins/qmldesigner/documentmanager.cpp b/src/plugins/qmldesigner/documentmanager.cpp index 548253d5a60..4c468efb258 100644 --- a/src/plugins/qmldesigner/documentmanager.cpp +++ b/src/plugins/qmldesigner/documentmanager.cpp @@ -93,20 +93,19 @@ static inline QHash getProperties(const ModelNode &node) static inline void applyProperties(ModelNode &node, const QHash &propertyHash) { - const QHash auxiliaryData = node.auxiliaryData(); + const auto auxiliaryData = node.auxiliaryData(AuxiliaryDataType::NodeInstance); - const QList propertyNames = auxiliaryData.keys(); - for (const PropertyName &propertyName : propertyNames) { - if (node.hasAuxiliaryData(propertyName)) - node.setAuxiliaryData(propertyName, QVariant()); - } + for (const auto &element : auxiliaryData) + node.removeAuxiliaryData(AuxiliaryDataType::NodeInstance, 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(propertyIterator.key(), propertyIterator.value()); + node.setAuxiliaryData(AuxiliaryDataType::NodeInstance, + propertyIterator.key(), + propertyIterator.value()); } } } diff --git a/src/plugins/qmldesigner/qmldesignercore.cmake b/src/plugins/qmldesigner/qmldesignercore.cmake index 6b08e209009..08083ad2e47 100644 --- a/src/plugins/qmldesigner/qmldesignercore.cmake +++ b/src/plugins/qmldesigner/qmldesignercore.cmake @@ -149,6 +149,8 @@ function(extend_with_qmldesigner_core target_name) include/annotation.h include/asynchronousexplicitimagecache.h include/asynchronousimagecache.h + include/auxiliarydata.h + include/auxiliarydataproperties.h include/basetexteditmodifier.h include/bindingproperty.h include/componenttextmodifier.h diff --git a/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp b/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp index be6269a3274..24dd6f1239d 100644 --- a/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp +++ b/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp @@ -8996,8 +8996,11 @@ static void checkNode(QmlJS::SimpleReaderNode::Ptr node, TestRewriterView *view) auto properties = node->properties(); for (auto i = properties.begin(); i != properties.end(); ++i) { - if (i.key() != "i") - QCOMPARE(i.value().value, modelNode.auxiliaryData(i.key().toUtf8())); + if (i.key() != "i") { + QCOMPARE(i.value().value, + modelNode.auxiliaryData(QmlDesigner::AuxiliaryDataType::Temporary, + i.key().toUtf8())); + } } checkChildNodes(node, view); @@ -9038,11 +9041,11 @@ void tst_TestCore::writeAnnotations() ModelNode rootModelNode(testRewriterView->rootModelNode()); QVERIFY(rootModelNode.isValid()); - rootModelNode.setAuxiliaryData("x", 10); + rootModelNode.setAuxiliaryData(AuxiliaryDataType::Document, "x", 10); for (const auto &child : rootModelNode.allSubModelNodes()) { - child.setAuxiliaryData("x", 10); - child.setAuxiliaryData("test", true); - child.setAuxiliaryData("test2", "string"); + child.setAuxiliaryData(AuxiliaryDataType::Document, "x", 10); + child.setAuxiliaryData(AuxiliaryDataType::Document, "test", true); + child.setAuxiliaryData(AuxiliaryDataType::Document, "test2", "string"); } const QString metaSource = testRewriterView->auxiliaryDataAsQML(); diff --git a/tests/unit/mockup/qmldesigner/designercore/include/rewriterview.h b/tests/unit/mockup/qmldesigner/designercore/include/rewriterview.h index 697f45a9cad..05e94971443 100644 --- a/tests/unit/mockup/qmldesigner/designercore/include/rewriterview.h +++ b/tests/unit/mockup/qmldesigner/designercore/include/rewriterview.h @@ -109,7 +109,7 @@ public: void deactivateTextMofifierChangeSignals() {} void auxiliaryDataChanged([[maybe_unused]] const ModelNode &node, - [[maybe_unused]] const PropertyName &name, + [[maybe_unused]] AuxiliaryDataKeyView key, [[maybe_unused]] const QVariant &data) override {}