Kit: Introduce variables for Kit display names

This change also adds a AbstractMacroExpander for the QtKitInformation.

It supports the following variables in the Kit display name:

 %{Qt:version} - Qt version number
 %{Qt:type}    - Qt type
 %{Qt:name}    - Qt version name
 %{Qt:mkspec}  - mkspec used by the Qt version

Task-number: QTCREATORBUG-11118
Change-Id: I7263781336ab561c34880b187ebd55e81e6ca215
Reviewed-by: Daniel Teske <daniel.teske@digia.com>
Reviewed-by: hjk <hjk121@nokiamail.com>
This commit is contained in:
Tobias Hunger
2014-07-09 15:31:09 +02:00
committed by hjk
parent 351abd035b
commit 4a52d8216c
20 changed files with 293 additions and 46 deletions

View File

@@ -1147,7 +1147,7 @@ void AndroidConfigurations::updateAutomaticKitList()
foreach (Kit *kit, newKits) { foreach (Kit *kit, newKits) {
AndroidToolChain *tc = static_cast<AndroidToolChain *>(ToolChainKitInformation::toolChain(kit)); AndroidToolChain *tc = static_cast<AndroidToolChain *>(ToolChainKitInformation::toolChain(kit));
AndroidQtVersion *qt = static_cast<AndroidQtVersion *>(QtSupport::QtKitInformation::qtVersion(kit)); AndroidQtVersion *qt = static_cast<AndroidQtVersion *>(QtSupport::QtKitInformation::qtVersion(kit));
kit->setDisplayName(tr("Android for %1 (GCC %2, Qt %3)") kit->setUnexpandedDisplayName(tr("Android for %1 (GCC %2, Qt %3)")
.arg(qt->targetArch()) .arg(qt->targetArch())
.arg(tc->ndkToolChainVersion()) .arg(tc->ndkToolChainVersion())
.arg(qt->qtVersionString())); .arg(qt->qtVersionString()));

View File

@@ -308,7 +308,7 @@ void IosConfigurations::updateAutomaticKitList()
if (unique) break; if (unique) break;
displayName = baseDisplayName + QLatin1String("-") + QString::number(iVers); displayName = baseDisplayName + QLatin1String("-") + QString::number(iVers);
} }
kitAtt->setDisplayName(displayName); kitAtt->setUnexpandedDisplayName(displayName);
} }
kitAtt->setIconPath(Utils::FileName::fromString( kitAtt->setIconPath(Utils::FileName::fromString(
QLatin1String(Constants::IOS_SETTINGS_CATEGORY_ICON))); QLatin1String(Constants::IOS_SETTINGS_CATEGORY_ICON)));

View File

