diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryusermodel.cpp b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryusermodel.cpp index f282eb9d468..996429dc00f 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryusermodel.cpp +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryusermodel.cpp @@ -14,7 +14,6 @@ #include #include #include -#include #include #include @@ -218,64 +217,6 @@ ContentLibraryUserModel::SectionIndex ContentLibraryUserModel::bundleIdToSection return {}; } -/** - * @brief Gets unique Qml component and icon file material names from a given name - * @param defaultName input name - * @return file names - */ -QPair ContentLibraryUserModel::getUniqueLibMaterialNames(const QString &defaultName) const -{ - const QJsonObject bundleObj = qobject_cast( - m_userCategories.at(Items3DSectionIdx))->bundleObjRef(); - return getUniqueLibItemNames(defaultName, bundleObj); -} - -/** - * @brief Gets unique Qml component and icon file 3d item names from a given name - * @param defaultName input name - * @return file names - */ -QPair ContentLibraryUserModel::getUniqueLib3DNames(const QString &defaultName) const -{ - const QJsonObject bundleObj = qobject_cast( - m_userCategories.at(Items3DSectionIdx))->bundleObjRef(); - return getUniqueLibItemNames(defaultName, bundleObj); -} - -QPair ContentLibraryUserModel::getUniqueLibItemNames(const QString &defaultName, - const QJsonObject &bundleObj) const -{ - QString uniqueQml = UniqueName::generateId(defaultName); - if (uniqueQml.isEmpty()) - uniqueQml = "Component"; - else - uniqueQml[0] = uniqueQml.at(0).toUpper(); - uniqueQml.prepend("My"); - - QString uniqueIcon = defaultName; - - if (!bundleObj.isEmpty()) { - const QJsonArray itemsArr = bundleObj.value("items").toArray(); - - QStringList itemQmls, itemIcons; - for (const QJsonValueConstRef &itemRef : itemsArr) { - const QJsonObject &obj = itemRef.toObject(); - itemQmls.append(obj.value("qml").toString().chopped(4)); // remove .qml - itemIcons.append(QFileInfo(obj.value("icon").toString()).baseName()); - } - - uniqueQml = UniqueName::generate(uniqueQml, [&] (const QString &name) { - return itemQmls.contains(name); - }); - - uniqueIcon = UniqueName::generate(uniqueIcon, [&] (const QString &name) { - return itemIcons.contains(name); - }); - } - - return {uniqueQml + ".qml", uniqueIcon + ".png"}; -} - QHash ContentLibraryUserModel::roleNames() const { static const QHash roles { diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryusermodel.h b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryusermodel.h index 5938acbbe82..2c85a735820 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryusermodel.h +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryusermodel.h @@ -38,10 +38,6 @@ public: bool jsonPropertyExists(const QString &propName, const QString &propValue, const QString &bundleId) const; - QPair getUniqueLibMaterialNames(const QString &defaultName = "Material") const; - QPair getUniqueLib3DNames(const QString &defaultName = "Item") const; - QPair getUniqueLibItemNames(const QString &defaultName = "Item", - const QJsonObject &bundleObj = {}) const; void setQuick3DImportVersion(int major, int minor); diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp index 9bab4e8b5f0..6c90a565c12 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp @@ -521,34 +521,57 @@ void ContentLibraryView::applyBundleMaterialToDropTarget(const ModelNode &bundle // Add a project material to Content Library's user tab void ContentLibraryView::addLibMaterial(const ModelNode &node, const QPixmap &iconPixmap) { + auto compUtils = QmlDesignerPlugin::instance()->documentManager().generatedComponentUtils(); auto bundlePath = Utils::FilePath::fromString(Paths::bundlesPathSetting() + "/User/materials/"); + QString bundleId = compUtils.userMaterialsBundleId(); QString name = node.variantProperty("objectName").value().toString(); if (name.isEmpty()) name = node.displayName(); - auto [qml, icon] = m_widget->userModel()->getUniqueLibMaterialNames(name); + QJsonObject &jsonRef = m_widget->userModel()->bundleObjectRef(bundleId); + QJsonArray itemsArr = jsonRef.value("items").toArray(); - QString iconPath = QLatin1String("icons/%1").arg(icon); - QString fullIconPath = bundlePath.pathAppended(iconPath).toFSPathString(); + QString qml = nodeNameToComponentFileName(name); - // save icon - bool iconSaved = iconPixmap.save(fullIconPath); - if (!iconSaved) - qWarning() << __FUNCTION__ << "icon save failed"; + // 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("Material Exists"), + tr("A material 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; - // generate and save material Qml file + // before overwriting remove old item (to avoid partial items and dangling assets) + m_widget->userModel()->removeItemByName(qml, bundleId); + } + + // generate and save Qml file auto [qmlString, depAssets] = modelNodeToQmlString(node); const QStringList depAssetsList = depAssets.values(); auto result = bundlePath.pathAppended(qml).writeFileContents(qmlString.toUtf8()); QTC_ASSERT_EXPECTED(result,); + // save 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.parentDir().ensureWritableDir(); + + bool iconSaved = iconPixmap.save(m_iconSavePath.toFSPathString()); + if (!iconSaved) + qWarning() << __FUNCTION__ << "icon save failed"; + // add the material to the bundle json - auto compUtils = QmlDesignerPlugin::instance()->documentManager().generatedComponentUtils(); - QString bundleId = compUtils.userMaterialsBundleId(); - QJsonObject &jsonRef = m_widget->userModel()->bundleObjectRef(bundleId); - QJsonArray itemsArr = jsonRef.value("items").toArray(); + itemsArr = jsonRef.value("items").toArray(); itemsArr.append(QJsonObject { {"name", name}, {"qml", qml}, @@ -572,7 +595,7 @@ void ContentLibraryView::addLibMaterial(const ModelNode &node, const QPixmap &ic QTC_ASSERT_EXPECTED(result,); } - m_widget->userModel()->addItem(bundleId, name, qml, QUrl::fromLocalFile(fullIconPath), depAssetsList); + m_widget->userModel()->addItem(bundleId, name, qml, m_iconSavePath.toUrl(), depAssetsList); m_widget->userModel()->refreshSection(bundleId); }