diff --git a/src/plugins/projectexplorer/projectconfigurationmodel.cpp b/src/plugins/projectexplorer/projectconfigurationmodel.cpp index 23b790a4943..f2b731a6e1a 100644 --- a/src/plugins/projectexplorer/projectconfigurationmodel.cpp +++ b/src/plugins/projectexplorer/projectconfigurationmodel.cpp @@ -93,9 +93,9 @@ QVariant ProjectConfigurationModel::data(const QModelIndex &index, int role) con { if (index.row() >= m_projectConfigurations.size()) return {}; - ProjectConfiguration * const config = m_projectConfigurations.at(index.row()); if (role == Qt::DisplayRole) { + ProjectConfiguration * const config = m_projectConfigurations.at(index.row()); QString displayName = config->expandedDisplayName(); if (const auto rc = qobject_cast(config); rc && !rc->hasCreator()) displayName += QString(" [%1]").arg(Tr::tr("unavailable")); diff --git a/src/plugins/projectexplorer/runconfiguration.cpp b/src/plugins/projectexplorer/runconfiguration.cpp index f6cb72bde84..4a1e03d031d 100644 --- a/src/plugins/projectexplorer/runconfiguration.cpp +++ b/src/plugins/projectexplorer/runconfiguration.cpp @@ -140,6 +140,8 @@ void GlobalOrProjectAspect::resetProjectToGlobalSettings() static std::vector theAspectFactories; +static QList g_runConfigurationFactories; + RunConfiguration::RunConfiguration(Target *target, Utils::Id id) : ProjectConfiguration(target, id) { @@ -236,10 +238,13 @@ bool RunConfiguration::isCustomized() const bool RunConfiguration::hasCreator() const { - return Utils::contains(RunConfigurationFactory::creatorsForTarget(target()), - [this](const RunConfigurationCreationInfo &info) { - return info.factory->runConfigurationId() == id() && info.buildKey == buildKey(); - }); + for (RunConfigurationFactory *factory : std::as_const(g_runConfigurationFactories)) { + if (factory->runConfigurationId() == id()) { + if (factory->supportsBuildKey(target(), buildKey())) + return true; + } + } + return false; } void RunConfiguration::setPristineState() @@ -453,8 +458,6 @@ QVariantHash RunConfiguration::extraData() const ExtensionSystem::IPlugin::initialize() method. */ -static QList g_runConfigurationFactories; - /*! Constructs a RunConfigurationFactory instance and registers it into a global list. @@ -522,6 +525,14 @@ RunConfigurationFactory::availableCreators(Target *target) const }); } +bool RunConfigurationFactory::supportsBuildKey(Target *target, const QString &key) const +{ + if (!canHandle(target)) + return false; + const QList buildTargets = target->buildSystem()->applicationTargets(); + return anyOf(buildTargets, [&key](const BuildTargetInfo &info) { return info.buildKey == key; }); +} + /*! Adds a device type for which this RunConfigurationFactory can create RunConfigurations. @@ -674,4 +685,11 @@ FixedRunConfigurationFactory::availableCreators(Target *parent) const return {rci}; } +bool FixedRunConfigurationFactory::supportsBuildKey(Target *target, const QString &key) const +{ + Q_UNUSED(target) + Q_UNUSED(key) + return false; +} + } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/runconfiguration.h b/src/plugins/projectexplorer/runconfiguration.h index 85c770a5d36..629fcd2c614 100644 --- a/src/plugins/projectexplorer/runconfiguration.h +++ b/src/plugins/projectexplorer/runconfiguration.h @@ -197,6 +197,7 @@ public: protected: virtual QList availableCreators(Target *target) const; + virtual bool supportsBuildKey(Target *target, const QString &key) const; using RunConfigurationCreator = std::function; @@ -218,6 +219,7 @@ private: RunConfiguration *create(Target *target) const; friend class RunConfigurationCreationInfo; + friend class RunConfiguration; RunConfigurationCreator m_creator; Utils::Id m_runConfigurationId; QList m_supportedProjectTypes; @@ -231,9 +233,10 @@ public: explicit FixedRunConfigurationFactory(const QString &displayName, bool addDeviceName = false); - QList availableCreators(Target *parent) const override; - private: + QList availableCreators(Target *parent) const override; + bool supportsBuildKey(Target *target, const QString &key) const override; + const QString m_fixedBuildTarget; const bool m_decorateTargetName; };