diff --git a/src/plugins/projectexplorer/runconfiguration.cpp b/src/plugins/projectexplorer/runconfiguration.cpp index 90a32a7bbd6..9f1b26b3f3e 100644 --- a/src/plugins/projectexplorer/runconfiguration.cpp +++ b/src/plugins/projectexplorer/runconfiguration.cpp @@ -539,30 +539,28 @@ bool RunConfigurationFactory::canCreateHelper(Target *, const QString &) const return true; } -RunConfiguration *RunConfigurationFactory::create(Target *parent, - const RunConfigurationCreationInfo &info) const +RunConfiguration *RunConfigurationCreationInfo::create(Target *target) const { - if (!canHandle(parent)) - return nullptr; - if (info.id != m_runConfigBaseId) - return nullptr; - if (!canCreateHelper(parent, info.extra)) + QTC_ASSERT(factory->canHandle(target), return nullptr); + QTC_ASSERT(id == factory->runConfigurationBaseId(), return nullptr); + + if (!factory->canCreateHelper(target, extra)) return nullptr; - QTC_ASSERT(m_creator, return nullptr); - RunConfiguration *rc = m_creator(parent); + QTC_ASSERT(factory->m_creator, return nullptr); + RunConfiguration *rc = factory->m_creator(target); if (!rc) return nullptr; // "FIX" ids by mangling in the extra data (build system target etc) // for compatibility for the current format used in settings. - if (!info.extra.isEmpty()) { + if (!extra.isEmpty()) { QVariantMap data = rc->toMap(); - data[ProjectConfiguration::settingsIdKey()] = info.id.withSuffix(info.extra).toString(); + data[ProjectConfiguration::settingsIdKey()] = id.withSuffix(extra).toString(); rc->fromMap(data); } - rc->doAdditionalSetup(info); + rc->doAdditionalSetup(*this); return rc; } @@ -595,6 +593,16 @@ const QList RunConfigurationFactory::allFactories() return g_runConfigurationFactories; } +const QList RunConfigurationFactory::creatorsForTarget(Target *parent) +{ + QList items; + for (RunConfigurationFactory *factory : g_runConfigurationFactories) { + if (factory->canHandle(parent)) + items.append(factory->availableCreators(parent)); + } + return items; +} + FixedRunConfigurationFactory::FixedRunConfigurationFactory(const QString &displayName, bool addDeviceName) : m_fixedBuildTarget(displayName), diff --git a/src/plugins/projectexplorer/runconfiguration.h b/src/plugins/projectexplorer/runconfiguration.h index c6d050928c6..a6576aaf96e 100644 --- a/src/plugins/projectexplorer/runconfiguration.h +++ b/src/plugins/projectexplorer/runconfiguration.h @@ -274,7 +274,7 @@ protected: private: static void addAspectFactory(const AspectFactory &aspectFactory); - friend class RunConfigurationFactory; + friend class RunConfigurationCreationInfo; QList m_aspects; }; @@ -296,6 +296,8 @@ public: useTerminal(useTerminal) {} + RunConfiguration *create(Target *target) const; + const RunConfigurationFactory *factory = nullptr; Core::Id id; QString extra; @@ -314,21 +316,19 @@ public: static const QList allRunConfigurationFactories(); - virtual QList availableCreators(Target *parent) const; - virtual bool canHandle(Target *target) const; - RunConfiguration *create(Target *parent, const RunConfigurationCreationInfo &info) const; - static RunConfiguration *restore(Target *parent, const QVariantMap &map); static RunConfiguration *clone(Target *parent, RunConfiguration *source); static const QList allFactories(); + static const QList creatorsForTarget(Target *parent); Core::Id runConfigurationBaseId() const { return m_runConfigBaseId; } static QString decoratedTargetName(const QString targetName, Target *kit); protected: + virtual QList availableCreators(Target *parent) const; virtual bool canCreateHelper(Target *parent, const QString &buildTarget) const; using RunConfigurationCreator = std::function; @@ -349,6 +349,7 @@ protected: RunConfigurationCreationInfo convert(const QString &displayName, const QString &targetName = QString()) const; private: + friend class RunConfigurationCreationInfo; RunConfigurationCreator m_creator; Core::Id m_runConfigBaseId; QList m_supportedProjectTypes; diff --git a/src/plugins/projectexplorer/runsettingspropertiespage.cpp b/src/plugins/projectexplorer/runsettingspropertiespage.cpp index 98d54cbb1b8..c4d658b0554 100644 --- a/src/plugins/projectexplorer/runsettingspropertiespage.cpp +++ b/src/plugins/projectexplorer/runsettingspropertiespage.cpp @@ -238,23 +238,19 @@ void RunSettingsWidget::aboutToShowAddMenu() this, &RunSettingsWidget::cloneRunConfiguration); } QList menuActions; - for (RunConfigurationFactory *factory : RunConfigurationFactory::allRunConfigurationFactories()) { - if (!factory->canHandle(m_target)) - continue; - const QList items = factory->availableCreators(m_target); - for (const RunConfigurationCreationInfo &item : items) { - auto action = new QAction(item.displayName, m_addRunMenu); - connect(action, &QAction::triggered, [item, this] { - RunConfiguration *newRC = item.factory->create(m_target, item); - if (!newRC) - return; - QTC_CHECK(newRC->id() == item.id); - m_target->addRunConfiguration(newRC); - m_target->setActiveRunConfiguration(newRC); - m_removeRunToolButton->setEnabled(m_target->runConfigurations().size() > 1); - }); - menuActions.append(action); - } + for (const RunConfigurationCreationInfo &item : + RunConfigurationFactory::creatorsForTarget(m_target)) { + auto action = new QAction(item.displayName, m_addRunMenu); + connect(action, &QAction::triggered, [item, this] { + RunConfiguration *newRC = item.create(m_target); + if (!newRC) + return; + QTC_CHECK(newRC->id() == item.id); + m_target->addRunConfiguration(newRC); + m_target->setActiveRunConfiguration(newRC); + m_removeRunToolButton->setEnabled(m_target->runConfigurations().size() > 1); + }); + menuActions.append(action); } Utils::sort(menuActions, &QAction::text); diff --git a/src/plugins/projectexplorer/target.cpp b/src/plugins/projectexplorer/target.cpp index fabf653de07..77c02a75e9b 100644 --- a/src/plugins/projectexplorer/target.cpp +++ b/src/plugins/projectexplorer/target.cpp @@ -536,22 +536,11 @@ void Target::updateDefaultDeployConfigurations() void Target::updateDefaultRunConfigurations() { - // find all RC ids that can get created: - QList allAvailableFactories; - QList autoCreateFactories; + // Manual and Auto + const QList creators + = RunConfigurationFactory::creatorsForTarget(this); - for (RunConfigurationFactory *rcFactory : RunConfigurationFactory::allFactories()) { - if (rcFactory->canHandle(this)) { - const QList creators = rcFactory->availableCreators(this); - for (const RunConfigurationCreationInfo &creator : creators) { - allAvailableFactories.append(creator); // Manual and Auto - if (creator.creationMode == RunConfigurationCreationInfo::AlwaysCreate) - autoCreateFactories.append(creator); // Auto only. - } - } - } - - if (allAvailableFactories.isEmpty()) { + if (creators.isEmpty()) { qWarning("No run configuration factory found for target id '%s'.", qPrintable(id().toString())); return; } @@ -573,7 +562,7 @@ void Target::updateDefaultRunConfigurations() QList existing; foreach (RunConfiguration *rc, existingConfigured) { bool present = false; - for (const RunConfigurationCreationInfo &item : allAvailableFactories) { + for (const RunConfigurationCreationInfo &item : creators) { if (item.id == rc->id() && item.extra == rc->extraId()) { existing.append(item); present = true; @@ -584,8 +573,10 @@ void Target::updateDefaultRunConfigurations() } configuredCount -= toRemove.count(); - // Create new RCs and put them into newConfigured/newUnconfigured - foreach (const RunConfigurationCreationInfo &item, autoCreateFactories) { + // Create new "automatic" RCs and put them into newConfigured/newUnconfigured + foreach (const RunConfigurationCreationInfo &item, creators) { + if (item.creationMode == RunConfigurationCreationInfo::ManualCreationOnly) + continue; bool exists = false; for (const RunConfigurationCreationInfo &ex : existing) { if (ex.id == item.id && ex.extra == item.extra) @@ -594,7 +585,7 @@ void Target::updateDefaultRunConfigurations() if (exists) continue; - RunConfiguration *rc = item.factory->create(this, item); + RunConfiguration *rc = item.create(this); if (!rc) continue; QTC_CHECK(rc->id() == item.id);