@@ -35,6 +35,8 @@
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <utils/fileutils.h> #include <utils/fileutils.h>
#include <utils/qtcassert.h>
#include <utils/stringutils.h>
#include <QApplication> #include <QApplication>
#include <QFileInfo> #include <QFileInfo>
@@ -62,6 +64,33 @@ const char STICKY_INFO_KEY[] = "PE.Profile.StickyInfo";
namespace ProjectExplorer { namespace ProjectExplorer {
// --------------------------------------------------------------------
// KitMacroExpander:
// --------------------------------------------------------------------
class KitMacroExpander : public Utils::AbstractMacroExpander
{
public:
KitMacroExpander(const QList<Utils::AbstractMacroExpander *> &children) :
m_childExpanders(children)
{ }
~KitMacroExpander() { qDeleteAll(m_childExpanders); }
bool resolveMacro(const QString &name, QString *ret);
private:
QList<Utils::AbstractMacroExpander *> m_childExpanders;
};
bool KitMacroExpander::resolveMacro(const QString &name, QString *ret)
{
foreach (Utils::AbstractMacroExpander *expander, m_childExpanders) {
if (expander->resolveMacro(name, ret))
return true;
}
return false;
}
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
// KitPrivate // KitPrivate
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
@@ -71,7 +100,7 @@ namespace Internal {
class KitPrivate class KitPrivate
{ {
public: public:
KitPrivate(Id id) : KitPrivate(Id id, Kit *k) :
m_id(id), m_id(id),
m_nestedBlockingLevel(0), m_nestedBlockingLevel(0),
m_autodetected(false), m_autodetected(false),
@@ -81,16 +110,37 @@ public:
m_hasWarning(false), m_hasWarning(false),
m_hasValidityInfo(false), m_hasValidityInfo(false),
m_mustNotify(false), m_mustNotify(false),
m_mustNotifyAboutDisplayName(false) m_mustNotifyAboutDisplayName(false),
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;
foreach (const KitInformation *ki, KitManager::kitInformation()) {
Utils::AbstractMacroExpander *tmp = ki->createMacroExpander(k);
if (tmp)
expanders.append(tmp);
}
m_macroExpander = new KitMacroExpander(expanders);
}
~KitPrivate()
{ 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;
Id m_id; Id m_id;
int m_nestedBlockingLevel; int m_nestedBlockingLevel;
@@ -108,6 +158,7 @@ public:
QHash<Core::Id, QVariant> m_data; QHash<Core::Id, QVariant> m_data;
QSet<Core::Id> m_sticky; QSet<Core::Id> m_sticky;
QSet<Core::Id> m_mutable; QSet<Core::Id> m_mutable;
Utils::AbstractMacroExpander *m_macroExpander;
}; };
} // namespace Internal } // namespace Internal
@@ -117,16 +168,17 @@ public:
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
Kit::Kit(Core::Id id) : Kit::Kit(Core::Id id) :
d(new Internal::KitPrivate(id)) d(new Internal::KitPrivate(id, this))
{ {
foreach (KitInformation *sti, KitManager::kitInformation()) foreach (KitInformation *sti, KitManager::kitInformation())
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) :
d(new Internal::KitPrivate(Core::Id())) d(new Internal::KitPrivate(Core::Id(), this))
{ {
d->m_id = Id::fromSetting(data.value(QLatin1String(ID_KEY))); d->m_id = Id::fromSetting(data.value(QLatin1String(ID_KEY)));
@@ -160,6 +212,8 @@ 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()
@@ -201,6 +255,7 @@ 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;
} }
@@ -215,9 +270,10 @@ 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 = 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
@@ -277,11 +333,16 @@ void Kit::setup()
info.at(i)->setup(this); info.at(i)->setup(this);
} }
QString Kit::displayName() const QString Kit::unexpandedDisplayName() const
{ {
return d->m_displayName; return d->m_displayName;
} }
QString Kit::displayName() const
{
return Utils::expandMacros(unexpandedDisplayName(), macroExpander());
}
static QString candidateName(const QString &name, const QString &postfix) static QString candidateName(const QString &name, const QString &postfix)
{ {
if (name.contains(postfix)) if (name.contains(postfix))
@@ -293,11 +354,13 @@ static QString candidateName(const QString &name, const QString &postfix)
return candidate; return candidate;
} }
void Kit::setDisplayName(const QString &name) void Kit::setUnexpandedDisplayName(const QString &name)
{ {
if (d->m_displayName == name) if (d->m_displayName == name)
return; return;
d->m_displayName = name; d->m_displayName = name;
d->updatePreviousDisplayName();
kitDisplayNameChanged(); kitDisplayNameChanged();
} }
@@ -310,7 +373,7 @@ QStringList Kit::candidateNameList(const QString &base) const
if (!postfix.isEmpty()) { if (!postfix.isEmpty()) {
QString tmp = candidateName(base, postfix); QString tmp = candidateName(base, postfix);
if (!tmp.isEmpty()) if (!tmp.isEmpty())
result << candidateName(base, postfix); result << tmp;
} }
} }
return result; return result;
@@ -621,14 +684,26 @@ bool Kit::hasFeatures(const FeatureSet &features) const
return availableFeatures().contains(features); return availableFeatures().contains(features);
} }
Utils::AbstractMacroExpander *Kit::macroExpander() const
{
QTC_CHECK(d->m_macroExpander);
return d->m_macroExpander;
}
void Kit::kitUpdated() void Kit::kitUpdated()
{ {
if (d->m_nestedBlockingLevel > 0 && !d->m_mustNotifyAboutDisplayName) { if (d->m_nestedBlockingLevel > 0) {
d->m_mustNotify = true; if (!d->m_mustNotifyAboutDisplayName)
d->m_mustNotify = true;
return; return;
} }
d->m_hasValidityInfo = false; d->m_hasValidityInfo = false;
KitManager::notifyAboutUpdate(this); if (displayName() != d->m_previousDisplayName) {
d->updatePreviousDisplayName();
KitManager::notifyAboutDisplayNameChange(this);
} else {
KitManager::notifyAboutUpdate(this);
}
} }
void Kit::kitDisplayNameChanged() void Kit::kitDisplayNameChanged()

