Kit: Change displayName generation

Do not care whether the unexpandedDisplay name is unique or not, nor
whether the display name is unique or not.

Warn if it is not in the Kits Options Page, but that is all.

Change-Id: I1cbeb5beb477d533092ade6ef67a97044e53477c
Reviewed-by: Daniel Teske <daniel.teske@digia.com>
This commit is contained in:
Tobias Hunger
2014-08-25 15:17:35 +02:00
parent d56f217f83
commit c2ed44085b
8 changed files with 63 additions and 127 deletions

View File

@@ -104,20 +104,17 @@ public:
m_id(id), m_id(id),
m_nestedBlockingLevel(0), m_nestedBlockingLevel(0),
m_autodetected(false), m_autodetected(false),
m_autoDetectionSource(QString()),
m_sdkProvided(false), m_sdkProvided(false),
m_isValid(true), m_isValid(true),
m_hasWarning(false), m_hasWarning(false),
m_hasValidityInfo(false), m_hasValidityInfo(false),
m_mustNotify(false), m_mustNotify(false),
m_mustNotifyAboutDisplayName(false),
m_macroExpander(0) m_macroExpander(0)
{ {
if (!id.isValid()) if (!id.isValid())
m_id = Id::fromString(QUuid::createUuid().toString()); m_id = Id::fromString(QUuid::createUuid().toString());
m_displayName = QCoreApplication::translate("ProjectExplorer::Kit", "Unnamed"); m_displayName = QCoreApplication::translate("ProjectExplorer::Kit", "Unnamed");
m_previousDisplayName = m_displayName;
m_iconPath = Utils::FileName::fromLatin1(":///DESKTOP///"); m_iconPath = Utils::FileName::fromLatin1(":///DESKTOP///");
QList<Utils::AbstractMacroExpander *> expanders; QList<Utils::AbstractMacroExpander *> expanders;
@@ -133,25 +130,17 @@ public:
~KitPrivate() ~KitPrivate()
{ delete m_macroExpander; } { delete m_macroExpander; }
void updatePreviousDisplayName()
{
QTC_ASSERT(m_macroExpander, return);
m_previousDisplayName = Utils::expandMacros(m_displayName, m_macroExpander);
}
QString m_displayName; QString m_displayName;
QString m_previousDisplayName;
QString m_fileSystemFriendlyName; QString m_fileSystemFriendlyName;
QString m_autoDetectionSource;
Id m_id; Id m_id;
int m_nestedBlockingLevel; int m_nestedBlockingLevel;
bool m_autodetected; bool m_autodetected;
QString m_autoDetectionSource;
bool m_sdkProvided; bool m_sdkProvided;
bool m_isValid; bool m_isValid;
bool m_hasWarning; bool m_hasWarning;
bool m_hasValidityInfo; bool m_hasValidityInfo;
bool m_mustNotify; bool m_mustNotify;
bool m_mustNotifyAboutDisplayName;
QIcon m_icon; QIcon m_icon;
Utils::FileName m_iconPath; Utils::FileName m_iconPath;
@@ -174,7 +163,6 @@ Kit::Kit(Core::Id id) :
d->m_data.insert(sti->id(), sti->defaultValue(this)); d->m_data.insert(sti->id(), sti->defaultValue(this));
d->m_icon = icon(d->m_iconPath); d->m_icon = icon(d->m_iconPath);
d->updatePreviousDisplayName();
} }
Kit::Kit(const QVariantMap &data) : Kit::Kit(const QVariantMap &data) :
@@ -212,8 +200,6 @@ Kit::Kit(const QVariantMap &data) :
QStringList stickyInfoList = data.value(QLatin1String(STICKY_INFO_KEY)).toStringList(); QStringList stickyInfoList = data.value(QLatin1String(STICKY_INFO_KEY)).toStringList();
foreach (const QString &stickyInfo, stickyInfoList) foreach (const QString &stickyInfo, stickyInfoList)
d->m_sticky.insert(Core::Id::fromString(stickyInfo)); d->m_sticky.insert(Core::Id::fromString(stickyInfo));
d->updatePreviousDisplayName();
} }
Kit::~Kit() Kit::~Kit()
@@ -231,12 +217,9 @@ void Kit::unblockNotification()
--d->m_nestedBlockingLevel; --d->m_nestedBlockingLevel;
if (d->m_nestedBlockingLevel > 0) if (d->m_nestedBlockingLevel > 0)
return; return;
if (d->m_mustNotifyAboutDisplayName)
kitDisplayNameChanged();
else if (d->m_mustNotify)
kitUpdated(); kitUpdated();
d->m_mustNotify = false; d->m_mustNotify = false;
d->m_mustNotifyAboutDisplayName = false;
} }
Kit *Kit::clone(bool keepName) const Kit *Kit::clone(bool keepName) const
@@ -255,7 +238,6 @@ Kit *Kit::clone(bool keepName) const
k->d->m_iconPath = d->m_iconPath; k->d->m_iconPath = d->m_iconPath;
k->d->m_sticky = d->m_sticky; k->d->m_sticky = d->m_sticky;
k->d->m_mutable = d->m_mutable; k->d->m_mutable = d->m_mutable;
k->d->updatePreviousDisplayName();
return k; return k;
} }
@@ -270,10 +252,8 @@ void Kit::copyFrom(const Kit *k)
d->m_displayName = k->d->m_displayName; d->m_displayName = k->d->m_displayName;
d->m_fileSystemFriendlyName = k->d->m_fileSystemFriendlyName; d->m_fileSystemFriendlyName = k->d->m_fileSystemFriendlyName;
d->m_mustNotify = true; d->m_mustNotify = true;
d->m_mustNotifyAboutDisplayName = false;
d->m_sticky = k->d->m_sticky; d->m_sticky = k->d->m_sticky;
d->m_mutable = k->d->m_mutable; d->m_mutable = k->d->m_mutable;
d->updatePreviousDisplayName();
} }
bool Kit::isValid() const bool Kit::isValid() const
@@ -360,8 +340,7 @@ void Kit::setUnexpandedDisplayName(const QString &name)
return; return;
d->m_displayName = name; d->m_displayName = name;
d->updatePreviousDisplayName(); kitUpdated();
kitDisplayNameChanged();
} }
QStringList Kit::candidateNameList(const QString &base) const QStringList Kit::candidateNameList(const QString &base) const
@@ -576,7 +555,7 @@ IOutputParser *Kit::createOutputParser() const
return first; return first;
} }
QString Kit::toHtml() const QString Kit::toHtml(const QList<Task> &additional) const
{ {
QString rc; QString rc;
QTextStream str(&rc); QTextStream str(&rc);
@@ -584,8 +563,9 @@ QString Kit::toHtml() const
str << "<h3>" << displayName() << "</h3>"; str << "<h3>" << displayName() << "</h3>";
str << "<table>"; str << "<table>";
if (!isValid() || hasWarning()) { if (!isValid() || hasWarning() || !additional.isEmpty()) {
QList<Task> issues = validate(); QList<Task> issues = additional;
issues.append(validate());
str << "<p>"; str << "<p>";
foreach (const Task &t, issues) { foreach (const Task &t, issues) {
str << "<b>"; str << "<b>";
@@ -712,28 +692,11 @@ Utils::AbstractMacroExpander *Kit::macroExpander() const
void Kit::kitUpdated() void Kit::kitUpdated()
{ {
if (d->m_nestedBlockingLevel > 0) { if (d->m_nestedBlockingLevel > 0) {
if (!d->m_mustNotifyAboutDisplayName)
d->m_mustNotify = true; d->m_mustNotify = true;
return; return;
} }
d->m_hasValidityInfo = false; d->m_hasValidityInfo = false;
if (displayName() != d->m_previousDisplayName) {
d->updatePreviousDisplayName();
KitManager::notifyAboutDisplayNameChange(this);
} else {
KitManager::notifyAboutUpdate(this); KitManager::notifyAboutUpdate(this);
}
}
void Kit::kitDisplayNameChanged()
{
if (d->m_nestedBlockingLevel > 0) {
d->m_mustNotifyAboutDisplayName = true;
d->m_mustNotify = false;
return;
}
d->m_hasValidityInfo = false;
KitManager::notifyAboutDisplayNameChange(this);
} }
} // namespace ProjectExplorer } // namespace ProjectExplorer

View File

@@ -108,7 +108,7 @@ public:
void addToEnvironment(Utils::Environment &env) const; void addToEnvironment(Utils::Environment &env) const;
IOutputParser *createOutputParser() const; IOutputParser *createOutputParser() const;
QString toHtml() const; QString toHtml(const QList<Task> &additional = QList<Task>()) const;
Kit *clone(bool keepName = false) const; Kit *clone(bool keepName = false) const;
void copyFrom(const Kit *k); void copyFrom(const Kit *k);

View File

@@ -107,14 +107,13 @@ public:
Kit *m_defaultKit; Kit *m_defaultKit;
bool m_initialized; bool m_initialized;
bool m_keepDisplayNameUnique;
QList<KitInformation *> m_informationList; QList<KitInformation *> m_informationList;
QList<Kit *> m_kitList; QList<Kit *> m_kitList;
Utils::PersistentSettingsWriter *m_writer; Utils::PersistentSettingsWriter *m_writer;
}; };
KitManagerPrivate::KitManagerPrivate() : KitManagerPrivate::KitManagerPrivate() :
m_defaultKit(0), m_initialized(false), m_keepDisplayNameUnique(true), m_writer(0) m_defaultKit(0), m_initialized(false), m_writer(0)
{ } { }
KitManagerPrivate::~KitManagerPrivate() KitManagerPrivate::~KitManagerPrivate()
@@ -155,13 +154,6 @@ KitManager::KitManager(QObject *parent) :
this, SIGNAL(kitsChanged())); this, SIGNAL(kitsChanged()));
} }
bool KitManager::setKeepDisplayNameUnique(bool unique)
{
bool current = d->m_keepDisplayNameUnique;
d->m_keepDisplayNameUnique = unique;
return current;
}
void KitManager::restoreKits() void KitManager::restoreKits()
{ {
QTC_ASSERT(!d->m_initialized, return); QTC_ASSERT(!d->m_initialized, return);
@@ -477,45 +469,6 @@ void KitManager::deleteKit(Kit *k)
delete k; delete k;
} }
QString KitManager::uniqueKitName(const Kit *k, const QList<Kit *> &allKits)
{
QStringList nameList;
nameList << QString(); // Disallow empty kit names!
foreach (Kit *tmp, allKits) {
if (tmp == k)
continue;
nameList.append(tmp->candidateNameList(tmp->displayName()));
}
const QString dn = k->displayName();
const QString udn = k->unexpandedDisplayName();
QString uniqueName = Project::makeUnique(dn, nameList);
if (uniqueName == dn)
return udn;
QStringList candidateNames = k->candidateNameList(udn);
foreach (const QString &candidate, candidateNames) {
QString expandedCandidate = Utils::expandMacros(candidate, k->macroExpander());
if (!nameList.contains(expandedCandidate))
return candidate;
}
return udn + uniqueName.mid(dn.count());
}
void KitManager::notifyAboutDisplayNameChange(Kit *k)
{
if (!k)
return;
if (d->m_kitList.contains(k) && d->m_keepDisplayNameUnique)
k->setUnexpandedDisplayName(uniqueKitName(k, kits()));
int pos = d->m_kitList.indexOf(k);
if (pos >= 0 && d->m_initialized)
d->moveKit(pos);
notifyAboutUpdate(k);
}
void KitManager::notifyAboutUpdate(ProjectExplorer::Kit *k) void KitManager::notifyAboutUpdate(ProjectExplorer::Kit *k)
{ {
if (!k || !isLoaded()) if (!k || !isLoaded())
@@ -539,8 +492,6 @@ bool KitManager::registerKit(ProjectExplorer::Kit *k)
if (kits().contains(k)) if (kits().contains(k))
return false; return false;
k->setUnexpandedDisplayName(uniqueKitName(k, kits()));
// make sure we have all the information in our kits: // make sure we have all the information in our kits:
m_instance->addKit(k); m_instance->addKit(k);

View File

@@ -144,8 +144,6 @@ public:
static void deleteKit(Kit *k); static void deleteKit(Kit *k);
static QString uniqueKitName(const Kit *k, const QList<Kit *> &allKits);
static bool registerKit(ProjectExplorer::Kit *k); static bool registerKit(ProjectExplorer::Kit *k);
static void deregisterKit(ProjectExplorer::Kit *k); static void deregisterKit(ProjectExplorer::Kit *k);
static void setDefaultKit(ProjectExplorer::Kit *k); static void setDefaultKit(ProjectExplorer::Kit *k);
@@ -177,8 +175,6 @@ signals:
private: private:
explicit KitManager(QObject *parent = 0); explicit KitManager(QObject *parent = 0);
static bool setKeepDisplayNameUnique(bool unique);
// Make sure the this is only called after all // Make sure the this is only called after all
// KitInformation are registered! // KitInformation are registered!
void restoreKits(); void restoreKits();
@@ -192,7 +188,6 @@ private:
}; };
KitList restoreKits(const Utils::FileName &fileName); KitList restoreKits(const Utils::FileName &fileName);
static void notifyAboutDisplayNameChange(ProjectExplorer::Kit *k);
static void notifyAboutUpdate(ProjectExplorer::Kit *k); static void notifyAboutUpdate(ProjectExplorer::Kit *k);
void addKit(Kit *k); void addKit(Kit *k);

