From cb868a4c9ecc81d352c91d5803ab4c12594f51e0 Mon Sep 17 00:00:00 2001 From: Ali Kianian Date: Thu, 28 Dec 2023 15:48:15 +0200 Subject: [PATCH] QmlDesigner: Set texRole when assigning a collection to a node Task-number: QDS-11461 Change-Id: Ia03c8267cc6f6b93860aa853afb048650f1acb3f Reviewed-by: Mahmoud Badri Reviewed-by: Qt CI Patch Build Bot --- .../collectioneditorutils.cpp | 91 +++++++++++++++++++ .../collectioneditor/collectioneditorutils.h | 6 ++ .../collectioneditor/datastoremodelnode.cpp | 25 ++++- 3 files changed, 117 insertions(+), 5 deletions(-) diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectioneditorutils.cpp b/src/plugins/qmldesigner/components/collectioneditor/collectioneditorutils.cpp index 2f9ec4d47c1..33867228d56 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/collectioneditorutils.cpp +++ b/src/plugins/qmldesigner/components/collectioneditor/collectioneditorutils.cpp @@ -162,6 +162,20 @@ bool canAcceptCollectionAsModel(const ModelNode &node) && modelProperty.propertyType().isVariant(); } +bool hasTextRoleProperty(const ModelNode &node) +{ + const NodeMetaInfo nodeMetaInfo = node.metaInfo(); + if (!nodeMetaInfo.isValid()) + return false; + + const PropertyMetaInfo textRoleProperty = nodeMetaInfo.property("textRole"); + if (!textRoleProperty.isValid()) + return false; + + return textRoleProperty.isWritable() && !textRoleProperty.isPrivate() + && textRoleProperty.propertyType().isString(); +} + QString getSourceCollectionPath(const ModelNode &dataStoreNode) { using Utils::FilePath; @@ -380,4 +394,81 @@ QJsonArray loadAsCsvCollection(const QUrl &url) return elements; } +QString getFirstColumnName(const QString &collectionName) +{ + Utils::FilePath dataStorePath = CollectionEditorUtils::dataStoreJsonFilePath(); + + if (!dataStorePath.exists()) + return {}; + + Utils::FileReader dataStoreFile; + if (!dataStoreFile.fetch(dataStorePath)) + return {}; + + QJsonParseError jsonError; + QJsonDocument dataStoreDocument = QJsonDocument::fromJson(dataStoreFile.data(), &jsonError); + if (jsonError.error == QJsonParseError::NoError) { + QJsonObject rootObject = dataStoreDocument.object(); + if (rootObject.contains(collectionName)) { + QJsonArray collectionArray = rootObject.value(collectionName).toArray(); + for (const QJsonValue &elementValue : std::as_const(collectionArray)) { + const QJsonObject elementObject = elementValue.toObject(); + QJsonObject::ConstIterator element = elementObject.constBegin(); + if (element != elementObject.constEnd()) + return element.key(); + } + } else { + qWarning() << Q_FUNC_INFO << __LINE__ + << QString("Collection \"%1\" not found.").arg(collectionName); + } + } else { + qWarning() << Q_FUNC_INFO << __LINE__ << "Problem in reading json file." + << jsonError.errorString(); + } + + return {}; +} + +bool collectionHasColumn(const QString &collectionName, const QString &columnName) +{ + Utils::FilePath dataStorePath = CollectionEditorUtils::dataStoreJsonFilePath(); + + if (!dataStorePath.exists()) + return false; + + Utils::FileReader dataStoreFile; + if (!dataStoreFile.fetch(dataStorePath)) + return false; + + QJsonParseError jsonError; + QJsonDocument dataStoreDocument = QJsonDocument::fromJson(dataStoreFile.data(), &jsonError); + if (jsonError.error == QJsonParseError::NoError) { + QJsonObject rootObject = dataStoreDocument.object(); + if (rootObject.contains(collectionName)) { + QJsonArray collectionArray = rootObject.value(collectionName).toArray(); + for (const QJsonValue &elementValue : std::as_const(collectionArray)) { + const QJsonObject elementObject = elementValue.toObject(); + QJsonObject::ConstIterator element = elementObject.constBegin(); + const QJsonObject::ConstIterator stopItem = elementObject.constEnd(); + + while (element != stopItem) { + const QString keyName = element.key(); + ++element; + + if (columnName == keyName) + return true; + } + } + } else { + qWarning() << Q_FUNC_INFO << __LINE__ + << QString("Collection \"%1\" not found.").arg(collectionName); + } + } else { + qWarning() << Q_FUNC_INFO << __LINE__ << "Problem in reading json file." + << jsonError.errorString(); + } + + return false; +} + } // namespace QmlDesigner::CollectionEditorUtils diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectioneditorutils.h b/src/plugins/qmldesigner/components/collectioneditor/collectioneditorutils.h index 5bb93aed1c0..46429f04b66 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/collectioneditorutils.h +++ b/src/plugins/qmldesigner/components/collectioneditor/collectioneditorutils.h @@ -34,10 +34,16 @@ bool ensureDataStoreExists(bool &justCreated); bool canAcceptCollectionAsModel(const ModelNode &node); +bool hasTextRoleProperty(const ModelNode &node); + QJsonArray defaultCollectionArray(); QJsonArray loadAsSingleJsonCollection(const QUrl &url); QJsonArray loadAsCsvCollection(const QUrl &url); +QString getFirstColumnName(const QString &collectionName); + +bool collectionHasColumn(const QString &collectionName, const QString &columnName); + } // namespace QmlDesigner::CollectionEditorUtils diff --git a/src/plugins/qmldesigner/components/collectioneditor/datastoremodelnode.cpp b/src/plugins/qmldesigner/components/collectioneditor/datastoremodelnode.cpp index 3a1dbae7133..a1f82bbc65b 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/datastoremodelnode.cpp +++ b/src/plugins/qmldesigner/components/collectioneditor/datastoremodelnode.cpp @@ -450,12 +450,27 @@ void DataStoreModelNode::assignCollectionToNode(AbstractView *view, return; } - BindingProperty modelProperty = targetNode.bindingProperty("model"); - - QString identifier = QString("DataStore.%1").arg(QString::fromLatin1(sourceProperty.name())); - - view->executeInTransaction("assignCollectionToNode", [&modelProperty, &identifier]() { + view->executeInTransaction("assignCollectionToNode", [&]() { + QString identifier = QString("DataStore.%1").arg(QString::fromLatin1(sourceProperty.name())); + BindingProperty modelProperty = targetNode.bindingProperty("model"); modelProperty.setExpression(identifier); + if (CollectionEditorUtils::hasTextRoleProperty(targetNode)) { + VariantProperty textRoleProperty = targetNode.variantProperty("textRole"); + const QVariant currentTextRoleValue = textRoleProperty.value(); + + if (currentTextRoleValue.isValid() && !currentTextRoleValue.isNull()) { + if (currentTextRoleValue.type() == QVariant::String) { + const QString currentTextRole = currentTextRoleValue.toString(); + if (CollectionEditorUtils::collectionHasColumn(collectionName, currentTextRole)) + return; + } else { + return; + } + } + + QString textRoleValue = CollectionEditorUtils::getFirstColumnName(collectionName); + textRoleProperty.setValue(textRoleValue); + } }); }