View File

@@ -38,7 +38,10 @@
#include <QSet> #include <QSet>
#include <QVariant> #include <QVariant>
namespace Utils { class Environment; } namespace Utils {
class AbstractMacroExpander;
class Environment;
} // namespace Utils
namespace ProjectExplorer { namespace ProjectExplorer {
class IOutputParser; class IOutputParser;
@@ -71,8 +74,9 @@ public:
// Fix will not look at other information in the kit! // Fix will not look at other information in the kit!
void setup(); // Apply advanced magic(TM). Used only once on each kit during initial setup. void setup(); // Apply advanced magic(TM). Used only once on each kit during initial setup.
QString unexpandedDisplayName() const;
QString displayName() const; QString displayName() const;
void setDisplayName(const QString &name); void setUnexpandedDisplayName(const QString &name);
QStringList candidateNameList(const QString &base) const; QStringList candidateNameList(const QString &base) const;
@@ -122,6 +126,8 @@ public:
Core::FeatureSet availableFeatures() const; Core::FeatureSet availableFeatures() const;
bool hasFeatures(const Core::FeatureSet &features) const; bool hasFeatures(const Core::FeatureSet &features) const;
Utils::AbstractMacroExpander *macroExpander() const;
private: private:
void setSdkProvided(bool sdkProvided); void setSdkProvided(bool sdkProvided);

View File

@@ -0,0 +1,51 @@
/****************************************************************************
**
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia. For licensing terms and
** conditions see http://qt.digia.com/licensing. For further information
** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Digia gives you certain additional
** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
****************************************************************************/
#include "kitinformationmacroexpander.h"
#include <utils/qtcassert.h>
namespace ProjectExplorer {
KitInformationMacroExpander::KitInformationMacroExpander(const Kit *k) :
m_kit(k)
{
QTC_CHECK(k);
}
const Kit *KitInformationMacroExpander::kit() const
{
return m_kit;
}
// --------------------------------------------------------------------------
// KitInformationMacroExpander:
// --------------------------------------------------------------------------
} // namespace ProjectExplorer

View File

@@ -0,0 +1,58 @@
/****************************************************************************
**
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia. For licensing terms and
** conditions see http://qt.digia.com/licensing. For further information
** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Digia gives you certain additional
** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
****************************************************************************/
#ifndef KITINFORMATIONMACROEXPANDER_H
#define KITINFORMATIONMACROEXPANDER_H
#include "projectexplorer_export.h"
#include <utils/stringutils.h>
namespace ProjectExplorer {
class Kit;
// --------------------------------------------------------------------------
// KitInformationMacroExpander:
// --------------------------------------------------------------------------
class PROJECTEXPLORER_EXPORT KitInformationMacroExpander : public Utils::AbstractMacroExpander
{
public:
KitInformationMacroExpander(const Kit *k);
const Kit *kit() const;
private:
const Kit *m_kit;
};
} // namespace ProjectExplorer
#endif // KITINFORMATIONMACROEXPANDER_H

View File

@@ -41,6 +41,7 @@
#include <utils/persistentsettings.h> #include <utils/persistentsettings.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <utils/stringutils.h>
#include <utils/environment.h> #include <utils/environment.h>
#include <utils/algorithm.h> #include <utils/algorithm.h>
@@ -243,7 +244,7 @@ void KitManager::restoreKits()
if (kits().isEmpty()) { if (kits().isEmpty()) {
Kit *defaultKit = new Kit; // One kit using default values Kit *defaultKit = new Kit; // One kit using default values
defaultKit->setDisplayName(tr("Desktop")); defaultKit->setUnexpandedDisplayName(tr("Desktop"));
defaultKit->setSdkProvided(false); defaultKit->setSdkProvided(false);
defaultKit->setAutoDetected(false); defaultKit->setAutoDetected(false);
defaultKit->setIconPath(Utils::FileName::fromLatin1(":///DESKTOP///")); defaultKit->setIconPath(Utils::FileName::fromLatin1(":///DESKTOP///"));
@@ -476,7 +477,7 @@ void KitManager::deleteKit(Kit *k)
delete k; delete k;
} }
QString KitManager::uniqueKitName(const Kit *k, const QString &name, const QList<Kit *> &allKits) QString KitManager::uniqueKitName(const Kit *k, const QList<Kit *> &allKits)
{ {
QStringList nameList; QStringList nameList;
nameList << QString(); // Disallow empty kit names! nameList << QString(); // Disallow empty kit names!
@@ -486,20 +487,21 @@ QString KitManager::uniqueKitName(const Kit *k, const QString &name, const QList
nameList.append(tmp->candidateNameList(tmp->displayName())); nameList.append(tmp->candidateNameList(tmp->displayName()));
} }
QStringList candidateNames = k->candidateNameList(name); const QString dn = k->displayName();
const QString udn = k->unexpandedDisplayName();
QString uniqueName = Project::makeUnique(name, nameList); QString uniqueName = Project::makeUnique(dn, nameList);
if (uniqueName != name) { if (uniqueName == dn)
foreach (const QString &candidate, candidateNames) { return udn;
const QString tmp = Project::makeUnique(candidate, nameList);
if (tmp == candidate) { QStringList candidateNames = k->candidateNameList(udn);
uniqueName = tmp; foreach (const QString &candidate, candidateNames) {
break; QString expandedCandidate = Utils::expandMacros(candidate, k->macroExpander());
} if (!nameList.contains(expandedCandidate))
} return candidate;
} }
return uniqueName; return udn + uniqueName.mid(dn.count());
} }
void KitManager::notifyAboutDisplayNameChange(Kit *k) void KitManager::notifyAboutDisplayNameChange(Kit *k)
@@ -507,7 +509,7 @@ void KitManager::notifyAboutDisplayNameChange(Kit *k)
if (!k) if (!k)
return; return;
if (d->m_kitList.contains(k) && d->m_keepDisplayNameUnique) if (d->m_kitList.contains(k) && d->m_keepDisplayNameUnique)
k->setDisplayName(uniqueKitName(k, k->displayName(), kits())); k->setUnexpandedDisplayName(uniqueKitName(k, kits()));
int pos = d->m_kitList.indexOf(k); int pos = d->m_kitList.indexOf(k);
if (pos >= 0 && d->m_initialized) if (pos >= 0 && d->m_initialized)
d->moveKit(pos); d->moveKit(pos);
@@ -537,7 +539,7 @@ bool KitManager::registerKit(ProjectExplorer::Kit *k)
if (kits().contains(k)) if (kits().contains(k))
return false; return false;
k->setDisplayName(uniqueKitName(k, k->displayName(), kits())); 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

@@ -41,6 +41,7 @@
#include <functional> #include <functional>
namespace Utils { namespace Utils {
class AbstractMacroExpander;
class FileName; class FileName;
class Environment; class Environment;
} }
@@ -97,6 +98,9 @@ public:
virtual QString displayNameForPlatform(const ProjectExplorer::Kit *k, const QString &platform) const; virtual QString displayNameForPlatform(const ProjectExplorer::Kit *k, const QString &platform) const;
virtual Core::FeatureSet availableFeatures(const Kit *k) const; virtual Core::FeatureSet availableFeatures(const Kit *k) const;
virtual Utils::AbstractMacroExpander *createMacroExpander(const Kit *k) const
{ Q_UNUSED(k); return 0; }
protected: protected:
void setId(Core::Id id) { m_id = id; } void setId(Core::Id id) { m_id = id; }
void setPriority(int priority) { m_priority = priority; } void setPriority(int priority) { m_priority = priority; }
@@ -140,7 +144,7 @@ public:
static void deleteKit(Kit *k); static void deleteKit(Kit *k);
static QString uniqueKitName(const Kit *k, const QString &name, const QList<Kit *> &allKits); 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);

