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 <miikka.heikkinen@qt.io>
This commit is contained in:
Mahmoud Badri
2024-05-31 14:49:13 +03:00
parent bb17d6617f
commit 109f58b742

View File

@@ -24,6 +24,7 @@
#include "qmldesignerplugin.h" #include "qmldesignerplugin.h"
#include "qmltimeline.h" #include "qmltimeline.h"
#include "variantproperty.h" #include "variantproperty.h"
#include <uniquename.h>
#include <utils3d.h> #include <utils3d.h>
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
@@ -970,10 +971,7 @@ void MaterialEditorView::renameMaterial(ModelNode &material, const QString &newN
void MaterialEditorView::duplicateMaterial(const ModelNode &material) void MaterialEditorView::duplicateMaterial(const ModelNode &material)
{ {
QTC_ASSERT(material.isValid(), return); QTC_ASSERT(material.isValid() && model(), return);
if (!model())
return;
TypeName matType = material.type(); TypeName matType = material.type();
QmlObjectNode sourceMat(material); QmlObjectNode sourceMat(material);
@@ -982,8 +980,7 @@ void MaterialEditorView::duplicateMaterial(const ModelNode &material)
executeInTransaction(__FUNCTION__, [&] { executeInTransaction(__FUNCTION__, [&] {
ModelNode matLib = Utils3D::materialLibraryNode(this); ModelNode matLib = Utils3D::materialLibraryNode(this);
if (!matLib.isValid()) QTC_ASSERT(matLib.isValid(), return);
return;
// create the duplicate material // create the duplicate material
#ifdef QDS_USE_PROJECTSTORAGE #ifdef QDS_USE_PROJECTSTORAGE
@@ -994,10 +991,24 @@ void MaterialEditorView::duplicateMaterial(const ModelNode &material)
#endif #endif
duplicateMatNode = duplicateMat.modelNode(); duplicateMatNode = duplicateMat.modelNode();
// set name and id // generate and set a unique name
QString newName = sourceMat.modelNode().variantProperty("objectName").value().toString() + " copy"; QString newName = sourceMat.modelNode().variantProperty("objectName").value().toString();
if (!newName.contains("copy", Qt::CaseInsensitive))
newName.append(" copy");
const QList<ModelNode> 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"); VariantProperty objNameProp = duplicateMatNode.variantProperty("objectName");
objNameProp.setValue(newName); objNameProp.setValue(newName);
// generate and set an id
duplicateMatNode.setIdWithoutRefactoring(model()->generateNewId(newName, "material")); duplicateMatNode.setIdWithoutRefactoring(model()->generateNewId(newName, "material"));
// sync properties. Only the base state is duplicated. // sync properties. Only the base state is duplicated.