From 109f58b7421ff1675ace87cc1bad28c1c4d571b0 Mon Sep 17 00:00:00 2001 From: Mahmoud Badri Date: Fri, 31 May 2024 14:49:13 +0300 Subject: [PATCH] QmlDesigner: Improve duplicate material naming Instead of mat, mat copy, mat copy copy, mat copy copy copy, etc It becomes: mat, mat copy, mat copy1, mat copy2, etc Change-Id: If336bb21ed8384d17e58df6c31480b5484f4e423 Reviewed-by: Miikka Heikkinen --- .../materialeditor/materialeditorview.cpp | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp index 21114267cbb..8e7d10d300d 100644 --- a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp +++ b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp @@ -24,6 +24,7 @@ #include "qmldesignerplugin.h" #include "qmltimeline.h" #include "variantproperty.h" +#include #include #include @@ -970,10 +971,7 @@ void MaterialEditorView::renameMaterial(ModelNode &material, const QString &newN void MaterialEditorView::duplicateMaterial(const ModelNode &material) { - QTC_ASSERT(material.isValid(), return); - - if (!model()) - return; + QTC_ASSERT(material.isValid() && model(), return); TypeName matType = material.type(); QmlObjectNode sourceMat(material); @@ -982,8 +980,7 @@ void MaterialEditorView::duplicateMaterial(const ModelNode &material) executeInTransaction(__FUNCTION__, [&] { ModelNode matLib = Utils3D::materialLibraryNode(this); - if (!matLib.isValid()) - return; + QTC_ASSERT(matLib.isValid(), return); // create the duplicate material #ifdef QDS_USE_PROJECTSTORAGE @@ -994,10 +991,24 @@ void MaterialEditorView::duplicateMaterial(const ModelNode &material) #endif duplicateMatNode = duplicateMat.modelNode(); - // set name and id - QString newName = sourceMat.modelNode().variantProperty("objectName").value().toString() + " copy"; + // generate and set a unique name + QString newName = sourceMat.modelNode().variantProperty("objectName").value().toString(); + if (!newName.contains("copy", Qt::CaseInsensitive)) + newName.append(" copy"); + + const QList mats = matLib.directSubModelNodesOfType(model()->qtQuick3DMaterialMetaInfo()); + QStringList matNames; + for (const ModelNode &mat : mats) + matNames.append(mat.variantProperty("objectName").value().toString()); + + newName = UniqueName::generate(newName, [&] (const QString &name) { + return matNames.contains(name); + }); + VariantProperty objNameProp = duplicateMatNode.variantProperty("objectName"); objNameProp.setValue(newName); + + // generate and set an id duplicateMatNode.setIdWithoutRefactoring(model()->generateNewId(newName, "material")); // sync properties. Only the base state is duplicated.