QmlDesigner: Confirm adding an existing item to content lib

Change-Id: Ic3c007444a1c061161268548e0f180ca5335b8bc
Reviewed-by: Ali Kianian <ali.kianian@qt.io>
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
This commit is contained in:
Mahmoud Badri
2024-06-19 17:18:23 +03:00
parent d4d2c279e3
commit 29229773e0
4 changed files with 61 additions and 5 deletions

View File

@@ -352,6 +352,25 @@ void ContentLibraryUserModel::updateImportedState(const QStringList &importedIte
emit dataChanged(index(secIdx), index(secIdx), {ItemsRole}); emit dataChanged(index(secIdx), index(secIdx), {ItemsRole});
} }
bool ContentLibraryUserModel::jsonPropertyExists(const QString &propName, const QString &propValue,
const QString &bundleId) const
{
SectionIndex secIdx = bundleIdToSectionIndex(bundleId);
UserItemCategory *cat = qobject_cast<UserItemCategory *>(m_userCategories.at(secIdx));
QTC_ASSERT(cat, return false);
QJsonObject &bundleObj = cat->bundleObjRef();
const QJsonArray itemsArr = bundleObj.value("items").toArray();
for (const QJsonValueConstRef &itemRef : itemsArr) {
const QJsonObject &obj = itemRef.toObject();
if (obj.value(propName).toString() == propValue)
return true;
}
return false;
}
void ContentLibraryUserModel::setQuick3DImportVersion(int major, int minor) void ContentLibraryUserModel::setQuick3DImportVersion(int major, int minor)
{ {
bool oldRequiredImport = hasRequiredQuick3DImport(); bool oldRequiredImport = hasRequiredQuick3DImport();

View File

@@ -36,6 +36,8 @@ public:
void setSearchText(const QString &searchText); void setSearchText(const QString &searchText);
void updateImportedState(const QStringList &importedItems, const QString &bundleId); void updateImportedState(const QStringList &importedItems, const QString &bundleId);
bool jsonPropertyExists(const QString &propName, const QString &propValue,
const QString &bundleId) const;
QPair<QString, QString> getUniqueLibMaterialNames(const QString &defaultName = "Material") const; QPair<QString, QString> getUniqueLibMaterialNames(const QString &defaultName = "Material") const;
QPair<QString, QString> getUniqueLib3DNames(const QString &defaultName = "Item") const; QPair<QString, QString> getUniqueLib3DNames(const QString &defaultName = "Item") const;
QPair<QString, QString> getUniqueLibItemNames(const QString &defaultName = "Item", QPair<QString, QString> getUniqueLibItemNames(const QString &defaultName = "Item",

View File

@@ -833,6 +833,18 @@ void ContentLibraryView::exportLib3DComponent(const ModelNode &node)
}); });
} }
QString ContentLibraryView::nodeNameToComponentFileName(const QString &name) const
{
QString fileName = UniqueName::generateId(name);
if (fileName.isEmpty())
fileName = "Component";
else
fileName[0] = fileName.at(0).toUpper();
fileName.prepend("My");
return fileName + ".qml";
}
void ContentLibraryView::addLib3DItem(const ModelNode &node) void ContentLibraryView::addLib3DItem(const ModelNode &node)
{ {
auto compUtils = QmlDesignerPlugin::instance()->documentManager().generatedComponentUtils(); auto compUtils = QmlDesignerPlugin::instance()->documentManager().generatedComponentUtils();
@@ -844,8 +856,23 @@ void ContentLibraryView::addLib3DItem(const ModelNode &node)
name = node.displayName(); name = node.displayName();
QJsonObject &jsonRef = m_widget->userModel()->bundleObjectRef(bundleId); QJsonObject &jsonRef = m_widget->userModel()->bundleObjectRef(bundleId);
QJsonArray itemsArr = jsonRef.value("items").toArray();
auto [qml, icon] = m_widget->userModel()->getUniqueLibItemNames(name, jsonRef); QString qml = nodeNameToComponentFileName(name);
// confirm overwrite if an item with same name exists
if (m_widget->userModel()->jsonPropertyExists("qml", qml, bundleId)) {
QMessageBox::StandardButton reply = QMessageBox::question(m_widget, tr("Component Exists"),
tr("A component with the same name '%1' already "
"exists in the Content Library, are you sure "
"you want to overwrite it?")
.arg(qml), QMessageBox::Yes | QMessageBox::No);
if (reply == QMessageBox::No)
return;
// before overwriting remove old item (to avoid partial items and dangling assets)
m_widget->userModel()->removeItemByName(qml, bundleId);
}
// generate and save Qml file // generate and save Qml file
auto [qmlString, depAssets] = modelNodeToQmlString(node); auto [qmlString, depAssets] = modelNodeToQmlString(node);
@@ -855,7 +882,13 @@ void ContentLibraryView::addLib3DItem(const ModelNode &node)
QTC_ASSERT_EXPECTED(result,); QTC_ASSERT_EXPECTED(result,);
// generate and save icon // generate and save icon
QString iconPath = QLatin1String("icons/%1").arg(icon); QString iconPathTemplate = QLatin1String("icons/%1.png");
QString iconBaseName = UniqueName::generateId(name, [&] (const QString &currName) {
return m_widget->userModel()->jsonPropertyExists("icon", iconPathTemplate.arg(currName),
bundleId);
});
QString iconPath = iconPathTemplate.arg(iconBaseName);
m_iconSavePath = bundlePath.pathAppended(iconPath); m_iconSavePath = bundlePath.pathAppended(iconPath);
m_iconSavePath.parentDir().ensureWritableDir(); m_iconSavePath.parentDir().ensureWritableDir();
@@ -876,7 +909,7 @@ void ContentLibraryView::addLib3DItem(const ModelNode &node)
}); });
// add the item to the bundle json // add the item to the bundle json
QJsonArray itemsArr = jsonRef.value("items").toArray(); itemsArr = jsonRef.value("items").toArray();
itemsArr.append(QJsonObject { itemsArr.append(QJsonObject {
{"name", name}, {"name", name},
{"qml", qml}, {"qml", qml},
@@ -950,7 +983,8 @@ void ContentLibraryView::exportLib3DItem(const ModelNode &node, const QPixmap &i
if (name.isEmpty()) if (name.isEmpty())
name = node.displayName(); name = node.displayName();
auto [qml, icon] = m_widget->userModel()->getUniqueLibItemNames(name); QString qml = nodeNameToComponentFileName(name);
QString iconBaseName = UniqueName::generateId(name);
// generate and save Qml file // generate and save Qml file
auto [qmlString, depAssets] = modelNodeToQmlString(node); auto [qmlString, depAssets] = modelNodeToQmlString(node);
@@ -961,7 +995,7 @@ void ContentLibraryView::exportLib3DItem(const ModelNode &node, const QPixmap &i
QTC_ASSERT_EXPECTED(result, return); QTC_ASSERT_EXPECTED(result, return);
m_zipWriter->addFile(qmlFilePath.fileName(), qmlString.toUtf8()); m_zipWriter->addFile(qmlFilePath.fileName(), qmlString.toUtf8());
QString iconPath = QLatin1String("icons/%1").arg(icon); QString iconPath = QLatin1String("icons/%1.png").arg(iconBaseName);
// add the item to the bundle json // add the item to the bundle json
QJsonObject jsonObj; QJsonObject jsonObj;

View File

@@ -72,6 +72,7 @@ private:
std::function<void(const QImage &image)> successCallback); std::function<void(const QImage &image)> successCallback);
QString getExportPath(const ModelNode &node) const; QString getExportPath(const ModelNode &node) const;
QString getImportPath() const; QString getImportPath() const;
QString nodeNameToComponentFileName(const QString &name) const;
QPair<QString, QSet<QString>> modelNodeToQmlString(const ModelNode &node, int depth = 0); QPair<QString, QSet<QString>> modelNodeToQmlString(const ModelNode &node, int depth = 0);
#ifdef QDS_USE_PROJECTSTORAGE #ifdef QDS_USE_PROJECTSTORAGE