From 16e06a0af0e73c144c762f75f00d49655c048a29 Mon Sep 17 00:00:00 2001 From: Ali Kianian Date: Wed, 15 Nov 2023 19:07:28 +0200 Subject: [PATCH] QmlDesigner: Move the action for adding a collection to json The action should be moved to the tool menu of the Json Collection Task-number: QDS-11256 Change-Id: Ieb2c9cc4f4b992f1ac3225bbbd90e3d14afdc711 Reviewed-by: Miikka Heikkinen Reviewed-by: Mahmoud Badri --- .../CollectionView.qml | 6 ++ .../ModelSourceItem.qml | 88 +++++++++++++++++++ .../NewCollectionDialog.qml | 8 +- .../collectioneditorutils.cpp | 12 +++ .../collectioneditor/collectioneditorutils.h | 6 ++ .../collectionsourcemodel.cpp | 2 +- .../collectioneditor/collectionwidget.cpp | 7 +- 7 files changed, 115 insertions(+), 14 deletions(-) diff --git a/share/qtcreator/qmldesigner/collectionEditorQmlSource/CollectionView.qml b/share/qtcreator/qmldesigner/collectionEditorQmlSource/CollectionView.qml index 70eb32c9c86..c6873460e4b 100644 --- a/share/qtcreator/qmldesigner/collectionEditorQmlSource/CollectionView.qml +++ b/share/qtcreator/qmldesigner/collectionEditorQmlSource/CollectionView.qml @@ -131,6 +131,12 @@ Item { onDeleteItem: root.model.removeRow(index) hasSelectedTarget: root.rootView.targetNodeSelected onAssignToSelected: root.rootView.assignSourceNodeToSelectedItem(sourceNode) + onAddCollection: (collectionName) => { + root.rootView.addCollection(collectionName, + sourceCollectionType, + "", + sourceNode) + } } } } diff --git a/share/qtcreator/qmldesigner/collectionEditorQmlSource/ModelSourceItem.qml b/share/qtcreator/qmldesigner/collectionEditorQmlSource/ModelSourceItem.qml index d04181fd590..00f4b804e41 100644 --- a/share/qtcreator/qmldesigner/collectionEditorQmlSource/ModelSourceItem.qml +++ b/share/qtcreator/qmldesigner/collectionEditorQmlSource/ModelSourceItem.qml @@ -20,10 +20,12 @@ Item { property var collectionModel property bool expanded: false + readonly property bool isJsonModel: sourceCollectionType === "json" signal selectItem(int itemIndex) signal deleteItem() signal assignToSelected() + signal addCollection(string collectionName) function toggleExpanded() { if (collectionListView.count > 0) @@ -169,6 +171,12 @@ Item { closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside + StudioControls.MenuItem { + text: qsTr("Add a model") + visible: root.isJsonModel && internalModels !== undefined + onTriggered: newCollectionDialog.open() + } + StudioControls.MenuItem { text: qsTr("Delete") shortcut: StandardKey.Delete @@ -193,6 +201,21 @@ Item { implicitHeight: StudioTheme.Values.sectionColumnSpacing } + component NameField: Text { + Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter + horizontalAlignment: Qt.AlignRight + verticalAlignment: Qt.AlignCenter + color: StudioTheme.Values.themeTextColor + font.family: StudioTheme.Constants.font.family + font.pixelSize: StudioTheme.Values.baseIconFontSize + } + + component ErrorField: Text { + color: StudioTheme.Values.themeError + font.family: StudioTheme.Constants.font.family + font.pixelSize: StudioTheme.Values.baseIconFontSize + } + StudioControls.Dialog { id: deleteDialog @@ -292,6 +315,71 @@ Item { } } + StudioControls.Dialog { + id: newCollectionDialog + + title: qsTr("Add a new model") + + onOpened: newCollectionName.text = qsTr("Model") + + onAccepted: root.addCollection(newCollectionName.text) + + contentItem: ColumnLayout { + spacing: 2 + + NameField { + text: qsTr("The model name") + } + + StudioControls.TextField { + id: newCollectionName + + readonly property bool isValid: newCollectionName.text !== "" && !newCollectionName.alreadyExists + property bool alreadyExists + + Layout.fillWidth: true + + actionIndicator.visible: false + translationIndicator.visible: false + validator: RegularExpressionValidator { + regularExpression: /^\w+$/ + } + + Keys.onEnterPressed: createCollectionButton.onClicked() + Keys.onReturnPressed: createCollectionButton.onClicked() + Keys.onEscapePressed: newCollectionDialog.reject() + + onTextChanged: newCollectionName.alreadyExists = internalModels.contains(newCollectionName.text) + } + + ErrorField { + text: qsTr("The model name already exists %1").arg(newCollectionName.text) + visible: newCollectionName.alreadyExists + } + + Spacer{} + + RowLayout { + Layout.alignment: Qt.AlignRight | Qt.AlignVCenter + spacing: StudioTheme.Values.sectionRowSpacing + + HelperWidgets.Button { + id: createCollectionButton + + Layout.alignment: Qt.AlignRight | Qt.AlignVCenter + text: qsTr("Add") + enabled: newCollectionName.isValid + onClicked: newCollectionDialog.accept() + } + + HelperWidgets.Button { + text: qsTr("Cancel") + onClicked: newCollectionDialog.reject() + } + } + } + } + RegularExpressionValidator { id: newNameValidator regularExpression: /^\w+$/ diff --git a/share/qtcreator/qmldesigner/collectionEditorQmlSource/NewCollectionDialog.qml b/share/qtcreator/qmldesigner/collectionEditorQmlSource/NewCollectionDialog.qml index ee5dba02706..bfe985a0f52 100644 --- a/share/qtcreator/qmldesigner/collectionEditorQmlSource/NewCollectionDialog.qml +++ b/share/qtcreator/qmldesigner/collectionEditorQmlSource/NewCollectionDialog.qml @@ -14,7 +14,7 @@ import CollectionEditor 1.0 StudioControls.Dialog { id: root - enum SourceType { NewJson, NewCsv, ExistingCollection, NewCollectionToJson } + enum SourceType { NewJson, NewCsv, ExistingCollection } required property var backendValue required property var sourceModel @@ -72,11 +72,6 @@ StudioControls.Dialog { newCollectionPath.enabled = true jsonCollections.enabled = false typeMode.collectionType = "existing" - } else if (typeMode.currentValue === NewCollectionDialog.SourceType.NewCollectionToJson) { - newCollectionFileDialog.nameFilters = [""] - newCollectionPath.enabled = false - jsonCollections.enabled = true - typeMode.collectionType = "json" } } @@ -135,7 +130,6 @@ StudioControls.Dialog { ListElement { text: qsTr("New JSON model group"); value: NewCollectionDialog.SourceType.NewJson} ListElement { text: qsTr("New CSV model"); value: NewCollectionDialog.SourceType.NewCsv} ListElement { text: qsTr("Import an existing model group"); value: NewCollectionDialog.SourceType.ExistingCollection} - ListElement { text: qsTr("Add a model to an available JSON model group"); value: NewCollectionDialog.SourceType.NewCollectionToJson} } textRole: "text" diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectioneditorutils.cpp b/src/plugins/qmldesigner/components/collectioneditor/collectioneditorutils.cpp index c7b3d9a23da..0d857401e28 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/collectioneditorutils.cpp +++ b/src/plugins/qmldesigner/components/collectioneditor/collectioneditorutils.cpp @@ -15,6 +15,8 @@ #include #include +#include +#include #include namespace { @@ -125,4 +127,14 @@ QString getSourceCollectionPath(const ModelNode &node) .toFSPathString(); } +QJsonArray defaultCollectionArray() +{ + QJsonObject initialObject; + QJsonArray initialCollection; + + initialObject.insert("Column1", ""); + initialCollection.append(initialObject); + return initialCollection; +} + } // namespace QmlDesigner::CollectionEditor diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectioneditorutils.h b/src/plugins/qmldesigner/components/collectioneditor/collectioneditorutils.h index 1f7bdb87977..de0be4c72a4 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/collectioneditorutils.h +++ b/src/plugins/qmldesigner/components/collectioneditor/collectioneditorutils.h @@ -5,6 +5,10 @@ #include "collectiondetails.h" +QT_BEGIN_NAMESPACE +class QJsonArray; +QT_END_NAMESPACE + namespace QmlDesigner::CollectionEditor { bool variantIslessThan(const QVariant &a, const QVariant &b, CollectionDetails::DataType type); @@ -19,4 +23,6 @@ void assignCollectionSourceToNode(AbstractView *view, bool canAcceptCollectionAsModel(const ModelNode &node); +QJsonArray defaultCollectionArray(); + } // namespace QmlDesigner::CollectionEditor diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectionsourcemodel.cpp b/src/plugins/qmldesigner/components/collectioneditor/collectionsourcemodel.cpp index df7e90f3312..12f8dd099c9 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/collectionsourcemodel.cpp +++ b/src/plugins/qmldesigner/components/collectioneditor/collectionsourcemodel.cpp @@ -305,7 +305,7 @@ bool CollectionSourceModel::addCollectionToSource(const ModelNode &node, if (document.isObject()) { QJsonObject sourceObject = document.object(); - sourceObject.insert(collectionName, QJsonArray{}); + sourceObject.insert(collectionName, CollectionEditor::defaultCollectionArray()); document.setObject(sourceObject); if (!jsonFile.resize(0)) return returnError(tr("Can't clean \"%1\".").arg(sourceFileInfo.absoluteFilePath())); diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectionwidget.cpp b/src/plugins/qmldesigner/components/collectioneditor/collectionwidget.cpp index 5b5836863ba..54eeedf7352 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/collectionwidget.cpp +++ b/src/plugins/qmldesigner/components/collectioneditor/collectionwidget.cpp @@ -201,12 +201,7 @@ bool CollectionWidget::addCollection(const QString &collectionName, if (collectionType == "json") { QJsonObject jsonObject; - QJsonObject initialObject; - QJsonArray initialCollection; - - initialObject.insert("Column1", ""); - initialCollection.append(initialObject); - jsonObject.insert(collectionName, initialCollection); + jsonObject.insert(collectionName, CollectionEditor::defaultCollectionArray()); QFile sourceFile(sourcePath); if (!sourceFile.open(QFile::WriteOnly)) {