From 445e8d6dd205540c08bc39659f526498e94e46ce Mon Sep 17 00:00:00 2001 From: Vikas Pachdha Date: Wed, 25 Jan 2023 15:46:00 +0100 Subject: [PATCH] Designer: Add predicate to check id collisions Task-number: QDS-8944 Change-Id: Icaff4768fbc4bd37223bccce72e40234752c5db0 Reviewed-by: Qt CI Bot Reviewed-by: Reviewed-by: Thomas Hartmann --- src/plugins/qmldesigner/designercore/include/model.h | 4 +++- src/plugins/qmldesigner/designercore/model/model.cpp | 9 +++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/include/model.h b/src/plugins/qmldesigner/designercore/include/model.h index 336a5b2d280..298d592f79c 100644 --- a/src/plugins/qmldesigner/designercore/include/model.h +++ b/src/plugins/qmldesigner/designercore/include/model.h @@ -145,7 +145,9 @@ public: bool hasId(const QString &id) const; bool hasImport(const QString &importUrl) const; - QString generateNewId(const QString &prefixName, const QString &fallbackPrefix = "element") const; + QString generateNewId(const QString &prefixName, + const QString &fallbackPrefix = "element", + std::optional> isDuplicate = {}) const; QString generateIdFromName(const QString &name, const QString &fallbackId = "element") const; void setActive3DSceneId(qint32 sceneId); diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp index 0909afabac1..7806a716e66 100644 --- a/src/plugins/qmldesigner/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/designercore/model/model.cpp @@ -1516,7 +1516,9 @@ static QString firstCharToLower(const QString &string) return resultString; } -QString Model::generateNewId(const QString &prefixName, const QString &fallbackPrefix) const +QString Model::generateNewId(const QString &prefixName, + const QString &fallbackPrefix, + std::optional> isDuplicate) const { // First try just the prefixName without number as postfix, then continue with 2 and further // as postfix until id does not already exist. @@ -1538,7 +1540,10 @@ QString Model::generateNewId(const QString &prefixName, const QString &fallbackP QString newId = newBaseId; - while (!ModelNode::isValidId(newId) || hasId(newId) + if (!isDuplicate.has_value()) + isDuplicate = std::bind(&Model::hasId, this, std::placeholders::_1); + + while (!ModelNode::isValidId(newId) || isDuplicate.value()(newId) || d->rootNode()->hasProperty(newId.toUtf8())) { ++counter; newId = QString(QStringLiteral("%1%2")).arg(firstCharToLower(newBaseId)).arg(counter);