From 1da7f18fb7a48bf327edcda2edbb7287196e58b2 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Fri, 3 Nov 2023 23:07:26 +0100 Subject: [PATCH] TaskTree: Introduce List element The List element of GroupItem type is a helper for constructing Group content with an initializer lists. Since there is no easy way of mixing items and lists of items inside the initializer list, the List element encloses the list of children in a single GroupItem element making it possible to mix the lists of GroupItems with individual GroupItem elements on a single initializer list. This addresses the 25th point in the master task below. Task-number: QTCREATORBUG-28741 Change-Id: I5fa4b76677f5aa7dcf875b9e9a16d86a26d380a7 Reviewed-by: Reviewed-by: hjk --- src/libs/solutions/tasking/tasktree.cpp | 11 +++++++-- src/libs/solutions/tasking/tasktree.h | 10 ++++++++ tests/manual/tasking/demo/main.cpp | 33 ++++++++++--------------- 3 files changed, 32 insertions(+), 22 deletions(-) diff --git a/src/libs/solutions/tasking/tasktree.cpp b/src/libs/solutions/tasking/tasktree.cpp index 615fbe0eb4c..283586e5bf7 100644 --- a/src/libs/solutions/tasking/tasktree.cpp +++ b/src/libs/solutions/tasking/tasktree.cpp @@ -902,10 +902,17 @@ void TreeStorageBase::activateStorage(int id) const void GroupItem::addChildren(const QList &children) { - QTC_ASSERT(m_type == Type::Group, qWarning("Only Group may have children, skipping..."); - return); + QTC_ASSERT(m_type == Type::Group || m_type == Type::List, + qWarning("Only Group or List may have children, skipping..."); return); + if (m_type == Type::List) { + m_children.append(children); + return; + } for (const GroupItem &child : children) { switch (child.m_type) { + case Type::List: + addChildren(child.m_children); + break; case Type::Group: m_children.append(child); break; diff --git a/src/libs/solutions/tasking/tasktree.h b/src/libs/solutions/tasking/tasktree.h index deacc7c6167..82e242dbb12 100644 --- a/src/libs/solutions/tasking/tasktree.h +++ b/src/libs/solutions/tasking/tasktree.h @@ -188,6 +188,7 @@ public: protected: enum class Type { + List, Group, GroupData, Storage, @@ -195,6 +196,7 @@ protected: }; GroupItem() = default; + GroupItem(Type type) : m_type(type) { } GroupItem(const GroupData &data) : m_type(Type::GroupData) , m_groupData(data) {} @@ -220,6 +222,14 @@ private: TaskHandler m_taskHandler; }; +// TODO: Add tests. +class TASKING_EXPORT List final : public GroupItem +{ +public: + List(const QList &children) : GroupItem(Type::List) { addChildren(children); } + List(std::initializer_list children) : GroupItem(Type::List) { addChildren(children); } +}; + class TASKING_EXPORT Group final : public GroupItem { public: diff --git a/tests/manual/tasking/demo/main.cpp b/tests/manual/tasking/demo/main.cpp index 91a92805963..b1b1d70a6df 100644 --- a/tests/manual/tasking/demo/main.cpp +++ b/tests/manual/tasking/demo/main.cpp @@ -183,6 +183,15 @@ int main(int argc, char *argv[]) std::unique_ptr taskTree; + const auto createGroup = [](GroupWidget *widget) { + return List { + widget->executeMode(), + widget->workflowPolicy(), + onGroupSetup([widget] { widget->setState(State::Running); }), + onGroupDone([widget](DoneWith result) { widget->setState(resultToState(result)); }), + }; + }; + const auto createTask = [](TaskWidget *widget) { const milliseconds timeout{widget->busyTime() * 1000}; const auto setupTask = [widget, timeout](milliseconds &taskObject) { @@ -199,17 +208,9 @@ int main(int argc, char *argv[]) const auto recipe = [&] { const Group root { - rootGroup->executeMode(), - rootGroup->workflowPolicy(), - onGroupSetup([rootGroup] { rootGroup->setState(State::Running); }), - onGroupDone([rootGroup](DoneWith result) { rootGroup->setState(resultToState(result)); }), - + createGroup(rootGroup), Group { - groupTask_1->executeMode(), - groupTask_1->workflowPolicy(), - onGroupSetup([groupTask_1] { groupTask_1->setState(State::Running); }), - onGroupDone([groupTask_1](DoneWith result) { groupTask_1->setState(resultToState(result)); }), - + createGroup(groupTask_1), createTask(task_1_1), createTask(task_1_2), createTask(task_1_3) @@ -217,19 +218,11 @@ int main(int argc, char *argv[]) createTask(task_2), createTask(task_3), Group { - groupTask_4->executeMode(), - groupTask_4->workflowPolicy(), - onGroupSetup([groupTask_4] { groupTask_4->setState(State::Running); }), - onGroupDone([groupTask_4](DoneWith result) { groupTask_4->setState(resultToState(result)); }), - + createGroup(groupTask_4), createTask(task_4_1), createTask(task_4_2), Group { - groupTask_4_3->executeMode(), - groupTask_4_3->workflowPolicy(), - onGroupSetup([groupTask_4_3] { groupTask_4_3->setState(State::Running); }), - onGroupDone([groupTask_4_3](DoneWith result) { groupTask_4_3->setState(resultToState(result)); }), - + createGroup(groupTask_4_3), createTask(task_4_3_1), createTask(task_4_3_2), createTask(task_4_3_3),