aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAli Kianian <ali.kianian@qt.io>2023-11-24 16:17:47 +0200
committerAli Kianian <ali.kianian@qt.io>2023-12-07 14:02:01 +0000
commitd08be3f70caae610232b3aa07e9698956a14b2e1 (patch)
tree55d9ece25b6d5fd1aea45b32b0ec391a6e01ef9a
parent534d6d73de64a6208631962c0e0c408415513c3e (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>
-rw-r--r--share/qtcreator/qmldesigner/collectionEditorQmlSource/CollectionItem.qml7
-rw-r--r--share/qtcreator/qmldesigner/collectionEditorQmlSource/CollectionView.qml1
-rw-r--r--share/qtcreator/qmldesigner/collectionEditorQmlSource/ModelSourceItem.qml8
-rw-r--r--src/plugins/qmldesigner/components/collectioneditor/collectioneditorutils.cpp41
-rw-r--r--src/plugins/qmldesigner/components/collectioneditor/collectioneditorutils.h9
-rw-r--r--src/plugins/qmldesigner/components/collectioneditor/collectionwidget.cpp13
-rw-r--r--src/plugins/qmldesigner/components/collectioneditor/collectionwidget.h2
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;