diff --git a/src/plugins/projectexplorer/kit.cpp b/src/plugins/projectexplorer/kit.cpp index 5d81a88aff85e83d062fbbba7314b4de2a005493..e5579d1e84816e55746608083d4d60a4bf7a2fb2 100644 --- a/src/plugins/projectexplorer/kit.cpp +++ b/src/plugins/projectexplorer/kit.cpp @@ -104,20 +104,17 @@ public: m_id(id), m_nestedBlockingLevel(0), m_autodetected(false), - m_autoDetectionSource(QString()), m_sdkProvided(false), m_isValid(true), m_hasWarning(false), m_hasValidityInfo(false), m_mustNotify(false), - m_mustNotifyAboutDisplayName(false), m_macroExpander(0) { if (!id.isValid()) m_id = Id::fromString(QUuid::createUuid().toString()); m_displayName = QCoreApplication::translate("ProjectExplorer::Kit", "Unnamed"); - m_previousDisplayName = m_displayName; m_iconPath = Utils::FileName::fromLatin1(":///DESKTOP///"); QList<Utils::AbstractMacroExpander *> expanders; @@ -133,25 +130,17 @@ public: ~KitPrivate() { delete m_macroExpander; } - void updatePreviousDisplayName() - { - QTC_ASSERT(m_macroExpander, return); - m_previousDisplayName = Utils::expandMacros(m_displayName, m_macroExpander); - } - QString m_displayName; - QString m_previousDisplayName; QString m_fileSystemFriendlyName; + QString m_autoDetectionSource; Id m_id; int m_nestedBlockingLevel; bool m_autodetected; - QString m_autoDetectionSource; bool m_sdkProvided; bool m_isValid; bool m_hasWarning; bool m_hasValidityInfo; bool m_mustNotify; - bool m_mustNotifyAboutDisplayName; QIcon m_icon; Utils::FileName m_iconPath; @@ -174,7 +163,6 @@ Kit::Kit(Core::Id id) : d->m_data.insert(sti->id(), sti->defaultValue(this)); d->m_icon = icon(d->m_iconPath); - d->updatePreviousDisplayName(); } Kit::Kit(const QVariantMap &data) : @@ -212,8 +200,6 @@ Kit::Kit(const QVariantMap &data) : QStringList stickyInfoList = data.value(QLatin1String(STICKY_INFO_KEY)).toStringList(); foreach (const QString &stickyInfo, stickyInfoList) d->m_sticky.insert(Core::Id::fromString(stickyInfo)); - - d->updatePreviousDisplayName(); } Kit::~Kit() @@ -231,12 +217,9 @@ void Kit::unblockNotification() --d->m_nestedBlockingLevel; if (d->m_nestedBlockingLevel > 0) return; - if (d->m_mustNotifyAboutDisplayName) - kitDisplayNameChanged(); - else if (d->m_mustNotify) - kitUpdated(); + + kitUpdated(); d->m_mustNotify = false; - d->m_mustNotifyAboutDisplayName = false; } 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_sticky = d->m_sticky; k->d->m_mutable = d->m_mutable; - k->d->updatePreviousDisplayName(); return k; } @@ -270,10 +252,8 @@ void Kit::copyFrom(const Kit *k) d->m_displayName = k->d->m_displayName; d->m_fileSystemFriendlyName = k->d->m_fileSystemFriendlyName; d->m_mustNotify = true; - d->m_mustNotifyAboutDisplayName = false; d->m_sticky = k->d->m_sticky; d->m_mutable = k->d->m_mutable; - d->updatePreviousDisplayName(); } bool Kit::isValid() const @@ -360,8 +340,7 @@ void Kit::setUnexpandedDisplayName(const QString &name) return; d->m_displayName = name; - d->updatePreviousDisplayName(); - kitDisplayNameChanged(); + kitUpdated(); } QStringList Kit::candidateNameList(const QString &base) const @@ -576,7 +555,7 @@ IOutputParser *Kit::createOutputParser() const return first; } -QString Kit::toHtml() const +QString Kit::toHtml(const QList<Task> &additional) const { QString rc; QTextStream str(&rc); @@ -584,8 +563,9 @@ QString Kit::toHtml() const str << "<h3>" << displayName() << "</h3>"; str << "<table>"; - if (!isValid() || hasWarning()) { - QList<Task> issues = validate(); + if (!isValid() || hasWarning() || !additional.isEmpty()) { + QList<Task> issues = additional; + issues.append(validate()); str << "<p>"; foreach (const Task &t, issues) { str << "<b>"; @@ -712,28 +692,11 @@ Utils::AbstractMacroExpander *Kit::macroExpander() const void Kit::kitUpdated() { if (d->m_nestedBlockingLevel > 0) { - if (!d->m_mustNotifyAboutDisplayName) - d->m_mustNotify = true; - return; - } - d->m_hasValidityInfo = false; - if (displayName() != d->m_previousDisplayName) { - d->updatePreviousDisplayName(); - KitManager::notifyAboutDisplayNameChange(this); - } else { - KitManager::notifyAboutUpdate(this); - } -} - -void Kit::kitDisplayNameChanged() -{ - if (d->m_nestedBlockingLevel > 0) { - d->m_mustNotifyAboutDisplayName = true; - d->m_mustNotify = false; + d->m_mustNotify = true; return; } d->m_hasValidityInfo = false; - KitManager::notifyAboutDisplayNameChange(this); + KitManager::notifyAboutUpdate(this); } } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/kit.h b/src/plugins/projectexplorer/kit.h index 715eb4190eca555fda161d5683f282aca8f700c5..a169d89c976873bbc4dd4036cc44a384f785469c 100644 --- a/src/plugins/projectexplorer/kit.h +++ b/src/plugins/projectexplorer/kit.h @@ -108,7 +108,7 @@ public: void addToEnvironment(Utils::Environment &env) const; IOutputParser *createOutputParser() const; - QString toHtml() const; + QString toHtml(const QList<Task> &additional = QList<Task>()) const; Kit *clone(bool keepName = false) const; void copyFrom(const Kit *k); diff --git a/src/plugins/projectexplorer/kitmanager.cpp b/src/plugins/projectexplorer/kitmanager.cpp index fa58cb76f5f1c201edc66f804f28759fcbbde30b..63f7c64f1e0c81c4ef7e692b5c7ff4df13f0f83d 100644 --- a/src/plugins/projectexplorer/kitmanager.cpp +++ b/src/plugins/projectexplorer/kitmanager.cpp @@ -107,14 +107,13 @@ public: Kit *m_defaultKit; bool m_initialized; - bool m_keepDisplayNameUnique; QList<KitInformation *> m_informationList; QList<Kit *> m_kitList; Utils::PersistentSettingsWriter *m_writer; }; 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() @@ -155,13 +154,6 @@ KitManager::KitManager(QObject *parent) : this, SIGNAL(kitsChanged())); } -bool KitManager::setKeepDisplayNameUnique(bool unique) -{ - bool current = d->m_keepDisplayNameUnique; - d->m_keepDisplayNameUnique = unique; - return current; -} - void KitManager::restoreKits() { QTC_ASSERT(!d->m_initialized, return); @@ -477,45 +469,6 @@ void KitManager::deleteKit(Kit *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) { if (!k || !isLoaded()) @@ -539,8 +492,6 @@ bool KitManager::registerKit(ProjectExplorer::Kit *k) if (kits().contains(k)) return false; - k->setUnexpandedDisplayName(uniqueKitName(k, kits())); - // make sure we have all the information in our kits: m_instance->addKit(k); diff --git a/src/plugins/projectexplorer/kitmanager.h b/src/plugins/projectexplorer/kitmanager.h index d0636c0e736a63b1b073d5fab84891248f50cfba..60a99ca795b373e95e4f35c41642a1eaa1cf53ec 100644 --- a/src/plugins/projectexplorer/kitmanager.h +++ b/src/plugins/projectexplorer/kitmanager.h @@ -144,8 +144,6 @@ public: static void deleteKit(Kit *k); - static QString uniqueKitName(const Kit *k, const QList<Kit *> &allKits); - static bool registerKit(ProjectExplorer::Kit *k); static void deregisterKit(ProjectExplorer::Kit *k); static void setDefaultKit(ProjectExplorer::Kit *k); @@ -177,8 +175,6 @@ signals: private: explicit KitManager(QObject *parent = 0); - static bool setKeepDisplayNameUnique(bool unique); - // Make sure the this is only called after all // KitInformation are registered! void restoreKits(); @@ -192,7 +188,6 @@ private: }; KitList restoreKits(const Utils::FileName &fileName); - static void notifyAboutDisplayNameChange(ProjectExplorer::Kit *k); static void notifyAboutUpdate(ProjectExplorer::Kit *k); void addKit(Kit *k); diff --git a/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp b/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp index b4e15fbbc3e3c1e3ffe63a0d3b162f74f40a6e4e..412b99544fd2e6d4b62dfc9924a8aeeea3566698 100644 --- a/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp +++ b/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp @@ -32,6 +32,7 @@ #include "kit.h" #include "kitmanager.h" +#include "task.h" #include <utils/detailswidget.h> #include <utils/qtcassert.h> @@ -62,7 +63,8 @@ KitManagerConfigWidget::KitManagerConfigWidget(Kit *k) : m_fileSystemFriendlyNameLineEdit(new QLineEdit), m_kit(k), 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_cast<Qt::Alignment>(style()->styleHint(QStyle::SH_FormLayoutLabelAlignment)); @@ -182,12 +184,17 @@ bool KitManagerConfigWidget::isValid() const bool KitManagerConfigWidget::hasWarning() const { - return m_modifiedKit->hasWarning(); + return m_modifiedKit->hasWarning() || !m_hasUniqueName; } 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) @@ -234,6 +241,11 @@ void KitManagerConfigWidget::updateVisibility() } } +void KitManagerConfigWidget::setHasUniqueName(bool unique) +{ + m_hasUniqueName = unique; +} + void KitManagerConfigWidget::makeStickySubWidgetsReadOnly() { foreach (KitConfigWidget *w, m_widgets) { diff --git a/src/plugins/projectexplorer/kitmanagerconfigwidget.h b/src/plugins/projectexplorer/kitmanagerconfigwidget.h index 0187b4362345885da2e3ee51855e21af476543bb..d6c14278aa1a60687abc9eec216db518a9ffd5db 100644 --- a/src/plugins/projectexplorer/kitmanagerconfigwidget.h +++ b/src/plugins/projectexplorer/kitmanagerconfigwidget.h @@ -72,6 +72,8 @@ public: void removeKit(); void updateVisibility(); + void setHasUniqueName(bool unique); + signals: void dirty(); @@ -103,6 +105,7 @@ private: Kit *m_modifiedKit; bool m_isDefaultKit; bool m_fixingKit; + bool m_hasUniqueName; QPixmap m_background; QList<QAction *> m_actions; }; diff --git a/src/plugins/projectexplorer/kitmodel.cpp b/src/plugins/projectexplorer/kitmodel.cpp index 551dfc9b3650a19bd6626db7a724341bb4257fc9..3f3ee55e78248eec58338c43cb9f001a4780d03a 100644 --- a/src/plugins/projectexplorer/kitmodel.cpp +++ b/src/plugins/projectexplorer/kitmodel.cpp @@ -105,10 +105,12 @@ KitModel::KitModel(QBoxLayout *parentLayout, QObject *parent) : connect(KitManager::instance(), SIGNAL(kitAdded(ProjectExplorer::Kit*)), this, SLOT(addKit(ProjectExplorer::Kit*))); - connect(KitManager::instance(), SIGNAL(kitRemoved(ProjectExplorer::Kit*)), - this, SLOT(removeKit(ProjectExplorer::Kit*))); + connect(KitManager::instance(), SIGNAL(kitUpdated(ProjectExplorer::Kit*)), + this, SLOT(updateKit(ProjectExplorer::Kit*))); connect(KitManager::instance(), SIGNAL(unmanagedKitUpdated(ProjectExplorer::Kit*)), this, SLOT(updateKit(ProjectExplorer::Kit*))); + connect(KitManager::instance(), SIGNAL(kitRemoved(ProjectExplorer::Kit*)), + this, SLOT(removeKit(ProjectExplorer::Kit*))); connect(KitManager::instance(), SIGNAL(defaultkitChanged()), 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() { // Remove unused kits: @@ -286,8 +307,6 @@ void KitModel::apply() } // Update kits: - bool unique = KitManager::setKeepDisplayNameUnique(false); - m_keepUnique = false; nodes = m_autoRoot->childNodes; // These can be dirty due to being made default! nodes.append(m_manualRoot->childNodes); foreach (KitNode *n, nodes) { @@ -298,8 +317,6 @@ void KitModel::apply() emit dataChanged(index(n, 0), index(n, columnCount(QModelIndex()))); } } - m_keepUnique = unique; - KitManager::setKeepDisplayNameUnique(unique); } void KitModel::markForRemoval(Kit *k) @@ -352,12 +369,6 @@ Kit *KitModel::markForAddition(Kit *baseKit) 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 { if (node->parent == 0) // is root (or was marked for deletion) @@ -428,6 +439,13 @@ void KitModel::addKit(Kit *k) createNode(parent, k); endInsertRows(); + validateKitNames(); + emit kitStateChanged(); +} + +void KitModel::updateKit(Kit *k) +{ + validateKitNames(); emit kitStateChanged(); } @@ -464,15 +482,10 @@ void KitModel::removeKit(Kit *k) endRemoveRows(); delete node; + validateKitNames(); emit kitStateChanged(); } -void KitModel::updateKit(Kit *k) -{ - if (m_keepUnique) - k->setUnexpandedDisplayName(findNameFor(k)); -} - void KitModel::changeDefaultKit() { Kit *defaultKit = KitManager::defaultKit(); diff --git a/src/plugins/projectexplorer/kitmodel.h b/src/plugins/projectexplorer/kitmodel.h index ce3f3afc240106849e37bd1a56f0aca8d8524a28..5b9ddc9eea5e629275eff018c65e12433b67a455 100644 --- a/src/plugins/projectexplorer/kitmodel.h +++ b/src/plugins/projectexplorer/kitmodel.h @@ -86,17 +86,16 @@ public: void markForRemoval(Kit *k); Kit *markForAddition(Kit *baseKit); - QString findNameFor(Kit *k); - signals: void kitStateChanged(); private slots: void addKit(ProjectExplorer::Kit *k); + void updateKit(ProjectExplorer::Kit *k); void removeKit(ProjectExplorer::Kit *k); - void updateKit(ProjectExplorer::Kit*); void changeDefaultKit(); void setDirty(); + void validateKitNames(); private: QModelIndex index(KitNode *, int column = 0) const;