aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/utils/tasktree.h
diff options
context:
space:
mode:
authorJarek Kobus <jaroslaw.kobus@qt.io>2022-11-04 14:08:32 +0100
committerJarek Kobus <jaroslaw.kobus@qt.io>2022-11-17 15:07:22 +0000
commit234b3d1e6fb243766a70589139bc481661297ea3 (patch)
tree33d68e48b6e3a29d42cefca21b70afe89f265060 /src/libs/utils/tasktree.h
parent9e8d208cadb004abd7a71b6362ac72e7517bff5a (diff)
TaskTree: Add DynamicSetup handler for groups
DynamicSetup enables finishing group (with Done or Error) immediately before the group was even started. The handler is invoked dynamically, just before starting the group. The handler may also allow for running only selected children and omitting others, so it may serve as dynamic condition or dynamic multiplexer. This can be achieved by modifying QSet<int> childrenToRun field inside returned GroupConfig and setting the policy to ContinueSelected. Change-Id: I15bddbb866a89ae9f783c59cc4bca89dd6a81c75 Reviewed-by: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: hjk <hjk@qt.io>
Diffstat (limited to 'src/libs/utils/tasktree.h')
-rw-r--r--src/libs/utils/tasktree.h40
1 files changed, 34 insertions, 6 deletions
diff --git a/src/libs/utils/tasktree.h b/src/libs/utils/tasktree.h
index 5ead17ec2da..20bcce0725a 100644
--- a/src/libs/utils/tasktree.h
+++ b/src/libs/utils/tasktree.h
@@ -6,6 +6,7 @@
#include "utils_global.h"
#include <QObject>
+#include <QSet>
namespace Utils {
namespace Tasking {
@@ -22,6 +23,21 @@ signals:
void done(bool success);
};
+enum class GroupAction
+{
+ ContinueAll,
+ ContinueSelected,
+ StopWithDone,
+ StopWithError
+};
+
+class GroupConfig
+{
+public:
+ GroupAction action = GroupAction::ContinueAll;
+ QSet<int> childrenToRun = {};
+};
+
class QTCREATOR_UTILS_EXPORT TaskItem
{
public:
@@ -31,8 +47,12 @@ public:
using TaskSetupHandler = std::function<void(TaskInterface &)>;
// Called on task done / error
using TaskEndHandler = std::function<void(const TaskInterface &)>;
- // Called when sub tree entered / after sub three ended with success or failure
+ // Called when group entered / after group ended with success or failure
using GroupSimpleHandler = std::function<void()>;
+ // Called when group entered
+ using GroupSetupHandler = std::function<GroupConfig()>;
+ // Called after group ended with success or failure, passed set of successful children
+// using GroupEndHandler = std::function<void(const QSet<int> &)>;
struct TaskHandler {
TaskCreateHandler m_createHandler;
@@ -42,9 +62,10 @@ public:
};
struct GroupHandler {
- GroupSimpleHandler m_simpleSetupHandler;
- GroupSimpleHandler m_simpleDoneHandler;
- GroupSimpleHandler m_simpleErrorHandler;
+ GroupSimpleHandler m_setupHandler;
+ GroupSimpleHandler m_doneHandler = {};
+ GroupSimpleHandler m_errorHandler = {};
+ GroupSetupHandler m_dynamicSetupHandler = {};
};
enum class ExecuteMode {
@@ -136,13 +157,13 @@ public:
class QTCREATOR_UTILS_EXPORT OnGroupSetup : public TaskItem
{
public:
- OnGroupSetup(const GroupSimpleHandler &handler) : TaskItem({{handler}, {}, {}}) {}
+ OnGroupSetup(const GroupSimpleHandler &handler) : TaskItem({handler}) {}
};
class QTCREATOR_UTILS_EXPORT OnGroupDone : public TaskItem
{
public:
- OnGroupDone(const GroupSimpleHandler &handler) : TaskItem({{}, handler, {}}) {}
+ OnGroupDone(const GroupSimpleHandler &handler) : TaskItem({{}, handler}) {}
};
class QTCREATOR_UTILS_EXPORT OnGroupError : public TaskItem
@@ -151,6 +172,13 @@ public:
OnGroupError(const GroupSimpleHandler &handler) : TaskItem({{}, {}, handler}) {}
};
+class QTCREATOR_UTILS_EXPORT DynamicSetup : public TaskItem
+{
+public:
+ DynamicSetup(const GroupSetupHandler &handler) : TaskItem({{}, {}, {}, handler}) {}
+};
+
+
QTCREATOR_UTILS_EXPORT extern ExecuteInSequence sequential;
QTCREATOR_UTILS_EXPORT extern ExecuteInParallel parallel;
QTCREATOR_UTILS_EXPORT extern WorkflowPolicy stopOnError;