forked from qt-creator/qt-creator
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:
@@ -144,6 +144,7 @@ add_qtc_plugin(Core
|
||||
progressmanager/progressbar.cpp progressmanager/progressbar.h
|
||||
progressmanager/progressmanager.cpp progressmanager/progressmanager.h progressmanager/progressmanager_p.h
|
||||
progressmanager/progressview.cpp progressmanager/progressview.h
|
||||
progressmanager/taskprogress.cpp progressmanager/taskprogress.h
|
||||
rightpane.cpp rightpane.h
|
||||
settingsdatabase.cpp settingsdatabase.h
|
||||
sidebar.cpp sidebar.h
|
||||
|
@@ -243,6 +243,7 @@ Project {
|
||||
"progressbar.cpp", "progressbar.h",
|
||||
"progressmanager.cpp", "progressmanager.h", "progressmanager_p.h",
|
||||
"progressview.cpp", "progressview.h",
|
||||
"taskprogress.cpp", "taskprogress.h",
|
||||
]
|
||||
}
|
||||
|
||||
|
@@ -71,8 +71,8 @@ void ProcessProgressPrivate::parseProgress(const QString &inputText)
|
||||
|
||||
\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
|
||||
progress panel. In this case the QtcProcess::stop() method is being called.
|
||||
It's possible to cancel the running process automatically after pressing a small 'x'
|
||||
indicator on progress panel. In this case QtcProcess::stop() method is being called.
|
||||
*/
|
||||
|
||||
ProcessProgress::ProcessProgress(QtcProcess *process)
|
||||
|
87
src/plugins/coreplugin/progressmanager/taskprogress.cpp
Normal file
87
src/plugins/coreplugin/progressmanager/taskprogress.cpp
Normal 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
|
27
src/plugins/coreplugin/progressmanager/taskprogress.h
Normal file
27
src/plugins/coreplugin/progressmanager/taskprogress.h
Normal 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
|
Reference in New Issue
Block a user