QmlDesigner: Move CollectionEditor functions to utils

- Collection editor functions are moved to CollectionEditorUtils
  namespace
- Collection import tools functions are also moved to
  CollectionEditorUtils. Also, the former files of import tools are
  deleted since their functions are moved.

Task-number: QDS-11391
Change-Id: I1ec1b2b7568658c1637a4c267989425189f07039
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
This commit is contained in:
Ali Kianian
2023-12-28 11:51:20 +02:00
parent 191db5c9ae
commit 194a34a8f1
15 changed files with 192 additions and 213 deletions

View File

@@ -839,7 +839,6 @@ extend_qtc_plugin(QmlDesigner
collectiondetailssortfiltermodel.cpp collectiondetailssortfiltermodel.h collectiondetailssortfiltermodel.cpp collectiondetailssortfiltermodel.h
collectioneditorconstants.h collectioneditorconstants.h
collectioneditorutils.cpp collectioneditorutils.h collectioneditorutils.cpp collectioneditorutils.h
collectionimporttools.cpp collectionimporttools.h
collectionlistmodel.cpp collectionlistmodel.h collectionlistmodel.cpp collectionlistmodel.h
collectionsourcemodel.cpp collectionsourcemodel.h collectionsourcemodel.cpp collectionsourcemodel.h
collectionview.cpp collectionview.h collectionview.cpp collectionview.h

View File

@@ -28,7 +28,7 @@ const QMap<DataTypeWarning::Warning, QString> DataTypeWarning::dataTypeWarnings
class CollectionDetails::Private class CollectionDetails::Private
{ {
using SourceFormat = CollectionEditor::SourceFormat; using SourceFormat = CollectionEditorConstants::SourceFormat;
public: public:
QList<CollectionProperty> properties; QList<CollectionProperty> properties;
@@ -101,7 +101,7 @@ CollectionDetails::~CollectionDetails() = default;
void CollectionDetails::resetDetails(const QStringList &propertyNames, void CollectionDetails::resetDetails(const QStringList &propertyNames,
const QList<QJsonObject> &elements, const QList<QJsonObject> &elements,
CollectionEditor::SourceFormat format) CollectionEditorConstants::SourceFormat format)
{ {
if (!isValid()) if (!isValid())
return; return;
@@ -295,7 +295,7 @@ CollectionReference CollectionDetails::reference() const
return d->reference; return d->reference;
} }
CollectionEditor::SourceFormat CollectionDetails::sourceFormat() const CollectionEditorConstants::SourceFormat CollectionDetails::sourceFormat() const
{ {
return d->sourceFormat; return d->sourceFormat;
} }

View File

@@ -70,7 +70,7 @@ public:
void resetDetails(const QStringList &propertyNames, void resetDetails(const QStringList &propertyNames,
const QList<QJsonObject> &elements, const QList<QJsonObject> &elements,
CollectionEditor::SourceFormat format); CollectionEditorConstants::SourceFormat format);
void insertColumn(const QString &propertyName, void insertColumn(const QString &propertyName,
int colIdx = -1, int colIdx = -1,
const QVariant &defaultValue = {}, const QVariant &defaultValue = {},
@@ -86,7 +86,7 @@ public:
bool setPropertyType(int column, DataType type); bool setPropertyType(int column, DataType type);
CollectionReference reference() const; CollectionReference reference() const;
CollectionEditor::SourceFormat sourceFormat() const; CollectionEditorConstants::SourceFormat sourceFormat() const;
QVariant data(int row, int column) const; QVariant data(int row, int column) const;
QString propertyAt(int column) const; QString propertyAt(int column) const;
DataType typeAt(int column) const; DataType typeAt(int column) const;

View File

@@ -390,7 +390,7 @@ QStringList CollectionDetailsModel::typesList()
void CollectionDetailsModel::loadCollection(const ModelNode &sourceNode, const QString &collection) void CollectionDetailsModel::loadCollection(const ModelNode &sourceNode, const QString &collection)
{ {
QString fileName = CollectionEditor::getSourceCollectionPath(sourceNode); QString fileName = CollectionEditorUtils::getSourceCollectionPath(sourceNode);
CollectionReference newReference{sourceNode, collection}; CollectionReference newReference{sourceNode, collection};
bool alreadyOpen = m_openedCollections.contains(newReference); bool alreadyOpen = m_openedCollections.contains(newReference);
@@ -405,9 +405,9 @@ void CollectionDetailsModel::loadCollection(const ModelNode &sourceNode, const Q
} else { } else {
deselectAll(); deselectAll();
switchToCollection(newReference); switchToCollection(newReference);
if (sourceNode.type() == CollectionEditor::JSONCOLLECTIONMODEL_TYPENAME) if (sourceNode.type() == CollectionEditorConstants::JSONCOLLECTIONMODEL_TYPENAME)
loadJsonCollection(fileName, collection); loadJsonCollection(fileName, collection);
else if (sourceNode.type() == CollectionEditor::CSVCOLLECTIONMODEL_TYPENAME) else if (sourceNode.type() == CollectionEditorConstants::CSVCOLLECTIONMODEL_TYPENAME)
loadCsvCollection(fileName, collection); loadCsvCollection(fileName, collection);
} }
} }
@@ -467,7 +467,7 @@ void CollectionDetailsModel::closeCurrentCollectionIfSaved()
void CollectionDetailsModel::loadJsonCollection(const QString &source, const QString &collection) void CollectionDetailsModel::loadJsonCollection(const QString &source, const QString &collection)
{ {
using CollectionEditor::SourceFormat; using CollectionEditorConstants::SourceFormat;
QFile sourceFile(source); QFile sourceFile(source);
QJsonArray collectionNodes; QJsonArray collectionNodes;
@@ -512,7 +512,7 @@ void CollectionDetailsModel::loadJsonCollection(const QString &source, const QSt
void CollectionDetailsModel::loadCsvCollection(const QString &source, void CollectionDetailsModel::loadCsvCollection(const QString &source,
[[maybe_unused]] const QString &collectionName) [[maybe_unused]] const QString &collectionName)
{ {
using CollectionEditor::SourceFormat; using CollectionEditorConstants::SourceFormat;
QFile sourceFile(source); QFile sourceFile(source);
QStringList headers; QStringList headers;
@@ -601,8 +601,8 @@ bool CollectionDetailsModel::saveCollection(const QString &filePath, CollectionD
bool saved = false; bool saved = false;
const ModelNode node = m_currentCollection.reference().node; const ModelNode node = m_currentCollection.reference().node;
QString path = CollectionEditor::getSourceCollectionPath(node); QString path = CollectionEditorUtils::getSourceCollectionPath(node);
QString saveFormat = CollectionEditor::getSourceCollectionType(node); QString saveFormat = CollectionEditorUtils::getSourceCollectionType(node);
QFile sourceFile(path); QFile sourceFile(path);

View File

@@ -80,7 +80,9 @@ bool CollectionDetailsSortFilterModel::lessThan(const QModelIndex &sourceleft,
if (sourceleft.column() == sourceRight.column()) { if (sourceleft.column() == sourceRight.column()) {
int column = sourceleft.column(); int column = sourceleft.column();
CollectionDetails::DataType columnType = m_source->propertyDataType(column); CollectionDetails::DataType columnType = m_source->propertyDataType(column);
return CollectionEditor::variantIslessThan(sourceleft.data(), sourceRight.data(), columnType); return CollectionEditorUtils::variantIslessThan(sourceleft.data(),
sourceRight.data(),
columnType);
} }
return false; return false;

View File

@@ -3,7 +3,7 @@
#pragma once #pragma once
namespace QmlDesigner::CollectionEditor { namespace QmlDesigner::CollectionEditorConstants {
enum class SourceFormat { Unknown, Json, Csv }; enum class SourceFormat { Unknown, Json, Csv };
@@ -17,4 +17,4 @@ inline constexpr char CSVCOLLECTIONMODEL_TYPENAME[] = "QtQuick.Studio.Ut
inline constexpr char JSONCOLLECTIONCHILDMODEL_TYPENAME[] = "QtQuick.Studio.Utils.ChildListModel"; inline constexpr char JSONCOLLECTIONCHILDMODEL_TYPENAME[] = "QtQuick.Studio.Utils.ChildListModel";
inline constexpr char JSONBACKEND_TYPENAME[] = "JsonData"; inline constexpr char JSONBACKEND_TYPENAME[] = "JsonData";
} // namespace QmlDesigner::CollectionEditor } // namespace QmlDesigner::CollectionEditorConstants

View File

@@ -18,7 +18,10 @@
#include <QColor> #include <QColor>
#include <QJsonArray> #include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject> #include <QJsonObject>
#include <QJsonParseError>
#include <QJsonValue>
#include <QUrl> #include <QUrl>
namespace { namespace {
@@ -104,32 +107,32 @@ inline Utils::FilePath qmlDirFilePath()
} // namespace } // namespace
namespace QmlDesigner::CollectionEditor { namespace QmlDesigner::CollectionEditorUtils {
bool variantIslessThan(const QVariant &a, const QVariant &b, CollectionDetails::DataType type) bool variantIslessThan(const QVariant &a, const QVariant &b, CollectionDetails::DataType type)
{ {
return std::visit(LessThanVisitor{}, valueToVariant(a, type), valueToVariant(b, type)); return std::visit(LessThanVisitor{}, valueToVariant(a, type), valueToVariant(b, type));
} }
SourceFormat getSourceCollectionFormat(const ModelNode &node) CollectionEditorConstants::SourceFormat getSourceCollectionFormat(const ModelNode &node)
{ {
using namespace QmlDesigner; using namespace QmlDesigner;
if (node.type() == CollectionEditor::JSONCOLLECTIONMODEL_TYPENAME) if (node.type() == CollectionEditorConstants::JSONCOLLECTIONMODEL_TYPENAME)
return CollectionEditor::SourceFormat::Json; return CollectionEditorConstants::SourceFormat::Json;
if (node.type() == CollectionEditor::CSVCOLLECTIONMODEL_TYPENAME) if (node.type() == CollectionEditorConstants::CSVCOLLECTIONMODEL_TYPENAME)
return CollectionEditor::SourceFormat::Csv; return CollectionEditorConstants::SourceFormat::Csv;
return CollectionEditor::SourceFormat::Unknown; return CollectionEditorConstants::SourceFormat::Unknown;
} }
QString getSourceCollectionType(const ModelNode &node) QString getSourceCollectionType(const ModelNode &node)
{ {
using namespace QmlDesigner; using namespace QmlDesigner;
if (node.type() == CollectionEditor::JSONCOLLECTIONMODEL_TYPENAME) if (node.type() == CollectionEditorConstants::JSONCOLLECTIONMODEL_TYPENAME)
return "json"; return "json";
if (node.type() == CollectionEditor::CSVCOLLECTIONMODEL_TYPENAME) if (node.type() == CollectionEditorConstants::CSVCOLLECTIONMODEL_TYPENAME)
return "csv"; return "csv";
return {}; return {};
@@ -280,4 +283,101 @@ bool ensureDataStoreExists(bool &justCreated)
return false; return false;
} }
} // namespace QmlDesigner::CollectionEditor QJsonArray loadAsSingleJsonCollection(const QUrl &url)
{
QFile file(url.isLocalFile() ? url.toLocalFile() : url.toString());
QJsonArray collection;
QByteArray jsonData;
if (file.open(QFile::ReadOnly))
jsonData = file.readAll();
file.close();
if (jsonData.isEmpty())
return {};
QJsonParseError parseError;
QJsonDocument document = QJsonDocument::fromJson(jsonData, &parseError);
if (parseError.error != QJsonParseError::NoError)
return {};
auto refineJsonArray = [](const QJsonArray &array) -> QJsonArray {
QJsonArray resultArray;
for (const QJsonValue &collectionData : array) {
if (collectionData.isObject()) {
QJsonObject rowObject = collectionData.toObject();
const QStringList rowKeys = rowObject.keys();
for (const QString &key : rowKeys) {
QJsonValue cellValue = rowObject.value(key);
if (cellValue.isArray())
rowObject.remove(key);
}
resultArray.push_back(rowObject);
}
}
return resultArray;
};
if (document.isArray()) {
collection = refineJsonArray(document.array());
} else if (document.isObject()) {
QJsonObject documentObject = document.object();
const QStringList mainKeys = documentObject.keys();
bool arrayFound = false;
for (const QString &key : mainKeys) {
const QJsonValue &value = documentObject.value(key);
if (value.isArray()) {
arrayFound = true;
collection = refineJsonArray(value.toArray());
break;
}
}
if (!arrayFound) {
QJsonObject singleObject;
for (const QString &key : mainKeys) {
const QJsonValue value = documentObject.value(key);
if (!value.isObject())
singleObject.insert(key, value);
}
collection.push_back(singleObject);
}
}
return collection;
}
QJsonArray loadAsCsvCollection(const QUrl &url)
{
QFile sourceFile(url.isLocalFile() ? url.toLocalFile() : url.toString());
QStringList headers;
QJsonArray elements;
if (sourceFile.open(QFile::ReadOnly)) {
QTextStream stream(&sourceFile);
if (!stream.atEnd())
headers = stream.readLine().split(',');
for (QString &header : headers)
header = header.trimmed();
if (!headers.isEmpty()) {
while (!stream.atEnd()) {
const QStringList recordDataList = stream.readLine().split(',');
int column = -1;
QJsonObject recordData;
for (const QString &cellData : recordDataList) {
if (++column == headers.size())
break;
recordData.insert(headers.at(column), cellData);
}
elements.append(recordData);
}
}
}
return elements;
}
} // namespace QmlDesigner::CollectionEditorUtils

View File

@@ -14,11 +14,11 @@ namespace Utils {
class FilePath; class FilePath;
} }
namespace QmlDesigner::CollectionEditor { namespace QmlDesigner::CollectionEditorUtils {
bool variantIslessThan(const QVariant &a, const QVariant &b, CollectionDetails::DataType type); bool variantIslessThan(const QVariant &a, const QVariant &b, CollectionDetails::DataType type);
SourceFormat getSourceCollectionFormat(const QmlDesigner::ModelNode &node); CollectionEditorConstants::SourceFormat getSourceCollectionFormat(const QmlDesigner::ModelNode &node);
QString getSourceCollectionType(const QmlDesigner::ModelNode &node); QString getSourceCollectionType(const QmlDesigner::ModelNode &node);
@@ -36,4 +36,8 @@ bool canAcceptCollectionAsModel(const ModelNode &node);
QJsonArray defaultCollectionArray(); QJsonArray defaultCollectionArray();
} // namespace QmlDesigner::CollectionEditor QJsonArray loadAsSingleJsonCollection(const QUrl &url);
QJsonArray loadAsCsvCollection(const QUrl &url);
} // namespace QmlDesigner::CollectionEditorUtils

View File

@@ -1,113 +0,0 @@
// Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include "collectionimporttools.h"
#include <QFile>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonParseError>
#include <QJsonValue>
#include <QUrl>
namespace QmlDesigner::CollectionEditor::ImportTools {
QJsonArray loadAsSingleJsonCollection(const QUrl &url)
{
QFile file(url.isLocalFile() ? url.toLocalFile() : url.toString());
QJsonArray collection;
QByteArray jsonData;
if (file.open(QFile::ReadOnly))
jsonData = file.readAll();
file.close();
if (jsonData.isEmpty())
return {};
QJsonParseError parseError;
QJsonDocument document = QJsonDocument::fromJson(jsonData, &parseError);
if (parseError.error != QJsonParseError::NoError)
return {};
auto refineJsonArray = [](const QJsonArray &array) -> QJsonArray {
QJsonArray resultArray;
for (const QJsonValue &collectionData : array) {
if (collectionData.isObject()) {
QJsonObject rowObject = collectionData.toObject();
const QStringList rowKeys = rowObject.keys();
for (const QString &key : rowKeys) {
QJsonValue cellValue = rowObject.value(key);
if (cellValue.isArray())
rowObject.remove(key);
}
resultArray.push_back(rowObject);
}
}
return resultArray;
};
if (document.isArray()) {
collection = refineJsonArray(document.array());
} else if (document.isObject()) {
QJsonObject documentObject = document.object();
const QStringList mainKeys = documentObject.keys();
bool arrayFound = false;
for (const QString &key : mainKeys) {
const QJsonValue &value = documentObject.value(key);
if (value.isArray()) {
arrayFound = true;
collection = refineJsonArray(value.toArray());
break;
}
}
if (!arrayFound) {
QJsonObject singleObject;
for (const QString &key : mainKeys) {
const QJsonValue value = documentObject.value(key);
if (!value.isObject())
singleObject.insert(key, value);
}
collection.push_back(singleObject);
}
}
return collection;
}
QJsonArray loadAsCsvCollection(const QUrl &url)
{
QFile sourceFile(url.isLocalFile() ? url.toLocalFile() : url.toString());
QStringList headers;
QJsonArray elements;
if (sourceFile.open(QFile::ReadOnly)) {
QTextStream stream(&sourceFile);
if (!stream.atEnd())
headers = stream.readLine().split(',');
for (QString &header : headers)
header = header.trimmed();
if (!headers.isEmpty()) {
while (!stream.atEnd()) {
const QStringList recordDataList = stream.readLine().split(',');
int column = -1;
QJsonObject recordData;
for (const QString &cellData : recordDataList) {
if (++column == headers.size())
break;
recordData.insert(headers.at(column), cellData);
}
elements.append(recordData);
}
}
}
return elements;
}
} // namespace QmlDesigner::CollectionEditor::ImportTools

View File

@@ -1,18 +0,0 @@
// Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#pragma once
#include <QtCore/qtconfigmacros.h>
QT_BEGIN_NAMESPACE
class QJsonArray;
class QUrl;
QT_END_NAMESPACE
namespace QmlDesigner::CollectionEditor::ImportTools {
QJsonArray loadAsSingleJsonCollection(const QUrl &url);
QJsonArray loadAsCsvCollection(const QUrl &url);
} // namespace QmlDesigner::CollectionEditor::ImportTools

View File

@@ -29,7 +29,7 @@ namespace QmlDesigner {
CollectionListModel::CollectionListModel(const ModelNode &sourceModel) CollectionListModel::CollectionListModel(const ModelNode &sourceModel)
: QStringListModel() : QStringListModel()
, m_sourceNode(sourceModel) , m_sourceNode(sourceModel)
, m_sourceType(CollectionEditor::getSourceCollectionType(sourceModel)) , m_sourceType(CollectionEditorUtils::getSourceCollectionType(sourceModel))
{ {
connect(this, &CollectionListModel::modelReset, this, &CollectionListModel::updateEmpty); connect(this, &CollectionListModel::modelReset, this, &CollectionListModel::updateEmpty);
connect(this, &CollectionListModel::rowsRemoved, this, &CollectionListModel::updateEmpty); connect(this, &CollectionListModel::rowsRemoved, this, &CollectionListModel::updateEmpty);
@@ -121,7 +121,7 @@ ModelNode CollectionListModel::sourceNode() const
QString CollectionListModel::sourceAddress() const QString CollectionListModel::sourceAddress() const
{ {
return CollectionEditor::getSourceCollectionPath(m_sourceNode); return CollectionEditorUtils::getSourceCollectionPath(m_sourceNode);
} }
bool CollectionListModel::contains(const QString &collectionName) const bool CollectionListModel::contains(const QString &collectionName) const

View File

@@ -25,7 +25,8 @@ QSharedPointer<QmlDesigner::CollectionListModel> loadCollection(
const QmlDesigner::ModelNode &sourceNode, const QmlDesigner::ModelNode &sourceNode,
QSharedPointer<QmlDesigner::CollectionListModel> initialCollection = {}) QSharedPointer<QmlDesigner::CollectionListModel> initialCollection = {})
{ {
using namespace QmlDesigner::CollectionEditor; using namespace QmlDesigner::CollectionEditorConstants;
using namespace QmlDesigner::CollectionEditorUtils;
QString sourceFileAddress = getSourceCollectionPath(sourceNode); QString sourceFileAddress = getSourceCollectionPath(sourceNode);
QSharedPointer<QmlDesigner::CollectionListModel> collectionsList; QSharedPointer<QmlDesigner::CollectionListModel> collectionsList;
@@ -88,9 +89,9 @@ QVariant CollectionSourceModel::data(const QModelIndex &index, int role) const
case NodeRole: case NodeRole:
return QVariant::fromValue(*collectionSource); return QVariant::fromValue(*collectionSource);
case CollectionTypeRole: case CollectionTypeRole:
return CollectionEditor::getSourceCollectionType(*collectionSource); return CollectionEditorUtils::getSourceCollectionType(*collectionSource);
case SourceRole: case SourceRole:
return collectionSource->variantProperty(CollectionEditor::SOURCEFILE_PROPERTY).value(); return collectionSource->variantProperty(CollectionEditorConstants::SOURCEFILE_PROPERTY).value();
case SelectedRole: case SelectedRole:
return index.row() == m_selectedIndex; return index.row() == m_selectedIndex;
case CollectionsRole: case CollectionsRole:
@@ -116,7 +117,8 @@ bool CollectionSourceModel::setData(const QModelIndex &index, const QVariant &va
collectionName.setValue(value.toString()); collectionName.setValue(value.toString());
} break; } break;
case SourceRole: { case SourceRole: {
auto sourceAddress = collectionSource.variantProperty(CollectionEditor::SOURCEFILE_PROPERTY); auto sourceAddress = collectionSource.variantProperty(
CollectionEditorConstants::SOURCEFILE_PROPERTY);
if (sourceAddress.value() == value) if (sourceAddress.value() == value)
return false; return false;
@@ -281,13 +283,13 @@ bool CollectionSourceModel::addCollectionToSource(const ModelNode &node,
if (idx < 0) if (idx < 0)
return returnError(tr("Node is not indexed in the models.")); return returnError(tr("Node is not indexed in the models."));
if (node.type() != CollectionEditor::JSONCOLLECTIONMODEL_TYPENAME) if (node.type() != CollectionEditorConstants::JSONCOLLECTIONMODEL_TYPENAME)
return returnError(tr("Node should be a JSON model.")); return returnError(tr("Node should be a JSON model."));
if (collectionExists(node, collectionName)) if (collectionExists(node, collectionName))
return returnError(tr("A model with the identical name already exists.")); return returnError(tr("A model with the identical name already exists."));
QString sourceFileAddress = CollectionEditor::getSourceCollectionPath(node); QString sourceFileAddress = CollectionEditorUtils::getSourceCollectionPath(node);
QFileInfo sourceFileInfo(sourceFileAddress); QFileInfo sourceFileInfo(sourceFileAddress);
if (!sourceFileInfo.isFile()) if (!sourceFileInfo.isFile())
@@ -424,16 +426,16 @@ void CollectionSourceModel::onCollectionNameChanged(CollectionListModel *collect
return; return;
} }
if (node.type() == CollectionEditor::CSVCOLLECTIONMODEL_TYPENAME) { if (node.type() == CollectionEditorConstants::CSVCOLLECTIONMODEL_TYPENAME) {
if (!setData(nodeIndex, newName, NameRole)) if (!setData(nodeIndex, newName, NameRole))
emitRenameWarning(tr("Can't rename the node")); emitRenameWarning(tr("Can't rename the node"));
return; return;
} else if (node.type() != CollectionEditor::JSONCOLLECTIONMODEL_TYPENAME) { } else if (node.type() != CollectionEditorConstants::JSONCOLLECTIONMODEL_TYPENAME) {
emitRenameWarning(tr("Invalid node type")); emitRenameWarning(tr("Invalid node type"));
return; return;
} }
QString sourceFileAddress = CollectionEditor::getSourceCollectionPath(node); QString sourceFileAddress = CollectionEditorUtils::getSourceCollectionPath(node);
QFileInfo sourceFileInfo(sourceFileAddress); QFileInfo sourceFileInfo(sourceFileAddress);
if (!sourceFileInfo.isFile()) { if (!sourceFileInfo.isFile()) {
@@ -513,15 +515,15 @@ void CollectionSourceModel::onCollectionsRemoved(CollectionListModel *collection
return; return;
} }
if (node.type() == CollectionEditor::CSVCOLLECTIONMODEL_TYPENAME) { if (node.type() == CollectionEditorConstants::CSVCOLLECTIONMODEL_TYPENAME) {
removeSource(node); removeSource(node);
return; return;
} else if (node.type() != CollectionEditor::JSONCOLLECTIONMODEL_TYPENAME) { } else if (node.type() != CollectionEditorConstants::JSONCOLLECTIONMODEL_TYPENAME) {
emitDeleteWarning(tr("Invalid node type")); emitDeleteWarning(tr("Invalid node type"));
return; return;
} }
QString sourceFileAddress = CollectionEditor::getSourceCollectionPath(node); QString sourceFileAddress = CollectionEditorUtils::getSourceCollectionPath(node);
QFileInfo sourceFileInfo(sourceFileAddress); QFileInfo sourceFileInfo(sourceFileAddress);
if (!sourceFileInfo.isFile()) { if (!sourceFileInfo.isFile()) {

View File

@@ -31,7 +31,7 @@ namespace {
inline bool isStudioCollectionModel(const QmlDesigner::ModelNode &node) inline bool isStudioCollectionModel(const QmlDesigner::ModelNode &node)
{ {
using namespace QmlDesigner::CollectionEditor; using namespace QmlDesigner::CollectionEditorConstants;
return node.metaInfo().typeName() == JSONCOLLECTIONMODEL_TYPENAME return node.metaInfo().typeName() == JSONCOLLECTIONMODEL_TYPENAME
|| node.metaInfo().typeName() == CSVCOLLECTIONMODEL_TYPENAME; || node.metaInfo().typeName() == CSVCOLLECTIONMODEL_TYPENAME;
} }
@@ -151,7 +151,7 @@ void CollectionView::variantPropertiesChanged(const QList<VariantProperty> &prop
if (isStudioCollectionModel(node)) { if (isStudioCollectionModel(node)) {
if (property.name() == "objectName") if (property.name() == "objectName")
m_widget->sourceModel()->updateNodeName(node); m_widget->sourceModel()->updateNodeName(node);
else if (property.name() == CollectionEditor::SOURCEFILE_PROPERTY) else if (property.name() == CollectionEditorConstants::SOURCEFILE_PROPERTY)
m_widget->sourceModel()->updateNodeSource(node); m_widget->sourceModel()->updateNodeSource(node);
} }
} }
@@ -169,7 +169,8 @@ void CollectionView::selectedNodesChanged(const QList<ModelNode> &selectedNodeLi
bool singleSelectedHasModelProperty = false; bool singleSelectedHasModelProperty = false;
if (singleNonCollectionNodeSelected) { if (singleNonCollectionNodeSelected) {
const ModelNode selectedNode = selectedNodeList.first(); const ModelNode selectedNode = selectedNodeList.first();
singleSelectedHasModelProperty = CollectionEditor::canAcceptCollectionAsModel(selectedNode); singleSelectedHasModelProperty = CollectionEditorUtils::canAcceptCollectionAsModel(
selectedNode);
} }
m_widget->setTargetNodeSelected(singleSelectedHasModelProperty); m_widget->setTargetNodeSelected(singleSelectedHasModelProperty);
@@ -204,7 +205,7 @@ void CollectionView::addResource(const QUrl &url, const QString &name, const QSt
resourceMetaInfo.majorVersion(), resourceMetaInfo.majorVersion(),
resourceMetaInfo.minorVersion()); resourceMetaInfo.minorVersion());
VariantProperty sourceProperty = resourceNode.variantProperty( VariantProperty sourceProperty = resourceNode.variantProperty(
CollectionEditor::SOURCEFILE_PROPERTY); CollectionEditorConstants::SOURCEFILE_PROPERTY);
VariantProperty nameProperty = resourceNode.variantProperty("objectName"); VariantProperty nameProperty = resourceNode.variantProperty("objectName");
sourceProperty.setValue(sourceAddress); sourceProperty.setValue(sourceAddress);
nameProperty.setValue(name); nameProperty.setValue(name);
@@ -252,18 +253,18 @@ void CollectionView::refreshModel()
NodeMetaInfo CollectionView::jsonCollectionMetaInfo() const NodeMetaInfo CollectionView::jsonCollectionMetaInfo() const
{ {
return model()->metaInfo(CollectionEditor::JSONCOLLECTIONMODEL_TYPENAME); return model()->metaInfo(CollectionEditorConstants::JSONCOLLECTIONMODEL_TYPENAME);
} }
NodeMetaInfo CollectionView::csvCollectionMetaInfo() const NodeMetaInfo CollectionView::csvCollectionMetaInfo() const
{ {
return model()->metaInfo(CollectionEditor::CSVCOLLECTIONMODEL_TYPENAME); return model()->metaInfo(CollectionEditorConstants::CSVCOLLECTIONMODEL_TYPENAME);
} }
void CollectionView::ensureStudioModelImport() void CollectionView::ensureStudioModelImport()
{ {
executeInTransaction(__FUNCTION__, [&] { executeInTransaction(__FUNCTION__, [&] {
Import import = Import::createLibraryImport(CollectionEditor::COLLECTIONMODEL_IMPORT); Import import = Import::createLibraryImport(CollectionEditorConstants::COLLECTIONMODEL_IMPORT);
try { try {
if (!model()->hasImport(import, true, true)) if (!model()->hasImport(import, true, true))
model()->changeImports({import}, {}); model()->changeImports({import}, {});

View File

@@ -6,7 +6,6 @@
#include "collectiondetailsmodel.h" #include "collectiondetailsmodel.h"
#include "collectiondetailssortfiltermodel.h" #include "collectiondetailssortfiltermodel.h"
#include "collectioneditorutils.h" #include "collectioneditorutils.h"
#include "collectionimporttools.h"
#include "collectionsourcemodel.h" #include "collectionsourcemodel.h"
#include "collectionview.h" #include "collectionview.h"
#include "qmldesignerconstants.h" #include "qmldesignerconstants.h"
@@ -216,7 +215,7 @@ bool CollectionWidget::addCollection(const QString &collectionName,
if (collectionType == "json") { if (collectionType == "json") {
QJsonObject jsonObject; QJsonObject jsonObject;
jsonObject.insert(collectionName, CollectionEditor::defaultCollectionArray()); jsonObject.insert(collectionName, CollectionEditorUtils::defaultCollectionArray());
QFile sourceFile(sourcePath); QFile sourceFile(sourcePath);
if (!sourceFile.open(QFile::WriteOnly)) { if (!sourceFile.open(QFile::WriteOnly)) {
@@ -258,10 +257,8 @@ bool CollectionWidget::addCollection(const QString &collectionName,
} }
} else if (collectionType == "json") { } else if (collectionType == "json") {
QString errorMsg; QString errorMsg;
bool added = m_sourceModel->addCollectionToSource(node, bool added = m_sourceModel->addCollectionToSource(
collectionName, node, collectionName, CollectionEditorUtils::defaultCollectionArray(), &errorMsg);
CollectionEditor::defaultCollectionArray(),
&errorMsg);
if (!added) if (!added)
warn(tr("Can not add a model to the JSON file"), errorMsg); warn(tr("Can not add a model to the JSON file"), errorMsg);
return added; return added;
@@ -274,10 +271,10 @@ bool CollectionWidget::importToJson(const QVariant &sourceNode,
const QString &collectionName, const QString &collectionName,
const QUrl &url) const QUrl &url)
{ {
using CollectionEditor::SourceFormat; using CollectionEditorConstants::SourceFormat;
using Utils::FilePath; using Utils::FilePath;
const ModelNode node = sourceNode.value<ModelNode>(); const ModelNode node = sourceNode.value<ModelNode>();
const SourceFormat nodeFormat = CollectionEditor::getSourceCollectionFormat(node); const SourceFormat nodeFormat = CollectionEditorUtils::getSourceCollectionFormat(node);
QTC_ASSERT(node.isValid() && nodeFormat == SourceFormat::Json, return false); QTC_ASSERT(node.isValid() && nodeFormat == SourceFormat::Json, return false);
FilePath fileInfo = FilePath::fromUserInput(url.isLocalFile() ? url.toLocalFile() FilePath fileInfo = FilePath::fromUserInput(url.isLocalFile() ? url.toLocalFile()
@@ -287,9 +284,9 @@ bool CollectionWidget::importToJson(const QVariant &sourceNode,
QJsonArray loadedCollection; QJsonArray loadedCollection;
if (fileInfo.suffix() == "json") if (fileInfo.suffix() == "json")
loadedCollection = CollectionEditor::ImportTools::loadAsSingleJsonCollection(url); loadedCollection = CollectionEditorUtils::loadAsSingleJsonCollection(url);
else if (fileInfo.suffix() == "csv") else if (fileInfo.suffix() == "csv")
loadedCollection = CollectionEditor::ImportTools::loadAsCsvCollection(url); loadedCollection = CollectionEditorUtils::loadAsCsvCollection(url);
if (!loadedCollection.isEmpty()) { if (!loadedCollection.isEmpty()) {
const QString newCollectionName = generateUniqueCollectionName(node, collectionName); const QString newCollectionName = generateUniqueCollectionName(node, collectionName);
@@ -327,7 +324,7 @@ bool CollectionWidget::addCollectionToDataStore(const QString &collectionName)
bool added = m_sourceModel->addCollectionToSource(node, bool added = m_sourceModel->addCollectionToSource(node,
generateUniqueCollectionName(node, generateUniqueCollectionName(node,
collectionName), collectionName),
CollectionEditor::defaultCollectionArray(), CollectionEditorUtils::defaultCollectionArray(),
&errorMsg); &errorMsg);
if (!added) if (!added)
warn(tr("Failed to add a model to the default model group"), errorMsg); warn(tr("Failed to add a model to the default model group"), errorMsg);
@@ -343,7 +340,7 @@ void CollectionWidget::assignCollectionToSelectedNode(const QString collectionNa
void CollectionWidget::ensureDataStoreExists() void CollectionWidget::ensureDataStoreExists()
{ {
bool filesJustCreated = false; bool filesJustCreated = false;
bool filesExist = CollectionEditor::ensureDataStoreExists(filesJustCreated); bool filesExist = CollectionEditorUtils::ensureDataStoreExists(filesJustCreated);
if (filesExist && filesJustCreated) if (filesExist && filesJustCreated)
m_view->resetDataStoreNode(); m_view->resetDataStoreNode();
} }

View File

@@ -41,9 +41,10 @@ QmlDesigner::PropertyNameList createNameList(const QmlDesigner::ModelNode &node)
using QmlDesigner::AbstractProperty; using QmlDesigner::AbstractProperty;
using QmlDesigner::PropertyName; using QmlDesigner::PropertyName;
using QmlDesigner::PropertyNameList; using QmlDesigner::PropertyNameList;
static PropertyNameList defaultsNodeProps = {"id", static PropertyNameList defaultsNodeProps = {
QmlDesigner::CollectionEditor::SOURCEFILE_PROPERTY, "id",
QmlDesigner::CollectionEditor::JSONCHILDMODELNAME_PROPERTY, QmlDesigner::CollectionEditorConstants::SOURCEFILE_PROPERTY,
QmlDesigner::CollectionEditorConstants::JSONCHILDMODELNAME_PROPERTY,
"backend"}; "backend"};
PropertyNameList dynamicPropertyNames = Utils::transform( PropertyNameList dynamicPropertyNames = Utils::transform(
node.dynamicProperties(), node.dynamicProperties(),
@@ -57,8 +58,8 @@ QmlDesigner::PropertyNameList createNameList(const QmlDesigner::ModelNode &node)
bool isValidCollectionPropertyName(const QString &collectionId) bool isValidCollectionPropertyName(const QString &collectionId)
{ {
static const QmlDesigner::PropertyNameList reservedKeywords = { static const QmlDesigner::PropertyNameList reservedKeywords = {
QmlDesigner::CollectionEditor::SOURCEFILE_PROPERTY, QmlDesigner::CollectionEditorConstants::SOURCEFILE_PROPERTY,
QmlDesigner::CollectionEditor::JSONBACKEND_TYPENAME, QmlDesigner::CollectionEditorConstants::JSONBACKEND_TYPENAME,
"backend", "backend",
"models", "models",
}; };
@@ -83,8 +84,9 @@ QMap<QString, QmlDesigner::PropertyName> getModelIdMap(const QmlDesigner::ModelN
continue; continue;
ModelNode childNode = nodeProperty.modelNode(); ModelNode childNode = nodeProperty.modelNode();
if (childNode.hasProperty(CollectionEditor::JSONCHILDMODELNAME_PROPERTY)) { if (childNode.hasProperty(CollectionEditorConstants::JSONCHILDMODELNAME_PROPERTY)) {
QString modelName = childNode.property(CollectionEditor::JSONCHILDMODELNAME_PROPERTY) QString modelName = childNode
.property(CollectionEditorConstants::JSONCHILDMODELNAME_PROPERTY)
.toVariantProperty() .toVariantProperty()
.value() .value()
.toString(); .toString();
@@ -136,15 +138,16 @@ void DataStoreModelNode::reloadModel()
} }
bool forceUpdate = false; bool forceUpdate = false;
const FilePath dataStoreQmlPath = CollectionEditor::dataStoreQmlFilePath(); const FilePath dataStoreQmlPath = CollectionEditorUtils::dataStoreQmlFilePath();
const FilePath dataStoreJsonPath = CollectionEditor::dataStoreJsonFilePath(); const FilePath dataStoreJsonPath = CollectionEditorUtils::dataStoreJsonFilePath();
QUrl dataStoreQmlUrl = dataStoreQmlPath.toUrl(); QUrl dataStoreQmlUrl = dataStoreQmlPath.toUrl();
if (dataStoreQmlPath.exists() && dataStoreJsonPath.exists()) { if (dataStoreQmlPath.exists() && dataStoreJsonPath.exists()) {
if (!m_model.get() || m_model->fileUrl() != dataStoreQmlUrl) { if (!m_model.get() || m_model->fileUrl() != dataStoreQmlUrl) {
m_model = Model::create(CollectionEditor::JSONCOLLECTIONMODEL_TYPENAME, 1, 1); m_model = Model::create(CollectionEditorConstants::JSONCOLLECTIONMODEL_TYPENAME, 1, 1);
forceUpdate = true; forceUpdate = true;
Import import = Import::createLibraryImport(CollectionEditor::COLLECTIONMODEL_IMPORT); Import import = Import::createLibraryImport(
CollectionEditorConstants::COLLECTIONMODEL_IMPORT);
try { try {
if (!m_model->hasImport(import, true, true)) if (!m_model->hasImport(import, true, true))
m_model->changeImports({import}, {}); m_model->changeImports({import}, {});
@@ -247,8 +250,9 @@ void DataStoreModelNode::updateDataStoreProperties()
continue; continue;
ModelNode childNode = nodeProprty.modelNode(); ModelNode childNode = nodeProprty.modelNode();
if (childNode.hasProperty(CollectionEditor::JSONCHILDMODELNAME_PROPERTY)) { if (childNode.hasProperty(CollectionEditorConstants::JSONCHILDMODELNAME_PROPERTY)) {
QString modelName = childNode.property(CollectionEditor::JSONCHILDMODELNAME_PROPERTY) QString modelName = childNode
.property(CollectionEditorConstants::JSONCHILDMODELNAME_PROPERTY)
.toVariantProperty() .toVariantProperty()
.value() .value()
.toString(); .toString();
@@ -271,12 +275,13 @@ void DataStoreModelNode::updateDataStoreProperties()
addCollectionNameToTheModel(collectionName, getUniquePropertyName(collectionName)); addCollectionNameToTheModel(collectionName, getUniquePropertyName(collectionName));
// Backend Property // Backend Property
ModelNode backendNode = model()->createModelNode(CollectionEditor::JSONBACKEND_TYPENAME); ModelNode backendNode = model()->createModelNode(CollectionEditorConstants::JSONBACKEND_TYPENAME);
NodeProperty backendProperty = rootNode.nodeProperty("backend"); NodeProperty backendProperty = rootNode.nodeProperty("backend");
backendProperty.setDynamicTypeNameAndsetModelNode(CollectionEditor::JSONBACKEND_TYPENAME, backendProperty.setDynamicTypeNameAndsetModelNode(CollectionEditorConstants::JSONBACKEND_TYPENAME,
backendNode); backendNode);
// Source Property // Source Property
VariantProperty sourceProp = rootNode.variantProperty(CollectionEditor::SOURCEFILE_PROPERTY); VariantProperty sourceProp = rootNode.variantProperty(
CollectionEditorConstants::SOURCEFILE_PROPERTY);
sourceProp.setValue(m_dataRelativePath); sourceProp.setValue(m_dataRelativePath);
} }
@@ -321,7 +326,7 @@ void DataStoreModelNode::addCollectionNameToTheModel(const QString &collectionNa
ModelNode collectionNode = model()->createModelNode(CHILDLISTMODEL_TYPENAME); ModelNode collectionNode = model()->createModelNode(CHILDLISTMODEL_TYPENAME);
VariantProperty modelNameProperty = collectionNode.variantProperty( VariantProperty modelNameProperty = collectionNode.variantProperty(
CollectionEditor::JSONCHILDMODELNAME_PROPERTY); CollectionEditorConstants::JSONCHILDMODELNAME_PROPERTY);
modelNameProperty.setValue(collectionName); modelNameProperty.setValue(collectionName);
NodeProperty nodeProp = rootNode.nodeProperty(dataStorePropertyName); NodeProperty nodeProp = rootNode.nodeProperty(dataStorePropertyName);
@@ -393,7 +398,7 @@ void DataStoreModelNode::renameCollection(const QString &oldName, const QString
NodeProperty collectionNode = dataStoreNode.property(oldPropertyName).toNodeProperty(); NodeProperty collectionNode = dataStoreNode.property(oldPropertyName).toNodeProperty();
if (collectionNode.isValid()) { if (collectionNode.isValid()) {
VariantProperty modelNameProperty = collectionNode.modelNode().variantProperty( VariantProperty modelNameProperty = collectionNode.modelNode().variantProperty(
CollectionEditor::JSONCHILDMODELNAME_PROPERTY); CollectionEditorConstants::JSONCHILDMODELNAME_PROPERTY);
modelNameProperty.setValue(newName); modelNameProperty.setValue(newName);
m_collectionPropertyNames.remove(oldName); m_collectionPropertyNames.remove(oldName);
m_collectionPropertyNames.insert(newName, collectionNode.name()); m_collectionPropertyNames.insert(newName, collectionNode.name());
@@ -426,7 +431,7 @@ void DataStoreModelNode::assignCollectionToNode(AbstractView *view,
{ {
QTC_ASSERT(targetNode.isValid(), return); QTC_ASSERT(targetNode.isValid(), return);
if (!CollectionEditor::canAcceptCollectionAsModel(targetNode)) if (!CollectionEditorUtils::canAcceptCollectionAsModel(targetNode))
return; return;
if (!m_collectionPropertyNames.contains(collectionName)) { if (!m_collectionPropertyNames.contains(collectionName)) {