QGIS/src/gui/qgstaskmanagerwidget.h
Nyall Dawson 7603487e6a Add method to 'trigger' QgsTasks
Triggering occurs when a task is clicked in the task manager
widget, and this can be used to e.g. open a dialog showing
detailed task progress (or reopen a closed dialog which started
the task)
2018-01-16 19:45:40 +10:00

254 lines
6.7 KiB
C++

/***************************************************************************
qgstaskmanagerwidget.h
----------------------
begin : April 2016
copyright : (C) 2016 by Nyall Dawson
email : nyall dot dawson at gmail dot com
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef QGSTASKMANAGERWIDGET_H
#define QGSTASKMANAGERWIDGET_H
#include "qgsfloatingwidget.h"
#include "qgis.h"
#include "qgstaskmanager.h"
#include <QStyledItemDelegate>
#include <QToolButton>
#include "qgis_gui.h"
class QgsTaskManager;
class QgsTask;
class QTreeView;
class QProgressBar;
class QgsTaskManagerModel;
/**
* \ingroup gui
* \class QgsTaskManagerWidget
* A widget which displays tasks from a QgsTaskManager and allows for interaction with the manager.
* \see QgsTaskManager
* \since QGIS 3.0
*/
class GUI_EXPORT QgsTaskManagerWidget : public QWidget
{
Q_OBJECT
public:
/**
* Constructor for QgsTaskManagerWidget
* \param manager task manager associated with widget
* \param parent parent widget
*/
QgsTaskManagerWidget( QgsTaskManager *manager, QWidget *parent SIP_TRANSFERTHIS = nullptr );
~QgsTaskManagerWidget() override;
private slots:
void modelRowsInserted( const QModelIndex &index, int start, int end );
void clicked( const QModelIndex &index );
private:
QgsTaskManager *mManager = nullptr;
QTreeView *mTreeView = nullptr;
QgsTaskManagerModel *mModel = nullptr;
};
#ifndef SIP_RUN
///@cond PRIVATE
/**
* \ingroup gui
* \class QgsTaskManagerFloatingWidget
* A widget which displays tasks from a QgsTaskManager and allows for interaction with the manager.
* \see QgsTaskManager
* \since QGIS 3.0
*/
class GUI_EXPORT QgsTaskManagerFloatingWidget : public QgsFloatingWidget
{
Q_OBJECT
public:
/**
* Constructor for QgsTaskManagerWidget
* \param manager task manager associated with widget
* \param parent parent widget
*/
QgsTaskManagerFloatingWidget( QgsTaskManager *manager, QWidget *parent = nullptr );
};
/**
* \class QgsTaskManagerStatusBarWidget
* A compact widget designed for embedding in a status bar, which displays tasks from a
* QgsTaskManager and allows for interaction with the manager.
* \see QgsTaskManager
* \ingroup gui
* \since QGIS 3.0
*/
class GUI_EXPORT QgsTaskManagerStatusBarWidget : public QToolButton
{
Q_OBJECT
public:
/**
* Constructor for QgsTaskManagerWidget.
* \param manager task manager associated with widget
* \param parent parent widget
*/
QgsTaskManagerStatusBarWidget( QgsTaskManager *manager, QWidget *parent = nullptr );
QSize sizeHint() const override;
private slots:
void toggleDisplay();
void overallProgressChanged( double progress );
void countActiveTasksChanged( int count );
void allFinished();
void showButton();
private:
QgsTaskManagerFloatingWidget *mFloatingWidget = nullptr;
QProgressBar *mProgressBar = nullptr;
QgsTaskManager *mManager = nullptr;
};
/**
* \ingroup gui
* \class QgsTaskManagerModel
* A model representing a QgsTaskManager.
* \see QgsTaskManager
* \since QGIS 3.0
*/
class GUI_EXPORT QgsTaskManagerModel: public QAbstractItemModel
{
Q_OBJECT
public:
enum Columns
{
Description = 0,
Progress = 1,
Status = 2,
};
/**
* Constructor for QgsTaskManagerModel
* \param manager task manager for model
* \param parent parent object
*/
explicit QgsTaskManagerModel( QgsTaskManager *manager, QObject *parent = nullptr );
//reimplemented QAbstractItemModel methods
QModelIndex index( int row, int column, const QModelIndex &parent = QModelIndex() ) const override;
QModelIndex parent( const QModelIndex &index ) const override;
int rowCount( const QModelIndex &parent = QModelIndex() ) const override;
int columnCount( const QModelIndex &parent = QModelIndex() ) const override;
QVariant data( const QModelIndex &index, int role = Qt::DisplayRole ) const override;
Qt::ItemFlags flags( const QModelIndex &index ) const override;
bool setData( const QModelIndex &index, const QVariant &value, int role = Qt::EditRole ) override;
/**
* Returns the task associated with a specified model index, or nullptr if no
* task was found.
*/
QgsTask *indexToTask( const QModelIndex &index ) const;
//! Model roles
enum Roles
{
StatusRole = Qt::UserRole, //!< Status role
};
private slots:
void taskAdded( long id );
void taskDeleted( long id );
void progressChanged( long id, double progress );
void statusChanged( long id, int status );
private:
QgsTaskManager *mManager = nullptr;
QList< long > mRowToTaskIdList;
int idToRow( long id ) const;
QModelIndex idToIndex( long id, int column ) const;
};
/**
* \ingroup gui
* \class QgsTaskStatusWidget
* A widget for showing task status within a view. Clicks on the widget will cause the task to be canceled (via the model).
* \since QGIS 3.0
*/
class GUI_EXPORT QgsTaskStatusWidget : public QWidget
{
Q_OBJECT
public:
/**
* Constructor for QgsTaskStatusWidget
* \param parent parent object
*/
QgsTaskStatusWidget( QWidget *parent = nullptr, QgsTask::TaskStatus status = QgsTask::Queued, bool canCancel = true );
QSize sizeHint() const override;
//bool editorEvent( QEvent * event, QAbstractItemModel * model, const QStyleOptionViewItem & option, const QModelIndex & index ) override;
public slots:
/**
* Sets the status to show for the task.
*/
void setStatus( int status );
signals:
/**
* Emitted when the user clicks a cancelable task.
*/
void cancelClicked();
protected:
void paintEvent( QPaintEvent *e ) override;
void mousePressEvent( QMouseEvent *e ) override;
void mouseMoveEvent( QMouseEvent *e ) override;
void leaveEvent( QEvent *e ) override;
private:
bool mCanCancel;
QgsTask::TaskStatus mStatus;
bool mInside = false;
};
///@endcond
///
#endif
#endif //QGSTASKMANAGERWIDGET_H