diff options
author | Ali Kianian <ali.kianian@qt.io> | 2023-11-24 16:17:47 +0200 |
---|---|---|
committer | Ali Kianian <ali.kianian@qt.io> | 2023-12-07 14:02:01 +0000 |
commit | d08be3f70caae610232b3aa07e9698956a14b2e1 (patch) | |
tree | 55d9ece25b6d5fd1aea45b32b0ec391a6e01ef9a | |
parent | 534d6d73de64a6208631962c0e0c408415513c3e (diff) |
QmlDesigner: Assign a single collection model to the selected node
Task-number: QDS-11217
Change-Id: I35eb536540faa2299a51d152a29f07c2c36abe41
Reviewed-by: Qt CI Patch Build Bot <ci_patchbuild_bot@qt.io>
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
(cherry picked from commit 206ad75359ea319cde531aebcee9d317c26cead8)
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
7 files changed, 54 insertions, 27 deletions
diff --git a/share/qtcreator/qmldesigner/collectionEditorQmlSource/CollectionItem.qml b/share/qtcreator/qmldesigner/collectionEditorQmlSource/CollectionItem.qml index 23d0c7af93..2d26fe8de2 100644 --- a/share/qtcreator/qmldesigner/collectionEditorQmlSource/CollectionItem.qml +++ b/share/qtcreator/qmldesigner/collectionEditorQmlSource/CollectionItem.qml @@ -16,6 +16,7 @@ Item { property color textColor property string sourceType + property bool hasSelectedTarget signal selectItem(int itemIndex) signal deleteItem() @@ -125,6 +126,12 @@ Item { shortcut: StandardKey.Replace onTriggered: renameDialog.open() } + + StudioControls.MenuItem { + text: qsTr("Assign to the selected node") + enabled: root.hasSelectedTarget + onTriggered: rootView.assignCollectionToSelectedNode(collectionName) + } } component Spacer: Item { diff --git a/share/qtcreator/qmldesigner/collectionEditorQmlSource/CollectionView.qml b/share/qtcreator/qmldesigner/collectionEditorQmlSource/CollectionView.qml index 363d8bab30..33c371f807 100644 --- a/share/qtcreator/qmldesigner/collectionEditorQmlSource/CollectionView.qml +++ b/share/qtcreator/qmldesigner/collectionEditorQmlSource/CollectionView.qml @@ -111,7 +111,6 @@ Item { implicitWidth: sourceListView.width onDeleteItem: root.model.removeRow(index) hasSelectedTarget: root.rootView.targetNodeSelected - onAssignToSelected: root.rootView.assignSourceNodeToSelectedItem(sourceNode) onAddCollection: (collectionName) => { root.rootView.addCollection(collectionName, sourceCollectionType, diff --git a/share/qtcreator/qmldesigner/collectionEditorQmlSource/ModelSourceItem.qml b/share/qtcreator/qmldesigner/collectionEditorQmlSource/ModelSourceItem.qml index 00f4b804e4..c453d702bb 100644 --- a/share/qtcreator/qmldesigner/collectionEditorQmlSource/ModelSourceItem.qml +++ b/share/qtcreator/qmldesigner/collectionEditorQmlSource/ModelSourceItem.qml @@ -24,7 +24,6 @@ Item { signal selectItem(int itemIndex) signal deleteItem() - signal assignToSelected() signal addCollection(string collectionName) function toggleExpanded() { @@ -161,6 +160,7 @@ Item { delegate: CollectionItem { width: collectionListView.width sourceType: collectionListView.model.sourceType + hasSelectedTarget: root.hasSelectedTarget onDeleteItem: collectionListView.model.removeRow(index) } } @@ -188,12 +188,6 @@ Item { shortcut: StandardKey.Replace onTriggered: renameDialog.open() } - - StudioControls.MenuItem { - text: qsTr("Assign to the selected node") - enabled: root.hasSelectedTarget - onTriggered: root.assignToSelected() - } } component Spacer: Item { diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectioneditorutils.cpp b/src/plugins/qmldesigner/components/collectioneditor/collectioneditorutils.cpp index 9abe498b91..6e0328e008 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/collectioneditorutils.cpp +++ b/src/plugins/qmldesigner/components/collectioneditor/collectioneditorutils.cpp @@ -7,7 +7,6 @@ #include "bindingproperty.h" #include "nodemetainfo.h" #include "propertymetainfo.h" -#include "qmldesignerplugin.h" #include "variantproperty.h" #include <variant> @@ -100,20 +99,30 @@ QString getSourceCollectionType(const ModelNode &node) return {}; } -void assignCollectionSourceToNode(AbstractView *view, - const ModelNode &modelNode, - const ModelNode &collectionSourceNode) +void assignCollectionToNode(AbstractView *view, + const ModelNode &modelNode, + const ModelNode &collectionSourceNode, + const QString &collectionName) { QTC_ASSERT(modelNode.isValid() && collectionSourceNode.isValid(), return); - if (collectionSourceNode.id().isEmpty() || !canAcceptCollectionAsModel(modelNode)) + QString sourceId = isDataStoreNode(collectionSourceNode) ? "DataStore" + : collectionSourceNode.id(); + + if (sourceId.isEmpty() || !canAcceptCollectionAsModel(modelNode)) + return; + + VariantProperty sourceProperty = collectionSourceNode.variantProperty(collectionName.toLatin1()); + if (!sourceProperty.exists()) return; BindingProperty modelProperty = modelNode.bindingProperty("model"); - view->executeInTransaction("CollectionEditor::assignCollectionSourceToNode", - [&modelProperty, &collectionSourceNode]() { - modelProperty.setExpression(collectionSourceNode.id()); + QString identifier = QString("%1.%2").arg(sourceId, QString::fromLatin1(sourceProperty.name())); + + view->executeInTransaction("CollectionEditor::assignCollectionToNode", + [&modelProperty, &identifier]() { + modelProperty.setExpression(identifier); }); } @@ -148,6 +157,22 @@ QString getSourceCollectionPath(const ModelNode &dataStoreNode) return {}; } +bool isDataStoreNode(const ModelNode &dataStoreNode) +{ + using Utils::FilePath; + ProjectExplorer::Project *currentProject = ProjectExplorer::ProjectManager::startupProject(); + + if (!currentProject || !dataStoreNode.isValid()) + return false; + + const FilePath expectedFile = currentProject->projectDirectory().pathAppended( + "/imports/" + currentProject->displayName() + "/DataStore.qml"); + + FilePath modelPath = FilePath::fromUserInput(dataStoreNode.model()->fileUrl().toLocalFile()); + + return modelPath.isSameFile(expectedFile); +} + QJsonArray defaultCollectionArray() { QJsonObject initialObject; diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectioneditorutils.h b/src/plugins/qmldesigner/components/collectioneditor/collectioneditorutils.h index a9022ed099..8d226e7a34 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/collectioneditorutils.h +++ b/src/plugins/qmldesigner/components/collectioneditor/collectioneditorutils.h @@ -20,9 +20,12 @@ QString getSourceCollectionType(const QmlDesigner::ModelNode &node); QString getSourceCollectionPath(const QmlDesigner::ModelNode &dataStoreNode); -void assignCollectionSourceToNode(AbstractView *view, - const ModelNode &modelNode, - const ModelNode &collectionSourceNode = {}); +void assignCollectionToNode(AbstractView *view, + const ModelNode &modelNode, + const ModelNode &collectionSourceNode, + const QString &collectionName); + +bool isDataStoreNode(const ModelNode &dataStoreNode); bool canAcceptCollectionAsModel(const ModelNode &node); diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectionwidget.cpp b/src/plugins/qmldesigner/components/collectioneditor/collectionwidget.cpp index 7e5d426830..94edd5da4c 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/collectionwidget.cpp +++ b/src/plugins/qmldesigner/components/collectioneditor/collectionwidget.cpp @@ -334,20 +334,19 @@ bool CollectionWidget::addCollectionToDataStore(const QString &collectionName) return added; } -void CollectionWidget::assignSourceNodeToSelectedItem(const QVariant &sourceNode) +void CollectionWidget::assignCollectionToSelectedNode(const QString collectionName) { - ModelNode sourceModel = sourceNode.value<ModelNode>(); + ModelNode dsNode = dataStoreNode(); ModelNode targetNode = m_view->singleSelectedModelNode(); - QTC_ASSERT(sourceModel.isValid() && targetNode.isValid(), return); + QTC_ASSERT(dsNode.isValid() && targetNode.isValid(), return); - if (sourceModel.id().isEmpty()) { - warn(tr("Assigning the model group"), - tr("The model group must have a valid id to be assigned.")); + if (dsNode.id().isEmpty()) { + warn(tr("Assigning the model"), tr("The model must have a valid id to be assigned.")); return; } - CollectionEditor::assignCollectionSourceToNode(m_view, targetNode, sourceModel); + CollectionEditor::assignCollectionToNode(m_view, targetNode, dsNode, collectionName); } ModelNode CollectionWidget::dataStoreNode() const diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectionwidget.h b/src/plugins/qmldesigner/components/collectioneditor/collectionwidget.h index 03cf49aa7e..6700bf91a4 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/collectionwidget.h +++ b/src/plugins/qmldesigner/components/collectioneditor/collectionwidget.h @@ -52,7 +52,7 @@ public: Q_INVOKABLE bool addCollectionToDataStore(const QString &collectionName); - Q_INVOKABLE void assignSourceNodeToSelectedItem(const QVariant &sourceNode); + Q_INVOKABLE void assignCollectionToSelectedNode(const QString collectionName); Q_INVOKABLE ModelNode dataStoreNode() const; |