View File

@@ -35,6 +35,7 @@
#include <utils/detailswidget.h> #include <utils/detailswidget.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <utils/stringutils.h>
#include <QAction> #include <QAction>
#include <QRegExp> #include <QRegExp>
@@ -129,7 +130,7 @@ KitManagerConfigWidget::~KitManagerConfigWidget()
QString KitManagerConfigWidget::displayName() const QString KitManagerConfigWidget::displayName() const
{ {
return m_nameEdit->text(); return m_modifiedKit->displayName();
} }
void KitManagerConfigWidget::apply() void KitManagerConfigWidget::apply()
@@ -162,7 +163,7 @@ void KitManagerConfigWidget::discard()
m_isDefaultKit = false; m_isDefaultKit = false;
} }
m_iconButton->setIcon(m_modifiedKit->icon()); m_iconButton->setIcon(m_modifiedKit->icon());
m_nameEdit->setText(m_modifiedKit->displayName()); m_nameEdit->setText(m_modifiedKit->unexpandedDisplayName());
m_fileSystemFriendlyNameLineEdit->setText(m_modifiedKit->customFileSystemFriendlyName()); m_fileSystemFriendlyNameLineEdit->setText(m_modifiedKit->customFileSystemFriendlyName());
emit dirty(); emit dirty();
} }
@@ -292,7 +293,7 @@ void KitManagerConfigWidget::setIcon()
void KitManagerConfigWidget::setDisplayName() void KitManagerConfigWidget::setDisplayName()
{ {
int pos = m_nameEdit->cursorPosition(); int pos = m_nameEdit->cursorPosition();
m_modifiedKit->setDisplayName(m_nameEdit->text()); m_modifiedKit->setUnexpandedDisplayName(m_nameEdit->text());
m_nameEdit->setCursorPosition(pos); m_nameEdit->setCursorPosition(pos);
} }
@@ -314,7 +315,10 @@ void KitManagerConfigWidget::workingCopyWasUpdated(Kit *k)
foreach (KitConfigWidget *w, m_widgets) foreach (KitConfigWidget *w, m_widgets)
w->refresh(); w->refresh();
m_nameEdit->setText(k->displayName());
if (k->unexpandedDisplayName() != m_nameEdit->text())
m_nameEdit->setText(k->unexpandedDisplayName());
m_fileSystemFriendlyNameLineEdit->setText(k->customFileSystemFriendlyName()); m_fileSystemFriendlyNameLineEdit->setText(k->customFileSystemFriendlyName());
m_iconButton->setIcon(k->icon()); m_iconButton->setIcon(k->icon());
updateVisibility(); updateVisibility();