View File

@@ -32,6 +32,7 @@
#include "kit.h" #include "kit.h"
#include "kitmanager.h" #include "kitmanager.h"
#include "task.h"
#include <utils/detailswidget.h> #include <utils/detailswidget.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
@@ -62,7 +63,8 @@ KitManagerConfigWidget::KitManagerConfigWidget(Kit *k) :
m_fileSystemFriendlyNameLineEdit(new QLineEdit), m_fileSystemFriendlyNameLineEdit(new QLineEdit),
m_kit(k), m_kit(k),
m_modifiedKit(new Kit(Core::Id(WORKING_COPY_KIT_ID))), m_modifiedKit(new Kit(Core::Id(WORKING_COPY_KIT_ID))),
m_fixingKit(false) m_fixingKit(false),
m_hasUniqueName(true)
{ {
static const Qt::Alignment alignment static const Qt::Alignment alignment
= static_cast<Qt::Alignment>(style()->styleHint(QStyle::SH_FormLayoutLabelAlignment)); = static_cast<Qt::Alignment>(style()->styleHint(QStyle::SH_FormLayoutLabelAlignment));
@@ -182,12 +184,17 @@ bool KitManagerConfigWidget::isValid() const
bool KitManagerConfigWidget::hasWarning() const bool KitManagerConfigWidget::hasWarning() const
{ {
return m_modifiedKit->hasWarning(); return m_modifiedKit->hasWarning() || !m_hasUniqueName;
} }
QString KitManagerConfigWidget::validityMessage() const QString KitManagerConfigWidget::validityMessage() const
{ {
return m_modifiedKit->toHtml(); QList<Task> tmp;
if (!m_hasUniqueName) {
tmp.append(Task(Task::Warning, tr("Display name is not unique."), Utils::FileName(), -1,
ProjectExplorer::Constants::TASK_CATEGORY_COMPILE));
}
return m_modifiedKit->toHtml(tmp);
} }
void KitManagerConfigWidget::addConfigWidget(ProjectExplorer::KitConfigWidget *widget) void KitManagerConfigWidget::addConfigWidget(ProjectExplorer::KitConfigWidget *widget)
@@ -234,6 +241,11 @@ void KitManagerConfigWidget::updateVisibility()
} }
} }
void KitManagerConfigWidget::setHasUniqueName(bool unique)
{
m_hasUniqueName = unique;
}
void KitManagerConfigWidget::makeStickySubWidgetsReadOnly() void KitManagerConfigWidget::makeStickySubWidgetsReadOnly()
{ {
foreach (KitConfigWidget *w, m_widgets) { foreach (KitConfigWidget *w, m_widgets) {

View File

@@ -72,6 +72,8 @@ public:
void removeKit(); void removeKit();
void updateVisibility(); void updateVisibility();
void setHasUniqueName(bool unique);
signals: signals:
void dirty(); void dirty();
@@ -103,6 +105,7 @@ private:
Kit *m_modifiedKit; Kit *m_modifiedKit;
bool m_isDefaultKit; bool m_isDefaultKit;
bool m_fixingKit; bool m_fixingKit;
bool m_hasUniqueName;
QPixmap m_background; QPixmap m_background;
QList<QAction *> m_actions; QList<QAction *> m_actions;
}; };

View File

@@ -105,10 +105,12 @@ KitModel::KitModel(QBoxLayout *parentLayout, QObject *parent) :
connect(KitManager::instance(), SIGNAL(kitAdded(ProjectExplorer::Kit*)), connect(KitManager::instance(), SIGNAL(kitAdded(ProjectExplorer::Kit*)),
this, SLOT(addKit(ProjectExplorer::Kit*))); this, SLOT(addKit(ProjectExplorer::Kit*)));
connect(KitManager::instance(), SIGNAL(kitRemoved(ProjectExplorer::Kit*)), connect(KitManager::instance(), SIGNAL(kitUpdated(ProjectExplorer::Kit*)),
this, SLOT(removeKit(ProjectExplorer::Kit*))); this, SLOT(updateKit(ProjectExplorer::Kit*)));
connect(KitManager::instance(), SIGNAL(unmanagedKitUpdated(ProjectExplorer::Kit*)), connect(KitManager::instance(), SIGNAL(unmanagedKitUpdated(ProjectExplorer::Kit*)),
this, SLOT(updateKit(ProjectExplorer::Kit*))); this, SLOT(updateKit(ProjectExplorer::Kit*)));
connect(KitManager::instance(), SIGNAL(kitRemoved(ProjectExplorer::Kit*)),
this, SLOT(removeKit(ProjectExplorer::Kit*)));
connect(KitManager::instance(), SIGNAL(defaultkitChanged()), connect(KitManager::instance(), SIGNAL(defaultkitChanged()),
this, SLOT(changeDefaultKit())); this, SLOT(changeDefaultKit()));
} }
@@ -276,6 +278,25 @@ void KitModel::setDirty()
} }
} }
void KitModel::validateKitNames()
{
QList<KitNode *> nodes = m_manualRoot->childNodes;
nodes << m_autoRoot->childNodes;
QHash<QString, int> nameHash;
foreach (KitNode *n, nodes) {
const QString displayName = n->widget->displayName();
if (nameHash.contains(displayName))
++nameHash[displayName];
else
nameHash.insert(displayName, 1);
}
foreach (KitNode *n, nodes) {
const QString displayName = n->widget->displayName();
n->widget->setHasUniqueName(nameHash.value(displayName) == 1);
}
}
void KitModel::apply() void KitModel::apply()
{ {
// Remove unused kits: // Remove unused kits:
@@ -286,8 +307,6 @@ void KitModel::apply()
} }
// Update kits: // Update kits:
bool unique = KitManager::setKeepDisplayNameUnique(false);
m_keepUnique = false;
nodes = m_autoRoot->childNodes; // These can be dirty due to being made default! nodes = m_autoRoot->childNodes; // These can be dirty due to being made default!
nodes.append(m_manualRoot->childNodes); nodes.append(m_manualRoot->childNodes);
foreach (KitNode *n, nodes) { foreach (KitNode *n, nodes) {
@@ -298,8 +317,6 @@ void KitModel::apply()
emit dataChanged(index(n, 0), index(n, columnCount(QModelIndex()))); emit dataChanged(index(n, 0), index(n, columnCount(QModelIndex())));
} }
} }
m_keepUnique = unique;
KitManager::setKeepDisplayNameUnique(unique);
} }
void KitModel::markForRemoval(Kit *k) void KitModel::markForRemoval(Kit *k)
@@ -352,12 +369,6 @@ Kit *KitModel::markForAddition(Kit *baseKit)
return k; return k;
} }
QString KitModel::findNameFor(Kit *k)
{
QList<Kit *> kits = kitList(m_root);
return KitManager::uniqueKitName(k, kits);
}
QModelIndex KitModel::index(KitNode *node, int column) const QModelIndex KitModel::index(KitNode *node, int column) const
{ {
if (node->parent == 0) // is root (or was marked for deletion) if (node->parent == 0) // is root (or was marked for deletion)
@@ -428,6 +439,13 @@ void KitModel::addKit(Kit *k)
createNode(parent, k); createNode(parent, k);
endInsertRows(); endInsertRows();
validateKitNames();
emit kitStateChanged();
}
void KitModel::updateKit(Kit *k)
{
validateKitNames();
emit kitStateChanged(); emit kitStateChanged();
} }
@@ -464,15 +482,10 @@ void KitModel::removeKit(Kit *k)
endRemoveRows(); endRemoveRows();
delete node; delete node;
validateKitNames();
emit kitStateChanged(); emit kitStateChanged();
} }
void KitModel::updateKit(Kit *k)
{
if (m_keepUnique)
k->setUnexpandedDisplayName(findNameFor(k));
}
void KitModel::changeDefaultKit() void KitModel::changeDefaultKit()
{ {
Kit *defaultKit = KitManager::defaultKit(); Kit *defaultKit = KitManager::defaultKit();

View File

@@ -86,17 +86,16 @@ public:
void markForRemoval(Kit *k); void markForRemoval(Kit *k);
Kit *markForAddition(Kit *baseKit); Kit *markForAddition(Kit *baseKit);
QString findNameFor(Kit *k);
signals: signals:
void kitStateChanged(); void kitStateChanged();
private slots: private slots:
void addKit(ProjectExplorer::Kit *k); void addKit(ProjectExplorer::Kit *k);
void updateKit(ProjectExplorer::Kit *k);
void removeKit(ProjectExplorer::Kit *k); void removeKit(ProjectExplorer::Kit *k);
void updateKit(ProjectExplorer::Kit*);
void changeDefaultKit(); void changeDefaultKit();
void setDirty(); void setDirty();
void validateKitNames();
private: private:
QModelIndex index(KitNode *, int column = 0) const; QModelIndex index(KitNode *, int column = 0) const;