Introduce TaskProgress

It's responsible for showing progress of the running task tree.
It's able to cancel the running task tree automatically after
pressing a small 'x' indicator on progress panel.
In this case TaskTree::stop() method is being called.

Change-Id: Ia1b3d88de74571e3e56f431b1a31755492ad4aa2
Reviewed-by: hjk <hjk@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
This commit is contained in:
Jarek Kobus
2022-11-10 16:57:17 +01:00
parent 4e4176a3d3
commit 5d4667e682
5 changed files with 118 additions and 2 deletions

View File

@@ -144,6 +144,7 @@ add_qtc_plugin(Core
progressmanager/progressbar.cpp progressmanager/progressbar.h progressmanager/progressbar.cpp progressmanager/progressbar.h
progressmanager/progressmanager.cpp progressmanager/progressmanager.h progressmanager/progressmanager_p.h progressmanager/progressmanager.cpp progressmanager/progressmanager.h progressmanager/progressmanager_p.h
progressmanager/progressview.cpp progressmanager/progressview.h progressmanager/progressview.cpp progressmanager/progressview.h
progressmanager/taskprogress.cpp progressmanager/taskprogress.h
rightpane.cpp rightpane.h rightpane.cpp rightpane.h
settingsdatabase.cpp settingsdatabase.h settingsdatabase.cpp settingsdatabase.h
sidebar.cpp sidebar.h sidebar.cpp sidebar.h

View File

@@ -243,6 +243,7 @@ Project {
"progressbar.cpp", "progressbar.h", "progressbar.cpp", "progressbar.h",
"progressmanager.cpp", "progressmanager.h", "progressmanager_p.h", "progressmanager.cpp", "progressmanager.h", "progressmanager_p.h",
"progressview.cpp", "progressview.h", "progressview.cpp", "progressview.h",
"taskprogress.cpp", "taskprogress.h",
] ]
} }

View File

@@ -71,8 +71,8 @@ void ProcessProgressPrivate::parseProgress(const QString &inputText)
\brief The ProcessProgress class is responsible for showing progress of the running process. \brief The ProcessProgress class is responsible for showing progress of the running process.
It's able to cancel the running process automatically after pressing a small 'x' indicator on It's possible to cancel the running process automatically after pressing a small 'x'
progress panel. In this case the QtcProcess::stop() method is being called. indicator on progress panel. In this case QtcProcess::stop() method is being called.
*/ */
ProcessProgress::ProcessProgress(QtcProcess *process) ProcessProgress::ProcessProgress(QtcProcess *process)

View File

@@ -0,0 +1,87 @@
// Copyright (C) 2022 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
#include "taskprogress.h"
#include "progressmanager.h"
#include <utils/qtcassert.h>
#include <utils/tasktree.h>
#include <QFutureWatcher>
using namespace Utils;
namespace Core {
class TaskProgressPrivate : public QObject
{
public:
explicit TaskProgressPrivate(TaskProgress *progress, TaskTree *taskTree);
~TaskProgressPrivate();
TaskTree *m_taskTree = nullptr;
QFutureWatcher<void> m_watcher;
QFutureInterface<void> m_futureInterface;
QString m_displayName;
};
TaskProgressPrivate::TaskProgressPrivate(TaskProgress *progress, TaskTree *taskTree)
: QObject(progress)
, m_taskTree(taskTree)
{
}
TaskProgressPrivate::~TaskProgressPrivate()
{
if (m_futureInterface.isRunning()) {
m_futureInterface.reportCanceled();
m_futureInterface.reportFinished();
// TODO: should we stop the process? Or just mark the process canceled?
// What happens to task in progress manager?
}
}
/*!
\class Core::TaskProgress
\brief The TaskProgress class is responsible for showing progress of the running task tree.
It's possible to cancel the running task tree automatically after pressing a small 'x'
indicator on progress panel. In this case TaskTree::stop() method is being called.
*/
TaskProgress::TaskProgress(TaskTree *taskTree)
: QObject(taskTree)
, d(new TaskProgressPrivate(this, taskTree))
{
connect(&d->m_watcher, &QFutureWatcher<void>::canceled, this, [this] {
d->m_taskTree->stop(); // TODO: should we have different cancel policies?
});
connect(d->m_taskTree, &TaskTree::started, this, [this] {
d->m_futureInterface = QFutureInterface<void>();
d->m_futureInterface.setProgressRange(0, d->m_taskTree->progressMaximum());
d->m_watcher.setFuture(d->m_futureInterface.future());
d->m_futureInterface.reportStarted();
const auto id = Id::fromString(d->m_displayName + ".action");
ProgressManager::addTask(d->m_futureInterface.future(), d->m_displayName, id);
});
connect(d->m_taskTree, &TaskTree::progressValueChanged, this, [this](int value) {
d->m_futureInterface.setProgressValue(value);
});
connect(d->m_taskTree, &TaskTree::done, this, [this] {
d->m_futureInterface.reportFinished();
});
connect(d->m_taskTree, &TaskTree::errorOccurred, this, [this] {
d->m_futureInterface.reportCanceled();
d->m_futureInterface.reportFinished();
});
}
void TaskProgress::setDisplayName(const QString &name)
{
d->m_displayName = name;
}
} // namespace Core

View File

@@ -0,0 +1,27 @@
// Copyright (C) 2022 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
#pragma once
#include <coreplugin/core_global.h>
#include <QObject>
namespace Utils { class TaskTree; }
namespace Core {
class TaskProgressPrivate;
class CORE_EXPORT TaskProgress : public QObject
{
public:
TaskProgress(Utils::TaskTree *taskTree); // Makes TaskProgress a child of task tree
void setDisplayName(const QString &name);
private:
TaskProgressPrivate *d;
};
} // namespace Core