diff options
-rw-r--r-- | src/libs/utils/displayname.cpp | 2 | ||||
-rw-r--r-- | src/libs/utils/displayname.h | 2 | ||||
-rw-r--r-- | src/plugins/projectexplorer/projectconfiguration.h | 1 | ||||
-rw-r--r-- | src/plugins/projectexplorer/projectconfigurationmodel.cpp | 20 | ||||
-rw-r--r-- | src/plugins/projectexplorer/runconfiguration.cpp | 41 | ||||
-rw-r--r-- | src/plugins/projectexplorer/runconfiguration.h | 6 | ||||
-rw-r--r-- | src/plugins/projectexplorer/target.cpp | 4 | ||||
-rw-r--r-- | src/plugins/projectexplorer/target.h | 1 |
8 files changed, 68 insertions, 9 deletions
diff --git a/src/libs/utils/displayname.cpp b/src/libs/utils/displayname.cpp index b4082a6092..b8402c9402 100644 --- a/src/libs/utils/displayname.cpp +++ b/src/libs/utils/displayname.cpp @@ -37,7 +37,7 @@ bool DisplayName::usesDefaultValue() const void DisplayName::toMap(QVariantMap &map, const QString &key) const { - if (!usesDefaultValue()) + if (m_forceSerialization || !usesDefaultValue()) map.insert(key, m_value); } diff --git a/src/libs/utils/displayname.h b/src/libs/utils/displayname.h index c1e7f7b10a..b7a9b5f90d 100644 --- a/src/libs/utils/displayname.h +++ b/src/libs/utils/displayname.h @@ -22,6 +22,7 @@ public: QString value() const; QString defaultValue() const { return m_defaultValue; } bool usesDefaultValue() const; + void forceSerialization() { m_forceSerialization = true; } void toMap(QVariantMap &map, const QString &key) const; void fromMap(const QVariantMap &map, const QString &key); @@ -29,6 +30,7 @@ public: private: QString m_value; QString m_defaultValue; + bool m_forceSerialization = false; }; bool QTCREATOR_UTILS_EXPORT operator==(const DisplayName &dn1, const DisplayName &dn2); diff --git a/src/plugins/projectexplorer/projectconfiguration.h b/src/plugins/projectexplorer/projectconfiguration.h index 790d9ebf6b..713c187c83 100644 --- a/src/plugins/projectexplorer/projectconfiguration.h +++ b/src/plugins/projectexplorer/projectconfiguration.h @@ -38,6 +38,7 @@ public: bool usesDefaultDisplayName() const { return m_displayName.usesDefaultValue(); } void setDisplayName(const QString &name); void setDefaultDisplayName(const QString &name); + void forceDisplayNameSerialization() { m_displayName.forceSerialization(); } void setToolTip(const QString &text); QString toolTip() const; diff --git a/src/plugins/projectexplorer/projectconfigurationmodel.cpp b/src/plugins/projectexplorer/projectconfigurationmodel.cpp index 61e608dc4b..23b790a494 100644 --- a/src/plugins/projectexplorer/projectconfigurationmodel.cpp +++ b/src/plugins/projectexplorer/projectconfigurationmodel.cpp @@ -5,9 +5,10 @@ #include "buildconfiguration.h" #include "deployconfiguration.h" +#include "projectconfiguration.h" +#include "projectexplorertr.h" #include "runconfiguration.h" #include "target.h" -#include "projectconfiguration.h" #include <utils/algorithm.h> #include <utils/stringutils.h> @@ -30,6 +31,9 @@ static bool isOrderedBefore(const ProjectConfiguration *a, const ProjectConfigur ProjectConfigurationModel::ProjectConfigurationModel(Target *target) : m_target(target) { + connect(target, &Target::runConfigurationsUpdated, this, [this] { + emit dataChanged(index(0, 0), index(rowCount(), 0)); + }); } int ProjectConfigurationModel::rowCount(const QModelIndex &parent) const @@ -87,13 +91,17 @@ void ProjectConfigurationModel::displayNameChanged(ProjectConfiguration *pc) QVariant ProjectConfigurationModel::data(const QModelIndex &index, int role) const { + if (index.row() >= m_projectConfigurations.size()) + return {}; + ProjectConfiguration * const config = m_projectConfigurations.at(index.row()); + if (role == Qt::DisplayRole) { - const int row = index.row(); - if (row < m_projectConfigurations.size()) - return m_projectConfigurations.at(row)->expandedDisplayName(); + QString displayName = config->expandedDisplayName(); + if (const auto rc = qobject_cast<RunConfiguration *>(config); rc && !rc->hasCreator()) + displayName += QString(" [%1]").arg(Tr::tr("unavailable")); + return displayName; } - - return QVariant(); + return {}; } ProjectConfiguration *ProjectConfigurationModel::projectConfigurationAt(int i) const diff --git a/src/plugins/projectexplorer/runconfiguration.cpp b/src/plugins/projectexplorer/runconfiguration.cpp index 452d07c359..ab6e4fc32f 100644 --- a/src/plugins/projectexplorer/runconfiguration.cpp +++ b/src/plugins/projectexplorer/runconfiguration.cpp @@ -45,6 +45,7 @@ using namespace ProjectExplorer::Internal; namespace ProjectExplorer { const char BUILD_KEY[] = "ProjectExplorer.RunConfiguration.BuildKey"; +const char CUSTOMIZED_KEY[] = "ProjectExplorer.RunConfiguration.Customized"; /////////////////////////////////////////////////////////////////////// // @@ -162,6 +163,7 @@ RunConfiguration::RunConfiguration(Target *target, Utils::Id id) : ProjectConfiguration(target, id) { QTC_CHECK(target && target == this->target()); + forceDisplayNameSerialization(); connect(target, &Target::parsingFinished, this, &RunConfiguration::update); m_expander.setDisplayName(Tr::tr("Run Settings")); @@ -239,6 +241,34 @@ bool RunConfiguration::isConfigured() const return !Utils::anyOf(checkForIssues(), [](const Task &t) { return t.type == Task::Error; }); } +bool RunConfiguration::isCustomized() const +{ + if (m_customized) + return true; + QVariantMap state = toMapSimple(); + + // TODO: Why do we save this at all? It's a computed value. + state.remove("RunConfiguration.WorkingDirectory.default"); + + return state != m_pristineState; +} + +bool RunConfiguration::hasCreator() const +{ + return Utils::contains(RunConfigurationFactory::creatorsForTarget(target()), + [this](const RunConfigurationCreationInfo &info) { + return info.factory->runConfigurationId() == id() && info.buildKey == buildKey(); + }); +} + +void RunConfiguration::setPristineState() +{ + if (!m_customized) { + m_pristineState = toMapSimple(); + m_pristineState.remove("RunConfiguration.WorkingDirectory.default"); + } +} + void RunConfiguration::addAspectFactory(const AspectFactory &aspectFactory) { theAspectFactories.push_back(aspectFactory); @@ -277,8 +307,14 @@ Task RunConfiguration::createConfigurationIssue(const QString &description) cons QVariantMap RunConfiguration::toMap() const { - QVariantMap map = ProjectConfiguration::toMap(); + QVariantMap map = toMapSimple(); + map.insert(CUSTOMIZED_KEY, isCustomized()); + return map; +} +QVariantMap RunConfiguration::toMapSimple() const +{ + QVariantMap map = ProjectConfiguration::toMap(); map.insert(BUILD_KEY, m_buildKey); // FIXME: Remove this id mangling, e.g. by using a separate entry for the build key. @@ -344,6 +380,7 @@ bool RunConfiguration::fromMap(const QVariantMap &map) if (!ProjectConfiguration::fromMap(map)) return false; + m_customized = m_customized || map.value(CUSTOMIZED_KEY, false).toBool(); m_buildKey = map.value(BUILD_KEY).toString(); if (m_buildKey.isEmpty()) { @@ -584,6 +621,7 @@ RunConfiguration *RunConfigurationCreationInfo::create(Target *target) const rc->m_buildKey = buildKey; rc->update(); rc->setDisplayName(displayName); + rc->setPristineState(); return rc; } @@ -597,6 +635,7 @@ RunConfiguration *RunConfigurationFactory::restore(Target *parent, const QVarian RunConfiguration *rc = factory->create(parent); if (rc->fromMap(map)) { rc->update(); + rc->setPristineState(); return rc; } delete rc; diff --git a/src/plugins/projectexplorer/runconfiguration.h b/src/plugins/projectexplorer/runconfiguration.h index 5970414156..9d9a55120b 100644 --- a/src/plugins/projectexplorer/runconfiguration.h +++ b/src/plugins/projectexplorer/runconfiguration.h @@ -111,7 +111,10 @@ public: QWidget *createConfigurationWidget(); bool isConfigured() const; + bool isCustomized() const; + bool hasCreator() const; virtual Tasks checkForIssues() const { return {}; } + void setPristineState(); using CommandLineGetter = std::function<Utils::CommandLine()>; void setCommandLineGetter(const CommandLineGetter &cmdGetter); @@ -170,6 +173,7 @@ private: // Any additional data should be handled by aspects. bool fromMap(const QVariantMap &map) final; QVariantMap toMap() const final; + QVariantMap toMapSimple() const; static void addAspectFactory(const AspectFactory &aspectFactory); @@ -182,6 +186,8 @@ private: RunnableModifier m_runnableModifier; Updater m_updater; Utils::MacroExpander m_expander; + QVariantMap m_pristineState; + bool m_customized = false; }; class RunConfigurationCreationInfo diff --git a/src/plugins/projectexplorer/target.cpp b/src/plugins/projectexplorer/target.cpp index 82d85f84e5..d2f6b3535e 100644 --- a/src/plugins/projectexplorer/target.cpp +++ b/src/plugins/projectexplorer/target.cpp @@ -706,7 +706,7 @@ void Target::updateDefaultRunConfigurations() present = true; } } - if (!present) + if (!present && !rc->isCustomized()) toRemove.append(rc); } configuredCount -= toRemove.count(); @@ -797,6 +797,8 @@ void Target::updateDefaultRunConfigurations() // Remove the RCs that are no longer needed: for (RunConfiguration *rc : std::as_const(removalList)) removeRunConfiguration(rc); + + emit runConfigurationsUpdated(); } QVariant Target::namedSettings(const QString &name) const diff --git a/src/plugins/projectexplorer/target.h b/src/plugins/projectexplorer/target.h index 5cfb69eeca..6e4f06abd0 100644 --- a/src/plugins/projectexplorer/target.h +++ b/src/plugins/projectexplorer/target.h @@ -131,6 +131,7 @@ signals: void removedRunConfiguration(ProjectExplorer::RunConfiguration *rc); void addedRunConfiguration(ProjectExplorer::RunConfiguration *rc); void activeRunConfigurationChanged(ProjectExplorer::RunConfiguration *rc); + void runConfigurationsUpdated(); void removedBuildConfiguration(ProjectExplorer::BuildConfiguration *bc); void addedBuildConfiguration(ProjectExplorer::BuildConfiguration *bc); |