From 65be72d64dedfddbcb458740d76d72a3e6fa8ab9 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 11 May 2018 16:59:36 +0200 Subject: ProjectExplorer: Add RunConfigFactory::addRunWorkerFactory convienience There is a recurring special case that certain run controls depend on the presence of specific RunConfiguration (which in turn has it's own restriction on e.g. target or project types) but have no further restrictions. Make it easy to handle that case. Change-Id: I2e86f366591b02003f720dcc00b4c52bb2f34e00 Reviewed-by: Tobias Hunger --- src/plugins/android/androidplugin.cpp | 11 +++----- src/plugins/nim/nimplugin.cpp | 3 --- src/plugins/nim/project/nimrunconfiguration.cpp | 1 + src/plugins/projectexplorer/runconfiguration.cpp | 12 +++++++++ src/plugins/projectexplorer/runconfiguration.h | 32 +++++++++++------------- 5 files changed, 32 insertions(+), 27 deletions(-) (limited to 'src') diff --git a/src/plugins/android/androidplugin.cpp b/src/plugins/android/androidplugin.cpp index 3e5ace89e8..cc54d74586 100644 --- a/src/plugins/android/androidplugin.cpp +++ b/src/plugins/android/androidplugin.cpp @@ -70,6 +70,10 @@ public: registerRunConfiguration ("Qt4ProjectManager.AndroidRunConfiguration:"); addSupportedTargetDeviceType(Android::Constants::ANDROID_DEVICE_TYPE); + addRunWorkerFactory(NORMAL_RUN_MODE); + addRunWorkerFactory(DEBUG_RUN_MODE); + addRunWorkerFactory(QML_PROFILER_RUN_MODE); + addRunWorkerFactory(QML_PREVIEW_RUN_MODE); } }; @@ -100,13 +104,6 @@ bool AndroidPlugin::initialize(const QStringList &arguments, QString *errorMessa Q_UNUSED(arguments); Q_UNUSED(errorMessage); - RunControl::registerWorker(NORMAL_RUN_MODE); - RunControl::registerWorker(DEBUG_RUN_MODE); - RunControl::registerWorker( - QML_PROFILER_RUN_MODE); - RunControl::registerWorker( - QML_PREVIEW_RUN_MODE); - RunControl::registerWorker(QML_PREVIEW_RUN_MODE, [](RunControl *runControl) -> RunWorker* { const Runnable runnable = runControl->runConfiguration()->runnable(); return new AndroidQmlToolingSupport(runControl, runnable.executable, runnable.commandLineArguments); diff --git a/src/plugins/nim/nimplugin.cpp b/src/plugins/nim/nimplugin.cpp index 9421cdc1ac..248d5e99e0 100644 --- a/src/plugins/nim/nimplugin.cpp +++ b/src/plugins/nim/nimplugin.cpp @@ -76,9 +76,6 @@ bool NimPlugin::initialize(const QStringList &arguments, QString *errorMessage) ToolChainManager::registerLanguage(Constants::C_NIMLANGUAGE_ID, Constants::C_NIMLANGUAGE_NAME); - RunControl::registerWorker - (ProjectExplorer::Constants::NORMAL_RUN_MODE); - TextEditor::SnippetProvider::registerGroup(Constants::C_NIMSNIPPETSGROUP_ID, tr("Nim", "SnippetProvider"), &NimEditorFactory::decorateEditor); diff --git a/src/plugins/nim/project/nimrunconfiguration.cpp b/src/plugins/nim/project/nimrunconfiguration.cpp index 3d84c40949..ac3c41287f 100644 --- a/src/plugins/nim/project/nimrunconfiguration.cpp +++ b/src/plugins/nim/project/nimrunconfiguration.cpp @@ -101,6 +101,7 @@ NimRunConfigurationFactory::NimRunConfigurationFactory() : FixedRunConfiguration { registerRunConfiguration("Nim.NimRunConfiguration"); addSupportedProjectType(Constants::C_NIMPROJECT_ID); + addRunWorkerFactory(ProjectExplorer::Constants::NORMAL_RUN_MODE); } } // Nim diff --git a/src/plugins/projectexplorer/runconfiguration.cpp b/src/plugins/projectexplorer/runconfiguration.cpp index 17a7afbdbf..e5732da413 100644 --- a/src/plugins/projectexplorer/runconfiguration.cpp +++ b/src/plugins/projectexplorer/runconfiguration.cpp @@ -520,6 +520,8 @@ RunConfigurationFactory::RunConfigurationFactory() RunConfigurationFactory::~RunConfigurationFactory() { g_runConfigurationFactories.removeOne(this); + qDeleteAll(m_ownedRunWorkerFactories); + m_ownedRunWorkerFactories.clear(); } QString RunConfigurationFactory::decoratedTargetName(const QString targetName, Target *target) @@ -586,6 +588,16 @@ void RunConfigurationFactory::setDecorateDisplayNames(bool on) m_decorateDisplayNames = on; } +RunWorkerFactory *RunConfigurationFactory::addRunWorkerFactoryHelper + (Core::Id runMode, const std::function &creator) +{ + auto factory = new RunWorkerFactory; + factory->addConstraint(m_ownTypeChecker); + factory->addSupportedRunMode(runMode); + factory->setProducer(creator); + return factory; +} + void RunConfigurationFactory::addSupportedProjectType(Core::Id id) { m_supportedProjectTypes.append(id); diff --git a/src/plugins/projectexplorer/runconfiguration.h b/src/plugins/projectexplorer/runconfiguration.h index a7f77445cc..cb6f2b7e0b 100644 --- a/src/plugins/projectexplorer/runconfiguration.h +++ b/src/plugins/projectexplorer/runconfiguration.h @@ -59,6 +59,7 @@ class RunConfiguration; class RunConfigurationCreationInfo; class RunConfigWidget; class RunControl; +class RunWorkerFactory; class Target; namespace Internal { @@ -301,13 +302,25 @@ protected: return new RunConfig(t, runConfigBaseId); }; m_runConfigBaseId = runConfigBaseId; + m_ownTypeChecker = [](RunConfiguration *runConfig) { + return qobject_cast(runConfig) != nullptr; + }; } void addSupportedProjectType(Core::Id id); void addSupportedTargetDeviceType(Core::Id id); void setDecorateDisplayNames(bool on); + template + RunWorkerFactory *addRunWorkerFactory(Core::Id runMode) + { + return addRunWorkerFactoryHelper(runMode, [](RunControl *rc) { return new Worker(rc); }); + } + private: + RunWorkerFactory *addRunWorkerFactoryHelper + (Core::Id runMode, const std::function &creator); + RunConfigurationFactory(const RunConfigurationFactory &) = delete; RunConfigurationFactory operator=(const RunConfigurationFactory &) = delete; @@ -319,6 +332,8 @@ private: QList m_supportedProjectTypes; QList m_supportedTargetDeviceTypes; bool m_decorateDisplayNames = false; + QList m_ownedRunWorkerFactories; + std::function m_ownTypeChecker; }; class PROJECTEXPLORER_EXPORT FixedRunConfigurationFactory : public RunConfigurationFactory @@ -421,14 +436,6 @@ public: m_producer = [](RunControl *rc) { return new Worker(rc); }; } - template - void setSupportedRunConfiguration() - { - m_constraints.append([](RunConfiguration *runConfig) { - return qobject_cast(runConfig) != nullptr; - }); - } - bool canRun(RunConfiguration *runConfiguration, Core::Id runMode) const; void setPriority(int priority); @@ -536,15 +543,6 @@ public: factory->addConstraint(constraint); factory->setPriority(priority); } - template - static void registerWorker(Core::Id runMode, int priority = 0) - { - auto factory = new RunWorkerFactory; - factory->registerRunWorker(); - factory->addSupportedRunMode(runMode); - factory->setSupportedRunConfiguration(); - factory->setPriority(priority); - } static WorkerCreator producer(RunConfiguration *runConfiguration, Core::Id runMode); -- cgit v1.2.1