summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorhjk <hjk@qt.io>2018-05-11 16:59:36 +0200
committerhjk <hjk@qt.io>2018-05-29 09:03:29 +0000
commit65be72d64dedfddbcb458740d76d72a3e6fa8ab9 (patch)
tree137c79518f9d4543ef199fd7c522a450685f9618 /src
parent3f83cf2447e701cc7b3ffd5cd7397ae287052f68 (diff)
downloadqt-creator-65be72d64dedfddbcb458740d76d72a3e6fa8ab9.tar.gz
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 <tobias.hunger@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/plugins/android/androidplugin.cpp11
-rw-r--r--src/plugins/nim/nimplugin.cpp3
-rw-r--r--src/plugins/nim/project/nimrunconfiguration.cpp1
-rw-r--r--src/plugins/projectexplorer/runconfiguration.cpp12
-rw-r--r--src/plugins/projectexplorer/runconfiguration.h32
5 files changed, 32 insertions, 27 deletions
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<Android::AndroidRunConfiguration>
("Qt4ProjectManager.AndroidRunConfiguration:");
addSupportedTargetDeviceType(Android::Constants::ANDROID_DEVICE_TYPE);
+ addRunWorkerFactory<AndroidRunSupport>(NORMAL_RUN_MODE);
+ addRunWorkerFactory<AndroidDebugSupport>(DEBUG_RUN_MODE);
+ addRunWorkerFactory<AndroidQmlToolingSupport>(QML_PROFILER_RUN_MODE);
+ addRunWorkerFactory<AndroidQmlToolingSupport>(QML_PREVIEW_RUN_MODE);
}
};
@@ -100,13 +104,6 @@ bool AndroidPlugin::initialize(const QStringList &arguments, QString *errorMessa
Q_UNUSED(arguments);
Q_UNUSED(errorMessage);
- RunControl::registerWorker<AndroidRunConfiguration, AndroidRunSupport>(NORMAL_RUN_MODE);
- RunControl::registerWorker<AndroidRunConfiguration, AndroidDebugSupport>(DEBUG_RUN_MODE);
- RunControl::registerWorker<AndroidRunConfiguration, AndroidQmlToolingSupport>(
- QML_PROFILER_RUN_MODE);
- RunControl::registerWorker<AndroidRunConfiguration, AndroidQmlToolingSupport>(
- 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<NimRunConfiguration, SimpleTargetRunner>
- (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<NimRunConfiguration>("Nim.NimRunConfiguration");
addSupportedProjectType(Constants::C_NIMPROJECT_ID);
+ addRunWorkerFactory<SimpleTargetRunner>(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<RunWorker *(RunControl *)> &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 *>(runConfig) != nullptr;
+ };
}
void addSupportedProjectType(Core::Id id);
void addSupportedTargetDeviceType(Core::Id id);
void setDecorateDisplayNames(bool on);
+ template<class Worker>
+ RunWorkerFactory *addRunWorkerFactory(Core::Id runMode)
+ {
+ return addRunWorkerFactoryHelper(runMode, [](RunControl *rc) { return new Worker(rc); });
+ }
+
private:
+ RunWorkerFactory *addRunWorkerFactoryHelper
+ (Core::Id runMode, const std::function<RunWorker *(RunControl *)> &creator);
+
RunConfigurationFactory(const RunConfigurationFactory &) = delete;
RunConfigurationFactory operator=(const RunConfigurationFactory &) = delete;
@@ -319,6 +332,8 @@ private:
QList<Core::Id> m_supportedProjectTypes;
QList<Core::Id> m_supportedTargetDeviceTypes;
bool m_decorateDisplayNames = false;
+ QList<RunWorkerFactory *> m_ownedRunWorkerFactories;
+ std::function<bool(RunConfiguration *)> m_ownTypeChecker;
};
class PROJECTEXPLORER_EXPORT FixedRunConfigurationFactory : public RunConfigurationFactory
@@ -421,14 +436,6 @@ public:
m_producer = [](RunControl *rc) { return new Worker(rc); };
}
- template <class RunConfig>
- void setSupportedRunConfiguration()
- {
- m_constraints.append([](RunConfiguration *runConfig) {
- return qobject_cast<RunConfig *>(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 <class Config, class Worker>
- static void registerWorker(Core::Id runMode, int priority = 0)
- {
- auto factory = new RunWorkerFactory;
- factory->registerRunWorker<Worker>();
- factory->addSupportedRunMode(runMode);
- factory->setSupportedRunConfiguration<Config>();
- factory->setPriority(priority);
- }
static WorkerCreator producer(RunConfiguration *runConfiguration, Core::Id runMode);