View File

@@ -339,7 +339,7 @@ Kit *KitModel::markForAddition(Kit *baseKit)
k->copyFrom(baseKit); k->copyFrom(baseKit);
k->setAutoDetected(false); // Make sure we have a manual kit! k->setAutoDetected(false); // Make sure we have a manual kit!
k->setSdkProvided(false); k->setSdkProvided(false);
k->setDisplayName(tr("Clone of %1").arg(k->displayName())); k->setUnexpandedDisplayName(tr("Clone of %1").arg(k->unexpandedDisplayName()));
} else { } else {
k->setup(); k->setup();
} }
@@ -352,10 +352,10 @@ Kit *KitModel::markForAddition(Kit *baseKit)
return k; return k;
} }
QString KitModel::findNameFor(Kit *k, const QString &baseName) QString KitModel::findNameFor(Kit *k)
{ {
QList<Kit *> kits = kitList(m_root); QList<Kit *> kits = kitList(m_root);
return KitManager::uniqueKitName(k, baseName, kits); return KitManager::uniqueKitName(k, kits);
} }
QModelIndex KitModel::index(KitNode *node, int column) const QModelIndex KitModel::index(KitNode *node, int column) const
@@ -470,7 +470,7 @@ void KitModel::removeKit(Kit *k)
void KitModel::updateKit(Kit *k) void KitModel::updateKit(Kit *k)
{ {
if (m_keepUnique) if (m_keepUnique)
k->setDisplayName(findNameFor(k, k->displayName())); k->setUnexpandedDisplayName(findNameFor(k));
} }
void KitModel::changeDefaultKit() void KitModel::changeDefaultKit()

View File

@@ -86,7 +86,7 @@ public:
void markForRemoval(Kit *k); void markForRemoval(Kit *k);
Kit *markForAddition(Kit *baseKit); Kit *markForAddition(Kit *baseKit);
QString findNameFor(Kit *k, const QString &baseName); QString findNameFor(Kit *k);
signals: signals:
void kitStateChanged(); void kitStateChanged();

View File

@@ -29,6 +29,7 @@ HEADERS += projectexplorer.h \
kitinformation.h \ kitinformation.h \
kitinformationconfigwidget.h \ kitinformationconfigwidget.h \
kitfeatureprovider.h \ kitfeatureprovider.h \
kitinformationmacroexpander.h \
kitmanager.h \ kitmanager.h \
kitmanagerconfigwidget.h \ kitmanagerconfigwidget.h \
kitmodel.h \ kitmodel.h \
@@ -176,6 +177,7 @@ SOURCES += projectexplorer.cpp \
kitconfigwidget.cpp \ kitconfigwidget.cpp \
kitinformation.cpp \ kitinformation.cpp \
kitinformationconfigwidget.cpp \ kitinformationconfigwidget.cpp \
kitinformationmacroexpander.cpp \
kitmanager.cpp \ kitmanager.cpp \
kitmanagerconfigwidget.cpp \ kitmanagerconfigwidget.cpp \
kitmodel.cpp \ kitmodel.cpp \

