aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorhjk <hjk@qt.io>2018-05-11 13:57:54 +0200
committerhjk <hjk@qt.io>2018-05-17 07:08:12 +0000
commita5d987bb8a24fa45df6817f06007e160406a7884 (patch)
tree683fd9413b2c0f143de6f73611c3d2d4edcfa852 /src
parent8580e32e88402cb9c243b1956f159c730c9520f8 (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.cpp40
-rw-r--r--src/plugins/projectexplorer/runconfiguration.h49
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);