forked from qt-creator/qt-creator
TaskTree: Keep just one done handler
Instead of having separate handlers for done and errorOccurred. This will enable setting just one common done handler with an additional "bool success" argument. Task-number: QTCREATORBUG-29834 Change-Id: I52d826dd89461ff93772a6fe7a85e432d1e84665 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Marcus Tillmanns <marcus.tillmanns@qt.io>
This commit is contained in:
@@ -1089,7 +1089,7 @@ public:
|
||||
// in order to unwind properly.
|
||||
SetupResult start();
|
||||
void stop();
|
||||
void invokeEndHandler(bool success);
|
||||
void invokeDoneHandler(bool success);
|
||||
bool isRunning() const { return m_task || m_container.isRunning(); }
|
||||
bool isTask() const { return bool(m_taskHandler.m_createHandler); }
|
||||
int taskCount() const { return isTask() ? 1 : m_container.m_constData.m_taskCount; }
|
||||
@@ -1451,7 +1451,7 @@ SetupResult TaskNode::start()
|
||||
const std::shared_ptr<SetupResult> unwindAction
|
||||
= std::make_shared<SetupResult>(SetupResult::Continue);
|
||||
QObject::connect(m_task.get(), &TaskInterface::done, taskTree(), [=](bool success) {
|
||||
invokeEndHandler(success);
|
||||
invokeDoneHandler(success);
|
||||
QObject::disconnect(m_task.get(), &TaskInterface::done, taskTree(), nullptr);
|
||||
m_task.release()->deleteLater();
|
||||
QTC_ASSERT(parentContainer() && parentContainer()->isRunning(), return);
|
||||
@@ -1479,16 +1479,14 @@ void TaskNode::stop()
|
||||
|
||||
// TODO: cancelHandler?
|
||||
// TODO: call TaskInterface::stop() ?
|
||||
invokeEndHandler(false);
|
||||
invokeDoneHandler(false);
|
||||
m_task.reset();
|
||||
}
|
||||
|
||||
void TaskNode::invokeEndHandler(bool success)
|
||||
void TaskNode::invokeDoneHandler(bool success)
|
||||
{
|
||||
if (success && m_taskHandler.m_doneHandler)
|
||||
invokeHandler(parentContainer(), m_taskHandler.m_doneHandler, *m_task.get());
|
||||
else if (!success && m_taskHandler.m_errorHandler)
|
||||
invokeHandler(parentContainer(), m_taskHandler.m_errorHandler, *m_task.get());
|
||||
if (m_taskHandler.m_doneHandler)
|
||||
invokeHandler(parentContainer(), m_taskHandler.m_doneHandler, *m_task.get(), success);
|
||||
m_container.m_constData.m_taskTreePrivate->advanceProgress(1);
|
||||
}
|
||||
|
||||
|
@@ -138,8 +138,8 @@ public:
|
||||
using TaskCreateHandler = std::function<TaskInterface *(void)>;
|
||||
// Called prior to task start, just after createHandler
|
||||
using TaskSetupHandler = std::function<SetupResult(TaskInterface &)>;
|
||||
// Called on task done / error
|
||||
using TaskEndHandler = std::function<void(const TaskInterface &)>;
|
||||
// Called on task done, just before delete later
|
||||
using TaskDoneHandler = std::function<void(const TaskInterface &, bool)>;
|
||||
// Called when group entered
|
||||
using GroupSetupHandler = std::function<SetupResult()>;
|
||||
// Called when group done / error
|
||||
@@ -148,8 +148,7 @@ public:
|
||||
struct TaskHandler {
|
||||
TaskCreateHandler m_createHandler;
|
||||
TaskSetupHandler m_setupHandler = {};
|
||||
TaskEndHandler m_doneHandler = {};
|
||||
TaskEndHandler m_errorHandler = {};
|
||||
TaskDoneHandler m_doneHandler = {};
|
||||
};
|
||||
|
||||
struct GroupHandler {
|
||||
@@ -331,7 +330,7 @@ public:
|
||||
template <typename SetupHandler>
|
||||
CustomTask(SetupHandler &&setup, const EndHandler &done = {}, const EndHandler &error = {})
|
||||
: GroupItem({&createAdapter, wrapSetup(std::forward<SetupHandler>(setup)),
|
||||
wrapEnd(done), wrapEnd(error)}) {}
|
||||
wrapEnds(done, error)}) {}
|
||||
|
||||
GroupItem withTimeout(std::chrono::milliseconds timeout,
|
||||
const GroupEndHandler &handler = {}) const {
|
||||
@@ -357,12 +356,14 @@ private:
|
||||
};
|
||||
};
|
||||
|
||||
static TaskEndHandler wrapEnd(const EndHandler &handler) {
|
||||
if (!handler)
|
||||
static TaskDoneHandler wrapEnds(const EndHandler &doneHandler, const EndHandler &errorHandler) {
|
||||
if (!doneHandler && !errorHandler)
|
||||
return {};
|
||||
return [handler](const TaskInterface &taskInterface) {
|
||||
return [doneHandler, errorHandler](const TaskInterface &taskInterface, bool success) {
|
||||
const Adapter &adapter = static_cast<const Adapter &>(taskInterface);
|
||||
handler(*adapter.task());
|
||||
const auto handler = success ? doneHandler : errorHandler;
|
||||
if (handler)
|
||||
handler(*adapter.task());
|
||||
};
|
||||
};
|
||||
};
|
||||
|
Reference in New Issue
Block a user