View File

@@ -92,6 +92,7 @@ QtcPlugin {
"kitfeatureprovider.h", "kitfeatureprovider.h",
"kitinformation.cpp", "kitinformation.h", "kitinformation.cpp", "kitinformation.h",
"kitinformationconfigwidget.cpp", "kitinformationconfigwidget.h", "kitinformationconfigwidget.cpp", "kitinformationconfigwidget.h",
"kitinformationmacroexpander.cpp", "kitinformationmacroexpander.h",
"kitmanager.cpp", "kitmanager.h", "kitmanager.cpp", "kitmanager.h",
"kitmanagerconfigwidget.cpp", "kitmanagerconfigwidget.h", "kitmanagerconfigwidget.cpp", "kitmanagerconfigwidget.h",
"kitmodel.cpp", "kitmodel.h", "kitmodel.cpp", "kitmodel.h",

View File

@@ -60,7 +60,7 @@ void ProjectImporter::markTemporary(Kit *k)
setIsUpdating(true); setIsUpdating(true);
const QString name = k->displayName(); const QString name = k->displayName();
k->setDisplayName(QCoreApplication::translate("ProjectExplorer::ProjectImporter", k->setUnexpandedDisplayName(QCoreApplication::translate("ProjectExplorer::ProjectImporter",
"%1 - temporary").arg(name)); "%1 - temporary").arg(name));
k->setValue(KIT_TEMPORARY_NAME, k->displayName()); k->setValue(KIT_TEMPORARY_NAME, k->displayName());
@@ -81,7 +81,7 @@ void ProjectImporter::makePermanent(Kit *k)
k->removeKey(TEMPORARY_OF_PROJECTS); k->removeKey(TEMPORARY_OF_PROJECTS);
const QString tempName = k->value(KIT_TEMPORARY_NAME).toString(); const QString tempName = k->value(KIT_TEMPORARY_NAME).toString();
if (!tempName.isNull() && k->displayName() == tempName) if (!tempName.isNull() && k->displayName() == tempName)
k->setDisplayName(k->value(KIT_FINAL_NAME).toString()); k->setUnexpandedDisplayName(k->value(KIT_FINAL_NAME).toString());
k->removeKey(KIT_TEMPORARY_NAME); k->removeKey(KIT_TEMPORARY_NAME);
k->removeKey(KIT_FINAL_NAME); k->removeKey(KIT_FINAL_NAME);

View File

@@ -2127,7 +2127,7 @@ QVariantMap UserFileVersion11Upgrader::upgrade(const QVariantMap &map)
tmpKit->setValue("PE.Profile.Device", devId); tmpKit->setValue("PE.Profile.Device", devId);
// Set display name last: // Set display name last:
tmpKit->setDisplayName(extraTargetData.value(QLatin1String("ProjectExplorer.ProjectConfiguration.DisplayName")).toString()); tmpKit->setUnexpandedDisplayName(extraTargetData.value(QLatin1String("ProjectExplorer.ProjectConfiguration.DisplayName")).toString());
Kit *k = uniqueKit(tmpKit); Kit *k = uniqueKit(tmpKit);

View File

@@ -278,7 +278,7 @@ ProjectExplorer::Kit *QmakeProjectImporter::createTemporaryKit(QtSupport::BaseQt
ki->setup(k); ki->setup(k);
} }
k->setDisplayName(version->displayName()); k->setUnexpandedDisplayName(version->displayName());
setIsUpdating(true); setIsUpdating(true);
ProjectExplorer::KitManager::registerKit(k); ProjectExplorer::KitManager::registerKit(k);

View File

