diff options
author | hjk <hjk@qt.io> | 2018-05-11 13:57:54 +0200 |
---|---|---|
committer | hjk <hjk@qt.io> | 2018-05-17 07:08:12 +0000 |
commit | a5d987bb8a24fa45df6817f06007e160406a7884 (patch) | |
tree | 683fd9413b2c0f143de6f73611c3d2d4edcfa852 /src | |
parent | 8580e32e88402cb9c243b1956f159c730c9520f8 (diff) |
ProjectExplorer: Prepare RunWorkers for more flexible setups
A RunWorker can in theory (and will in practice) support several
run modes. Also, it has turned out to be beneficial to specify
restrictions on a fine grained level, so re-use the idea from
the RunConfigurationFactory etc. constraints setup here.
Creation of RunWorkerFactories can be made protected at some time.
Change-Id: I9e2a84abfd7377c5bf0bbe84e0c7940b1317dc10
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/projectexplorer/runconfiguration.cpp | 40 | ||||
-rw-r--r-- | src/plugins/projectexplorer/runconfiguration.h | 49 |
2 files changed, 71 insertions, 18 deletions
diff --git a/src/plugins/projectexplorer/runconfiguration.cpp b/src/plugins/projectexplorer/runconfiguration.cpp index 292940f20e..3665699913 100644 --- a/src/plugins/projectexplorer/runconfiguration.cpp +++ b/src/plugins/projectexplorer/runconfiguration.cpp @@ -685,8 +685,7 @@ FixedRunConfigurationFactory::availableCreators(Target *parent) const static QList<RunWorkerFactory *> g_runWorkerFactories; -RunWorkerFactory::RunWorkerFactory(Core::Id mode, Constraint constr, const WorkerCreator &prod, int prio) - : m_runMode(mode), m_constraint(constr), m_producer(prod), m_priority(prio) +RunWorkerFactory::RunWorkerFactory() { g_runWorkerFactories.append(this); } @@ -698,11 +697,40 @@ RunWorkerFactory::~RunWorkerFactory() bool RunWorkerFactory::canRun(RunConfiguration *runConfiguration, Core::Id runMode) const { - if (runMode != this->m_runMode) + if (!m_supportedRunModes.contains(runMode)) return false; - if (!m_constraint) - return true; - return m_constraint(runConfiguration); + + for (const Constraint &constraint : m_constraints) { + if (!constraint(runConfiguration)) + return false; + } + + return true; +} + +void RunWorkerFactory::setPriority(int priority) +{ + m_priority = priority; +} + +void RunWorkerFactory::setProducer(const WorkerCreator &producer) +{ + m_producer = producer; +} + +void RunWorkerFactory::addConstraint(const Constraint &constraint) +{ + // Default constructed Constraints are not worth keeping. + // FIXME: Make it a QTC_ASSERT once there is no code path + // using this "feature" anymore. + if (!constraint) + return; + m_constraints.append(constraint); +} + +void RunWorkerFactory::addSupportedRunMode(Core::Id runMode) +{ + m_supportedRunModes.append(runMode); } void RunWorkerFactory::destroyRemainingRunWorkerFactories() diff --git a/src/plugins/projectexplorer/runconfiguration.h b/src/plugins/projectexplorer/runconfiguration.h index 81eba173b3..c7cc2f070f 100644 --- a/src/plugins/projectexplorer/runconfiguration.h +++ b/src/plugins/projectexplorer/runconfiguration.h @@ -453,12 +453,29 @@ public: using WorkerCreator = std::function<RunWorker *(RunControl *)>; using Constraint = std::function<bool(RunConfiguration *)>; - RunWorkerFactory(Core::Id mode, Constraint constr, const WorkerCreator &prod, - int prio = 0); - + RunWorkerFactory(); virtual ~RunWorkerFactory(); - bool canRun(RunConfiguration *runConfiguration, Core::Id m_runMode) const; + template <class Worker> + void registerRunWorker() + { + 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); + void setProducer(const WorkerCreator &producer); + void addConstraint(const Constraint &constraint); + void addSupportedRunMode(Core::Id runMode); int priority() const { return m_priority; } WorkerCreator producer() const { return m_producer; } @@ -469,8 +486,8 @@ private: friend class ProjectExplorerPlugin; static void destroyRemainingRunWorkerFactories(); - Core::Id m_runMode; - Constraint m_constraint; + QList<Core::Id> m_supportedRunModes; + QList<Constraint> m_constraints; WorkerCreator m_producer; int m_priority = 0; }; @@ -546,20 +563,28 @@ public: static void registerWorker(Core::Id runMode, const WorkerCreator &producer, const Constraint &constraint = {}) { - (void) new RunWorkerFactory(runMode, constraint, producer); + auto factory = new RunWorkerFactory; + factory->setProducer(producer); + factory->addSupportedRunMode(runMode); + factory->addConstraint(constraint); } template <class Worker> static void registerWorker(Core::Id runMode, const Constraint &constraint, int priority = 0) { - auto producer = [](RunControl *rc) { return new Worker(rc); }; - (void) new RunWorkerFactory(runMode, constraint, producer, priority); + auto factory = new RunWorkerFactory; + factory->registerRunWorker<Worker>(); + factory->addSupportedRunMode(runMode); + factory->addConstraint(constraint); + factory->setPriority(priority); } template <class Config, class Worker> static void registerWorker(Core::Id runMode, int priority = 0) { - auto constraint = [](RunConfiguration *runConfig) { return qobject_cast<Config *>(runConfig) != nullptr; }; - auto producer = [](RunControl *rc) { return new Worker(rc); }; - (void) new RunWorkerFactory(runMode, constraint, producer, priority); + auto factory = new RunWorkerFactory; + factory->registerRunWorker<Worker>(); + factory->addSupportedRunMode(runMode); + factory->setSupportedRunConfiguration<Config>(); + factory->setPriority(priority); } static WorkerCreator producer(RunConfiguration *runConfiguration, Core::Id runMode); |