diff options
Diffstat (limited to 'src/plugins/projectexplorer/runconfiguration.cpp')
-rw-r--r-- | src/plugins/projectexplorer/runconfiguration.cpp | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/src/plugins/projectexplorer/runconfiguration.cpp b/src/plugins/projectexplorer/runconfiguration.cpp index 25cea48b0f..d496f35b53 100644 --- a/src/plugins/projectexplorer/runconfiguration.cpp +++ b/src/plugins/projectexplorer/runconfiguration.cpp @@ -479,6 +479,35 @@ IRunControlFactory::IRunControlFactory(QObject *parent) { } +using WorkerFactories = std::vector<RunControl::WorkerFactory>; + +static WorkerFactories &theWorkerFactories() +{ + static WorkerFactories factories; + return factories; +} + +bool IRunControlFactory::canRun(RunConfiguration *runConfiguration, Core::Id runMode) const +{ + for (const RunControl::WorkerFactory &factory : theWorkerFactories()) { + if (factory.runMode == runMode && factory.constraint(runConfiguration)) + return true; + }; + return false; +} + +RunControl *IRunControlFactory::create(RunConfiguration *runConfiguration, Core::Id runMode, QString *) +{ + for (const RunControl::WorkerFactory &factory : theWorkerFactories()) { + if (factory.runMode == runMode && factory.constraint(runConfiguration)) { + auto runControl = new RunControl(runConfiguration, runMode); + factory.producer(runControl); + return runControl; + } + }; + return nullptr; +} + /*! Returns an IRunConfigurationAspect to carry options for RunControls this factory can create. @@ -628,6 +657,7 @@ public: QPointer<Project> project; // Not owned. Utils::OutputFormatter *outputFormatter = nullptr; std::function<bool(bool*)> promptToStop; + std::vector<RunControl::WorkerFactory> m_factories; // A handle to the actual application process. Utils::ProcessHandle applicationProcessHandle; @@ -724,7 +754,7 @@ RunWorker *RunControl::createWorker(Core::Id id) { auto keys = theWorkerCreators().keys(); Q_UNUSED(keys); - RunWorkerCreator creator = theWorkerCreators().value(id); + Producer creator = theWorkerCreators().value(id); if (creator) return creator(this); creator = device()->workerCreator(id); @@ -733,6 +763,20 @@ RunWorker *RunControl::createWorker(Core::Id id) return nullptr; } +RunControl::Producer RunControl::producer(RunConfiguration *runConfiguration, Core::Id runMode) +{ + for (const auto &factory : theWorkerFactories()) { + if (factory.runMode == runMode && factory.constraint(runConfiguration)) + return factory.producer; + } + return {}; +} + +void RunControl::addWorkerFactory(const RunControl::WorkerFactory &workerFactory) +{ + theWorkerFactories().push_back(workerFactory); +} + void RunControlPrivate::initiateStart() { checkState(RunControlState::Initialized); |