@@ -250,7 +250,7 @@ Kit *BlackBerryApiLevelConfiguration::createKit(
DeviceTypeKitInformation::setDeviceTypeId(kit, Constants::QNX_BB_OS_TYPE); DeviceTypeKitInformation::setDeviceTypeId(kit, Constants::QNX_BB_OS_TYPE);
SysRootKitInformation::setSysRoot(kit, m_sysRoot); SysRootKitInformation::setSysRoot(kit, m_sysRoot);
kit->setDisplayName(version->displayName()); kit->setUnexpandedDisplayName(version->displayName());
kit->setIconPath(FileName::fromString(QLatin1String(Constants::QNX_BB_CATEGORY_ICON))); kit->setIconPath(FileName::fromString(QLatin1String(Constants::QNX_BB_CATEGORY_ICON)));
kit->setAutoDetected(true); kit->setAutoDetected(true);

View File

@@ -228,7 +228,7 @@ ProjectExplorer::Kit *QnxConfiguration::createKit(QnxArchitecture arch,
DeviceTypeKitInformation::setDeviceTypeId(kit, Constants::QNX_QNX_OS_TYPE); DeviceTypeKitInformation::setDeviceTypeId(kit, Constants::QNX_QNX_OS_TYPE);
// TODO: Add sysroot? // TODO: Add sysroot?
kit->setDisplayName(displayName); kit->setUnexpandedDisplayName(displayName);
kit->setIconPath(FileName::fromString(QLatin1String(Constants::QNX_CATEGORY_ICON))); kit->setIconPath(FileName::fromString(QLatin1String(Constants::QNX_CATEGORY_ICON)));
kit->setAutoDetected(true); kit->setAutoDetected(true);

View File

@@ -34,6 +34,8 @@
#include "qtversionmanager.h" #include "qtversionmanager.h"
#include "qtparser.h" #include "qtparser.h"
#include <projectexplorer/kitinformationmacroexpander.h>
#include <utils/buildablehelperlibrary.h> #include <utils/buildablehelperlibrary.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
@@ -41,6 +43,41 @@ using namespace ProjectExplorer;
namespace QtSupport { namespace QtSupport {
namespace Internal {
class QtKitInformationMacroExpander : public ProjectExplorer::KitInformationMacroExpander
{
public:
QtKitInformationMacroExpander(const ProjectExplorer::Kit *k) :
ProjectExplorer::KitInformationMacroExpander(k)
{ }
bool resolveMacro(const QString &name, QString *ret);
};
bool QtKitInformationMacroExpander::resolveMacro(const QString &name, QString *ret)
{
BaseQtVersion *version = QtKitInformation::qtVersion(kit());
const QString noInfo = QCoreApplication::translate("QtSupport::QtKitInformation", "none");
if (name == QLatin1String("Qt:version")) {
*ret = version ? version->qtVersionString() : noInfo;
return true;
} else if (name == QLatin1String("Qt:name")) {
*ret = version ? version->displayName() : noInfo;
return true;
} else if (name == QLatin1String("Qt:type")) {
*ret = version ? version->type() : noInfo;
return true;
} else if (name == QLatin1String("Qt:mkspec")) {
*ret = version ? version->mkspec().toUserOutput() : noInfo;
return true;
}
return false;
}
} // namespace Internal
QtKitInformation::QtKitInformation() QtKitInformation::QtKitInformation()
{ {
setObjectName(QLatin1String("QtKitInformation")); setObjectName(QLatin1String("QtKitInformation"));
@@ -127,6 +164,11 @@ ProjectExplorer::IOutputParser *QtKitInformation::createOutputParser(const Proje
return 0; return 0;
} }
Utils::AbstractMacroExpander *QtKitInformation::createMacroExpander(const ProjectExplorer::Kit *k) const
{
return new Internal::QtKitInformationMacroExpander(k);
}
Core::Id QtKitInformation::id() Core::Id QtKitInformation::id()
{ {
return "QtSupport.QtInformation"; return "QtSupport.QtInformation";

View File

@@ -60,6 +60,8 @@ public:
void addToEnvironment(const ProjectExplorer::Kit *k, Utils::Environment &env) const; void addToEnvironment(const ProjectExplorer::Kit *k, Utils::Environment &env) const;
ProjectExplorer::IOutputParser *createOutputParser(const ProjectExplorer::Kit *k) const; ProjectExplorer::IOutputParser *createOutputParser(const ProjectExplorer::Kit *k) const;
Utils::AbstractMacroExpander *createMacroExpander(const ProjectExplorer::Kit *k) const;
static Core::Id id(); static Core::Id id();
static int qtVersionId(const ProjectExplorer::Kit *k); static int qtVersionId(const ProjectExplorer::Kit *k);
static void setQtVersionId(ProjectExplorer::Kit *k, const int id); static void setQtVersionId(ProjectExplorer::Kit *k, const int id);