forked from qt-creator/qt-creator
Add some documentation for how to use the ProgressManager.
This commit is contained in:
@@ -164,6 +164,12 @@
|
|||||||
\o For a text typed in by the user you provide a list of things to show in the popup. When the user selects an entry you are requested to do whatever you want.
|
\o For a text typed in by the user you provide a list of things to show in the popup. When the user selects an entry you are requested to do whatever you want.
|
||||||
\o \l{Locator::ILocatorFilter}, \l{Locator::FilterEntry}, \l{Locator::BaseFileFilter}
|
\o \l{Locator::ILocatorFilter}, \l{Locator::FilterEntry}, \l{Locator::BaseFileFilter}
|
||||||
|
|
||||||
|
\row
|
||||||
|
\o Show a progress indicator for a concurrently running task.
|
||||||
|
\o You can show a progress indicator for your tasks in the left hand tool bar,
|
||||||
|
and also in the application icon (on platforms that support it).
|
||||||
|
\o \l{Core::ProgressManager}, \l{Core::FutureProgress}
|
||||||
|
|
||||||
\row
|
\row
|
||||||
\o
|
\o
|
||||||
\o
|
\o
|
||||||
|
@@ -39,6 +39,199 @@
|
|||||||
using namespace Core;
|
using namespace Core;
|
||||||
using namespace Core::Internal;
|
using namespace Core::Internal;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\mainclass
|
||||||
|
\class Core::ProgressManager
|
||||||
|
\brief The ProgressManager class is used to show a user interface
|
||||||
|
for running tasks in Qt Creator.
|
||||||
|
|
||||||
|
It tracks the progress of a task that it is told
|
||||||
|
about, and shows a progress indicator in the left hand tool bar
|
||||||
|
of Qt Creator's main window to the user.
|
||||||
|
The progress indicator also allows the user to cancel the task.
|
||||||
|
|
||||||
|
You get the single instance of this class via the
|
||||||
|
Core::ICore::progressManager() method.
|
||||||
|
|
||||||
|
\section1 Registering a task
|
||||||
|
The ProgressManager API uses QtConcurrent as the basis for defining
|
||||||
|
tasks. A task consists of the following properties:
|
||||||
|
|
||||||
|
\table
|
||||||
|
\header
|
||||||
|
\o Property
|
||||||
|
\o Type
|
||||||
|
\o Description
|
||||||
|
\row
|
||||||
|
\o Task abstraction
|
||||||
|
\o \c QFuture<void>
|
||||||
|
\o A \c QFuture object that represents the task which is
|
||||||
|
responsible for reporting the state of the task. See below
|
||||||
|
for coding patterns how to create this object for your
|
||||||
|
specific task.
|
||||||
|
\row
|
||||||
|
\o Title
|
||||||
|
\o \c QString
|
||||||
|
\o A very short title describing your task. This is shown
|
||||||
|
as a title over the progress bar.
|
||||||
|
\row
|
||||||
|
\o Type
|
||||||
|
\o \c QString
|
||||||
|
\o A string identifier that is used to group different tasks that
|
||||||
|
belong together.
|
||||||
|
For example, all the search operations use the same type
|
||||||
|
identifier.
|
||||||
|
\row
|
||||||
|
\o Flags
|
||||||
|
\o \l ProgressManager::ProgressFlags
|
||||||
|
\o Additional flags that specify how the progress bar should
|
||||||
|
be presented to the user.
|
||||||
|
\endtable
|
||||||
|
|
||||||
|
To register a task you create your \c QFuture<void> object, and call
|
||||||
|
addTask(). This method returns a
|
||||||
|
\l{Core::FutureProgress}{FutureProgress}
|
||||||
|
object that you can use to further customize the progress bar's appearance.
|
||||||
|
See the \l{Core::FutureProgress}{FutureProgress} documentation for
|
||||||
|
details.
|
||||||
|
|
||||||
|
In the following you will learn about two common patterns how to
|
||||||
|
create the \c QFuture<void> object for your task.
|
||||||
|
|
||||||
|
\section2 Create a threaded task with QtConcurrent
|
||||||
|
The first option is to directly use QtConcurrent to actually
|
||||||
|
start a task concurrently in a different thread.
|
||||||
|
QtConcurrent has several different methods to run e.g.
|
||||||
|
a class method in a different thread. Qt Creator itself
|
||||||
|
adds a few more in \c{src/libs/qtconcurrent/runextensions.h}.
|
||||||
|
The QtConcurrent methods to run a concurrent task return a
|
||||||
|
\c QFuture object. This is what you want to give the
|
||||||
|
ProgressManager in the addTask() method.
|
||||||
|
|
||||||
|
Have a look at e.g Locator::ILocatorFilter. Locator filters implement
|
||||||
|
a method \c refresh which takes a \c QFutureInterface object
|
||||||
|
as a parameter. These methods look something like:
|
||||||
|
\code
|
||||||
|
void Filter::refresh(QFutureInterface<void> &future) {
|
||||||
|
future.setProgressRange(0, MAX);
|
||||||
|
...
|
||||||
|
while (!future.isCanceled()) {
|
||||||
|
// Do a part of the long stuff
|
||||||
|
...
|
||||||
|
future.setProgressValue(currentProgress);
|
||||||
|
...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\endcode
|
||||||
|
|
||||||
|
The actual refresh, which calls all the filters' refresh methods
|
||||||
|
in a different thread, looks like this:
|
||||||
|
\code
|
||||||
|
QFuture<void> task = QtConcurrent::run(&ILocatorFilter::refresh, filters);
|
||||||
|
Core::FutureProgress *progress = Core::ICore::instance()
|
||||||
|
->progressManager()->addTask(task, tr("Indexing"),
|
||||||
|
Locator::Constants::TASK_INDEX);
|
||||||
|
\endcode
|
||||||
|
First, we tell QtConcurrent to start a thread which calls all the filters'
|
||||||
|
refresh method. After that we register the returned QFuture object
|
||||||
|
with the ProgressManager.
|
||||||
|
|
||||||
|
\section2 Manually create QtConcurrent objects for your thread
|
||||||
|
If your task has its own means to create and run a thread,
|
||||||
|
you need to create the necessary objects yourselves, and
|
||||||
|
report the start/stop state.
|
||||||
|
|
||||||
|
\code
|
||||||
|
// We are already running in a different thread here
|
||||||
|
QFutureInterface<void> *progressObject = new QFutureInterface<void>;
|
||||||
|
progressObject->setProgressRange(0, MAX);
|
||||||
|
Core::ICore::instance()->progressManager()->addTask(
|
||||||
|
progressObject->future(),
|
||||||
|
tr("DoIt"), MYTASKTYPE);
|
||||||
|
progressObject->reportStarted();
|
||||||
|
// Do something
|
||||||
|
...
|
||||||
|
progressObject->setProgressValue(currentProgress);
|
||||||
|
...
|
||||||
|
// We have done what we needed to do
|
||||||
|
progressObject->reportFinished();
|
||||||
|
delete progressObject;
|
||||||
|
\endcode
|
||||||
|
In the first line we create the QFutureInterface object that will be
|
||||||
|
our way for reporting the task's state.
|
||||||
|
The first thing we report is the expected range of the progress values.
|
||||||
|
We register the task with the ProgressManager, using the internal
|
||||||
|
QFuture object that has been created for our QFutureInterface object.
|
||||||
|
Next we report that the task has begun and start doing our actual
|
||||||
|
work, regularly reporting the progress via the methods
|
||||||
|
in QFutureInterface. After the long taking operation has finished,
|
||||||
|
we report so through the QFutureInterface object, and delete it
|
||||||
|
afterwards.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\enum Core::ProgressManager::ProgressFlag
|
||||||
|
Additional flags that specify details in behavior. The
|
||||||
|
default for a task is to not have any of these flags set.
|
||||||
|
\value KeepOnFinish
|
||||||
|
The progress indicator stays visible after the task has finished.
|
||||||
|
\value ShowInApplicationIcon
|
||||||
|
The progress indicator for this task is additionally
|
||||||
|
shown in the application icon in the system's task bar or dock, on
|
||||||
|
platforms that support that (at the moment Windows 7 and Mac OS X).
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\fn Core::ProgressManager::ProgressManager(QObject *parent = 0)
|
||||||
|
\internal
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\fn Core::ProgressManager::~ProgressManager()
|
||||||
|
\internal
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\fn FutureProgress *Core::ProgressManager::addTask(const QFuture<void> &future, const QString &title, const QString &type, ProgressFlags flags = 0)
|
||||||
|
|
||||||
|
Shows a progress indicator for the given task.
|
||||||
|
The progress indicator shows the specified \a title along with the progress bar.
|
||||||
|
The \a type of a task will specify a logical grouping with other
|
||||||
|
running tasks. Via the \a flags parameter you can e.g. let the
|
||||||
|
progress indicator stay visible after the task has finished.
|
||||||
|
Returns an object that represents the created progress indicator,
|
||||||
|
which can be used to further customize.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\fn void Core::ProgressManager::setApplicationLabel(const QString &text)
|
||||||
|
|
||||||
|
Shows the given \a text in a platform dependent way in the application
|
||||||
|
icon in the system's task bar or dock. This is used
|
||||||
|
to show the number of build errors on Windows 7 and Mac OS X.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\fn void Core::ProgressManager::cancelTasks(const QString &type)
|
||||||
|
|
||||||
|
Schedules a cancel for all running tasks of the given \a type.
|
||||||
|
Please note that the cancel functionality depends on the
|
||||||
|
running task to actually check the \c QFutureInterface::isCanceled
|
||||||
|
property.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\fn void Core::ProgressManager::taskStarted(const QString &type)
|
||||||
|
|
||||||
|
Sent whenever a task of a given \a type is started.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\fn void Core::ProgressManager::allTasksFinished(const QString &type)
|
||||||
|
|
||||||
|
Sent when all tasks of a \a type have finished.
|
||||||
|
*/
|
||||||
|
|
||||||
ProgressManagerPrivate::ProgressManagerPrivate(QObject *parent)
|
ProgressManagerPrivate::ProgressManagerPrivate(QObject *parent)
|
||||||
: ProgressManager(parent),
|
: ProgressManager(parent),
|
||||||
m_applicationTask(0)
|
m_applicationTask(0)
|
||||||
|
Reference in New Issue
Block a user