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 206ad75359)
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
Ali Kianian
2023-11-24 16:17:47 +02:00
parent 534d6d73de
commit d08be3f70c
7 changed files with 54 additions and 27 deletions

View File

@@ -16,6 +16,7 @@ Item {
property color textColor property color textColor
property string sourceType property string sourceType
property bool hasSelectedTarget
signal selectItem(int itemIndex) signal selectItem(int itemIndex)
signal deleteItem() signal deleteItem()
@@ -125,6 +126,12 @@ Item {
shortcut: StandardKey.Replace shortcut: StandardKey.Replace
onTriggered: renameDialog.open() onTriggered: renameDialog.open()
} }
StudioControls.MenuItem {
text: qsTr("Assign to the selected node")
enabled: root.hasSelectedTarget
onTriggered: rootView.assignCollectionToSelectedNode(collectionName)
}
} }
component Spacer: Item { component Spacer: Item {

View File

@@ -111,7 +111,6 @@ Item {
implicitWidth: sourceListView.width implicitWidth: sourceListView.width
onDeleteItem: root.model.removeRow(index) onDeleteItem: root.model.removeRow(index)
hasSelectedTarget: root.rootView.targetNodeSelected hasSelectedTarget: root.rootView.targetNodeSelected
onAssignToSelected: root.rootView.assignSourceNodeToSelectedItem(sourceNode)
onAddCollection: (collectionName) => { onAddCollection: (collectionName) => {
root.rootView.addCollection(collectionName, root.rootView.addCollection(collectionName,
sourceCollectionType, sourceCollectionType,

View File

@@ -24,7 +24,6 @@ Item {
signal selectItem(int itemIndex) signal selectItem(int itemIndex)
signal deleteItem() signal deleteItem()
signal assignToSelected()
signal addCollection(string collectionName) signal addCollection(string collectionName)
function toggleExpanded() { function toggleExpanded() {
@@ -161,6 +160,7 @@ Item {
delegate: CollectionItem { delegate: CollectionItem {
width: collectionListView.width width: collectionListView.width
sourceType: collectionListView.model.sourceType sourceType: collectionListView.model.sourceType
hasSelectedTarget: root.hasSelectedTarget
onDeleteItem: collectionListView.model.removeRow(index) onDeleteItem: collectionListView.model.removeRow(index)
} }
} }
@@ -188,12 +188,6 @@ Item {
shortcut: StandardKey.Replace shortcut: StandardKey.Replace
onTriggered: renameDialog.open() onTriggered: renameDialog.open()
} }
StudioControls.MenuItem {
text: qsTr("Assign to the selected node")
enabled: root.hasSelectedTarget
onTriggered: root.assignToSelected()
}
} }
component Spacer: Item { component Spacer: Item {

View File

@@ -7,7 +7,6 @@
#include "bindingproperty.h" #include "bindingproperty.h"
#include "nodemetainfo.h" #include "nodemetainfo.h"
#include "propertymetainfo.h" #include "propertymetainfo.h"
#include "qmldesignerplugin.h"
#include "variantproperty.h" #include "variantproperty.h"
#include <variant> #include <variant>
@@ -100,20 +99,30 @@ QString getSourceCollectionType(const ModelNode &node)
return {}; return {};
} }
void assignCollectionSourceToNode(AbstractView *view, void assignCollectionToNode(AbstractView *view,
const ModelNode &modelNode, const ModelNode &modelNode,
const ModelNode &collectionSourceNode) const ModelNode &collectionSourceNode,
const QString &collectionName)
{ {
QTC_ASSERT(modelNode.isValid() && collectionSourceNode.isValid(), return); 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; return;
BindingProperty modelProperty = modelNode.bindingProperty("model"); BindingProperty modelProperty = modelNode.bindingProperty("model");
view->executeInTransaction("CollectionEditor::assignCollectionSourceToNode", QString identifier = QString("%1.%2").arg(sourceId, QString::fromLatin1(sourceProperty.name()));
[&modelProperty, &collectionSourceNode]() {
modelProperty.setExpression(collectionSourceNode.id()); view->executeInTransaction("CollectionEditor::assignCollectionToNode",
[&modelProperty, &identifier]() {
modelProperty.setExpression(identifier);
}); });
} }
@@ -148,6 +157,22 @@ QString getSourceCollectionPath(const ModelNode &dataStoreNode)
return {}; 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() QJsonArray defaultCollectionArray()
{ {
QJsonObject initialObject; QJsonObject initialObject;

View File

@@ -20,9 +20,12 @@ QString getSourceCollectionType(const QmlDesigner::ModelNode &node);
QString getSourceCollectionPath(const QmlDesigner::ModelNode &dataStoreNode); QString getSourceCollectionPath(const QmlDesigner::ModelNode &dataStoreNode);
void assignCollectionSourceToNode(AbstractView *view, void assignCollectionToNode(AbstractView *view,
const ModelNode &modelNode, const ModelNode &modelNode,
const ModelNode &collectionSourceNode = {}); const ModelNode &collectionSourceNode,
const QString &collectionName);
bool isDataStoreNode(const ModelNode &dataStoreNode);
bool canAcceptCollectionAsModel(const ModelNode &node); bool canAcceptCollectionAsModel(const ModelNode &node);

View File

@@ -334,20 +334,19 @@ bool CollectionWidget::addCollectionToDataStore(const QString &collectionName)
return added; 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(); ModelNode targetNode = m_view->singleSelectedModelNode();
QTC_ASSERT(sourceModel.isValid() && targetNode.isValid(), return); QTC_ASSERT(dsNode.isValid() && targetNode.isValid(), return);
if (sourceModel.id().isEmpty()) { if (dsNode.id().isEmpty()) {
warn(tr("Assigning the model group"), warn(tr("Assigning the model"), tr("The model must have a valid id to be assigned."));
tr("The model group must have a valid id to be assigned."));
return; return;
} }
CollectionEditor::assignCollectionSourceToNode(m_view, targetNode, sourceModel); CollectionEditor::assignCollectionToNode(m_view, targetNode, dsNode, collectionName);
} }
ModelNode CollectionWidget::dataStoreNode() const ModelNode CollectionWidget::dataStoreNode() const

View File

@@ -52,7 +52,7 @@ public:
Q_INVOKABLE bool addCollectionToDataStore(const QString &collectionName); 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; Q_INVOKABLE ModelNode dataStoreNode() const;