ProjectExplorer: Try harder to give new kits a unique name

Fixes: QTCREATORBUG-16203
Change-Id: Id79b5f2e84359b1ad96b95393cc7fb60a965e63e
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Christian Kandeler
2019-04-30 17:41:21 +02:00
parent 1333b695d4
commit 909dcaeee0
4 changed files with 31 additions and 3 deletions

View File

@@ -38,6 +38,7 @@
#include <utils/macroexpander.h>
#include <utils/optional.h>
#include <utils/qtcassert.h>
#include <utils/stringutils.h>
#include <QApplication>
#include <QFileInfo>
@@ -202,8 +203,7 @@ Kit *Kit::clone(bool keepName) const
if (keepName)
k->d->m_unexpandedDisplayName = d->m_unexpandedDisplayName;
else
k->d->m_unexpandedDisplayName = QCoreApplication::translate("ProjectExplorer::Kit", "Clone of %1")
.arg(d->m_unexpandedDisplayName);
k->d->m_unexpandedDisplayName = newKitName(KitManager::kits());
k->d->m_autodetected = false;
k->d->m_data = d->m_data;
// Do not clone m_fileSystemFriendlyName, needs to be unique
@@ -674,6 +674,19 @@ MacroExpander *Kit::macroExpander() const
return &d->m_macroExpander;
}
QString Kit::newKitName(const QList<Kit *> &allKits) const
{
return newKitName(unexpandedDisplayName(), allKits);
}
QString Kit::newKitName(const QString &name, const QList<Kit *> &allKits)
{
const QString baseName = name.isEmpty()
? QCoreApplication::translate("ProjectExplorer::Kit", "Unnamed")
: QCoreApplication::translate("ProjectExplorer::Kit", "Clone of %1").arg(name);
return Utils::makeUniquelyNumbered(baseName, transform(allKits, &Kit::unexpandedDisplayName));
}
void Kit::kitUpdated()
{
if (d->m_nestedBlockingLevel > 0) {

View File

@@ -137,6 +137,9 @@ public:
bool hasFeatures(const QSet<Core::Id> &features) const;
Utils::MacroExpander *macroExpander() const;
QString newKitName(const QList<Kit *> &allKits) const;
static QString newKitName(const QString &name, const QList<Kit *> &allKits);
private:
void setSdkProvided(bool sdkProvided);

View File

@@ -247,6 +247,7 @@ void KitModel::markForRemoval(Kit *k)
Kit *KitModel::markForAddition(Kit *baseKit)
{
const QString newName = newKitName(baseKit ? baseKit->unexpandedDisplayName() : QString());
KitNode *node = createNode(nullptr);
m_manualRoot->appendChild(node);
Kit *k = node->widget->workingCopy();
@@ -255,10 +256,10 @@ Kit *KitModel::markForAddition(Kit *baseKit)
k->copyFrom(baseKit);
k->setAutoDetected(false); // Make sure we have a manual kit!
k->setSdkProvided(false);
k->setUnexpandedDisplayName(tr("Clone of %1").arg(k->unexpandedDisplayName()));
} else {
k->setup();
}
k->setUnexpandedDisplayName(newName);
if (!m_defaultNode)
setDefaultNode(node);
@@ -273,6 +274,15 @@ void KitModel::updateVisibility()
});
}
QString KitModel::newKitName(const QString &sourceName) const
{
QList<Kit *> allKits;
forItemsAtLevel<2>([&allKits](const TreeItem *ti) {
allKits << static_cast<const KitNode *>(ti)->widget->workingCopy();
});
return Kit::newKitName(sourceName, allKits);
}
KitNode *KitModel::findWorkingCopy(Kit *k) const
{
return findItemAtLevel<2>([k](KitNode *n) { return n->widget->workingCopy() == k; });

View File

@@ -71,6 +71,8 @@ public:
void updateVisibility();
QString newKitName(const QString &sourceName) const;
signals:
void kitStateChanged();