forked from qt-creator/qt-creator
QmlDesigner: Connect collection save functionality to UI
Task-number: QDS-10922 Change-Id: I9d2d930b8203b76d40e0ce1c83351e490509020e Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io> Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io> Reviewed-by: Qt CI Patch Build Bot <ci_patchbuild_bot@qt.io>
This commit is contained in:
@@ -2,15 +2,18 @@
|
|||||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||||
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
|
import Qt.labs.platform as PlatformWidgets
|
||||||
import HelperWidgets 2.0 as HelperWidgets
|
import HelperWidgets 2.0 as HelperWidgets
|
||||||
import StudioControls 1.0 as StudioControls
|
import StudioControls 1.0 as StudioControls
|
||||||
import StudioTheme 1.0 as StudioTheme
|
import StudioTheme 1.0 as StudioTheme
|
||||||
|
import CollectionEditorBackend
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
property real iconHeight: 20
|
property real iconHeight: 20
|
||||||
required property var model
|
required property var model
|
||||||
|
required property var backend
|
||||||
property int selectedRow: -1
|
property int selectedRow: -1
|
||||||
|
|
||||||
implicitHeight: 30
|
implicitHeight: 30
|
||||||
@@ -96,6 +99,64 @@ Item {
|
|||||||
top: parent.top
|
top: parent.top
|
||||||
bottom: parent.bottom
|
bottom: parent.bottom
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IconButton {
|
||||||
|
icon: StudioTheme.Constants.updateContent_medium
|
||||||
|
tooltip: qsTr("Update existing file with changes")
|
||||||
|
enabled: root.model.collectionName !== ""
|
||||||
|
onClicked:
|
||||||
|
{
|
||||||
|
if (root.backend.selectedSourceAddress().indexOf("json") !== -1)
|
||||||
|
root.model.exportCollection(root.backend.selectedSourceAddress(), root.model.collectionName, "JSON")
|
||||||
|
else
|
||||||
|
root.model.exportCollection(root.backend.selectedSourceAddress(), root.model.collectionName, "CSV")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IconButton {
|
||||||
|
icon: StudioTheme.Constants.export_medium
|
||||||
|
tooltip: qsTr("Export collection to a new file")
|
||||||
|
enabled: root.model.collectionName !== ""
|
||||||
|
onClicked: exportMenu.popup()
|
||||||
|
}
|
||||||
|
|
||||||
|
StudioControls.Menu {
|
||||||
|
id: exportMenu
|
||||||
|
|
||||||
|
StudioControls.MenuItem {
|
||||||
|
text: qsTr("Export as JSON")
|
||||||
|
onTriggered:
|
||||||
|
{
|
||||||
|
fileDialog.defaultSuffix = "json"
|
||||||
|
fileDialog.open()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
StudioControls.MenuItem {
|
||||||
|
text: qsTr("Export as CSV")
|
||||||
|
onTriggered:
|
||||||
|
{
|
||||||
|
fileDialog.defaultSuffix = "csv"
|
||||||
|
fileDialog.open()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PlatformWidgets.FileDialog {
|
||||||
|
id: fileDialog
|
||||||
|
fileMode: PlatformWidgets.FileDialog.SaveFile
|
||||||
|
onAccepted:
|
||||||
|
{
|
||||||
|
var fileAddress = file.toString()
|
||||||
|
|
||||||
|
if (fileAddress.indexOf("json") !== -1)
|
||||||
|
root.model.exportCollection(fileAddress, root.model.collectionName, "JSON")
|
||||||
|
else if (fileAddress.indexOf("csv") !== -1)
|
||||||
|
root.model.exportCollection(fileAddress, root.model.collectionName, "CSV")
|
||||||
|
|
||||||
|
fileDialog.reject()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ Rectangle {
|
|||||||
id: root
|
id: root
|
||||||
|
|
||||||
required property var model
|
required property var model
|
||||||
|
required property var backend
|
||||||
|
|
||||||
implicitWidth: 600
|
implicitWidth: 600
|
||||||
implicitHeight: 400
|
implicitHeight: 400
|
||||||
@@ -60,6 +61,7 @@ Rectangle {
|
|||||||
CollectionDetailsToolbar {
|
CollectionDetailsToolbar {
|
||||||
id: toolbar
|
id: toolbar
|
||||||
model: root.model
|
model: root.model
|
||||||
|
backend: root.backend
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -144,6 +144,7 @@ Item {
|
|||||||
|
|
||||||
CollectionDetailsView {
|
CollectionDetailsView {
|
||||||
model: root.collectionDetailsModel
|
model: root.collectionDetailsModel
|
||||||
|
backend: root.model
|
||||||
anchors {
|
anchors {
|
||||||
left: collectionsRect.right
|
left: collectionsRect.right
|
||||||
right: parent.right
|
right: parent.right
|
||||||
|
|||||||
@@ -392,6 +392,22 @@ void CollectionDetailsModel::loadCollection(const ModelNode &sourceNode, const Q
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CollectionDetailsModel::exportCollection(const QString &path, const QString &collectionName, const QString &exportType)
|
||||||
|
{
|
||||||
|
QUrl url(path);
|
||||||
|
QString fileAddress = url.isLocalFile() ? url.toLocalFile() : path;
|
||||||
|
|
||||||
|
if (exportType == "JSON") {
|
||||||
|
QJsonArray content = m_currentCollection.getJsonCollection();
|
||||||
|
return saveCollectionAsJson(fileAddress, content, collectionName);
|
||||||
|
} else if (exportType == "CSV") {
|
||||||
|
QString content = m_currentCollection.getCsvCollection();
|
||||||
|
return saveCollectionAsCsv(fileAddress, content);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void CollectionDetailsModel::updateEmpty()
|
void CollectionDetailsModel::updateEmpty()
|
||||||
{
|
{
|
||||||
bool isEmptyNow = rowCount() == 0;
|
bool isEmptyNow = rowCount() == 0;
|
||||||
@@ -527,24 +543,32 @@ void CollectionDetailsModel::setCollectionName(const QString &newCollectionName)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CollectionDetailsModel::saveCollectionAsJson(const QString &collection, const QJsonArray &content, const QString &source)
|
bool CollectionDetailsModel::saveCollectionAsJson(const QString &path, const QJsonArray &content, const QString &collectionName)
|
||||||
{
|
{
|
||||||
QFile sourceFile(source);
|
QFile sourceFile(path);
|
||||||
if (sourceFile.open(QFile::ReadWrite)) {
|
QJsonDocument document;
|
||||||
|
|
||||||
|
if (sourceFile.exists() && sourceFile.open(QFile::ReadWrite)) {
|
||||||
QJsonParseError jpe;
|
QJsonParseError jpe;
|
||||||
QJsonDocument document = QJsonDocument::fromJson(sourceFile.readAll(), &jpe);
|
document = QJsonDocument::fromJson(sourceFile.readAll(), &jpe);
|
||||||
|
|
||||||
if (jpe.error == QJsonParseError::NoError) {
|
if (jpe.error == QJsonParseError::NoError) {
|
||||||
QJsonObject collectionMap = document.object();
|
QJsonObject collectionMap = document.object();
|
||||||
collectionMap[collection] = content;
|
collectionMap[collectionName] = content;
|
||||||
document.setObject(collectionMap);
|
document.setObject(collectionMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
sourceFile.resize(0);
|
sourceFile.resize(0);
|
||||||
if (sourceFile.write(document.toJson()))
|
|
||||||
return true;
|
} else if (sourceFile.open(QFile::WriteOnly)) {
|
||||||
|
QJsonObject collection;
|
||||||
|
collection[collectionName] = content;
|
||||||
|
document.setObject(collection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sourceFile.write(document.toJson()))
|
||||||
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -53,15 +53,15 @@ public:
|
|||||||
Q_INVOKABLE bool selectColumn(int section);
|
Q_INVOKABLE bool selectColumn(int section);
|
||||||
Q_INVOKABLE bool renameColumn(int section, const QString &newValue);
|
Q_INVOKABLE bool renameColumn(int section, const QString &newValue);
|
||||||
Q_INVOKABLE bool setPropertyType(int column, const QString &newValue, bool force = false);
|
Q_INVOKABLE bool setPropertyType(int column, const QString &newValue, bool force = false);
|
||||||
|
|
||||||
Q_INVOKABLE bool selectRow(int row);
|
Q_INVOKABLE bool selectRow(int row);
|
||||||
|
|
||||||
Q_INVOKABLE void deselectAll();
|
Q_INVOKABLE void deselectAll();
|
||||||
|
|
||||||
static Q_INVOKABLE QStringList typesList();
|
static Q_INVOKABLE QStringList typesList();
|
||||||
|
|
||||||
void loadCollection(const ModelNode &sourceNode, const QString &collection);
|
void loadCollection(const ModelNode &sourceNode, const QString &collection);
|
||||||
|
|
||||||
|
Q_INVOKABLE bool exportCollection(const QString &path, const QString &collectionName, const QString &exportType);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void collectionNameChanged(const QString &collectionName);
|
void collectionNameChanged(const QString &collectionName);
|
||||||
void selectedColumnChanged(int);
|
void selectedColumnChanged(int);
|
||||||
@@ -78,7 +78,7 @@ private:
|
|||||||
void setCollectionName(const QString &newCollectionName);
|
void setCollectionName(const QString &newCollectionName);
|
||||||
void loadJsonCollection(const QString &source, const QString &collection);
|
void loadJsonCollection(const QString &source, const QString &collection);
|
||||||
void loadCsvCollection(const QString &source, const QString &collectionName);
|
void loadCsvCollection(const QString &source, const QString &collectionName);
|
||||||
bool saveCollectionAsJson(const QString &collection, const QJsonArray &content, const QString &source);
|
bool saveCollectionAsJson(const QString &path, const QJsonArray &content, const QString &collectionName);
|
||||||
bool saveCollectionAsCsv(const QString &path, const QString &content);
|
bool saveCollectionAsCsv(const QString &path, const QString &content);
|
||||||
|
|
||||||
QHash<CollectionReference, CollectionDetails> m_openedCollections;
|
QHash<CollectionReference, CollectionDetails> m_openedCollections;
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ public:
|
|||||||
void updateNodeSource(const ModelNode &node);
|
void updateNodeSource(const ModelNode &node);
|
||||||
void updateNodeId(const ModelNode &node);
|
void updateNodeId(const ModelNode &node);
|
||||||
|
|
||||||
QString selectedSourceAddress() const;
|
Q_INVOKABLE QString selectedSourceAddress() const;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void selectedIndexChanged(int idx);
|
void selectedIndexChanged(int idx);
|
||||||
|
|||||||
@@ -167,4 +167,5 @@ void CollectionWidget::warn(const QString &title, const QString &body)
|
|||||||
Q_ARG(QVariant, title),
|
Q_ARG(QVariant, title),
|
||||||
Q_ARG(QVariant, body));
|
Q_ARG(QVariant, body));
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace QmlDesigner
|
} // namespace QmlDesigner
|
||||||
|
|||||||
Reference in New Issue
Block a user