From 7603487e6ad7a2851aabd6d4f56ef681e231c2fe Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Tue, 9 Jan 2018 14:41:38 +1000 Subject: [PATCH] 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) --- python/core/qgstaskmanager.sip | 18 ++++++++++++++++++ src/core/qgstaskmanager.cpp | 6 ++++++ src/core/qgstaskmanager.h | 16 ++++++++++++++++ src/gui/qgstaskmanagerwidget.cpp | 12 ++++++++++++ src/gui/qgstaskmanagerwidget.h | 2 ++ 5 files changed, 54 insertions(+) diff --git a/python/core/qgstaskmanager.sip b/python/core/qgstaskmanager.sip index 0069f49785d..b7d0e811112 100644 --- a/python/core/qgstaskmanager.sip +++ b/python/core/qgstaskmanager.sip @@ -419,6 +419,15 @@ Returns the number of active (queued or running) tasks. .. seealso:: :py:func:`activeTasks` .. seealso:: :py:func:`countActiveTasksChanged` +%End + + public slots: + + void trigger( QgsTask *task ); +%Docstring +Triggers a task, e.g. as a result of a GUI interaction. + +.. seealso:: :py:func:`triggered()` %End signals: @@ -473,6 +482,15 @@ Emitted when all tasks are complete Emitted when the number of active tasks changes .. seealso:: :py:func:`countActiveTasks` +%End + + void triggered( QgsTask *task ); +%Docstring +Emitted when a ``task`` is triggered. This occurs when a user clicks on +the task from the QGIS GUI, and can be used to show detailed progress +reports or re-open a related dialog. + +.. seealso:: :py:func:`trigger()` %End }; diff --git a/src/core/qgstaskmanager.cpp b/src/core/qgstaskmanager.cpp index d0a394a588c..19f70ed6468 100644 --- a/src/core/qgstaskmanager.cpp +++ b/src/core/qgstaskmanager.cpp @@ -607,6 +607,12 @@ int QgsTaskManager::countActiveTasks() const return tasks.intersect( mParentTasks ).count(); } +void QgsTaskManager::trigger( QgsTask *task ) +{ + if ( task ) + emit triggered( task ); +} + void QgsTaskManager::taskProgressChanged( double progress ) { QgsTask *task = qobject_cast< QgsTask * >( sender() ); diff --git a/src/core/qgstaskmanager.h b/src/core/qgstaskmanager.h index 7466a02dbe4..f31c04e25ba 100644 --- a/src/core/qgstaskmanager.h +++ b/src/core/qgstaskmanager.h @@ -485,6 +485,14 @@ class CORE_EXPORT QgsTaskManager : public QObject */ int countActiveTasks() const; + public slots: + + /** + * Triggers a task, e.g. as a result of a GUI interaction. + * \see triggered() + */ + void trigger( QgsTask *task ); + signals: /** @@ -532,6 +540,14 @@ class CORE_EXPORT QgsTaskManager : public QObject */ void countActiveTasksChanged( int count ); + /** + * Emitted when a \a task is triggered. This occurs when a user clicks on + * the task from the QGIS GUI, and can be used to show detailed progress + * reports or re-open a related dialog. + * \see trigger() + */ + void triggered( QgsTask *task ); + private slots: void taskProgressChanged( double progress ); diff --git a/src/gui/qgstaskmanagerwidget.cpp b/src/gui/qgstaskmanagerwidget.cpp index beb87290d79..426f7b8c5d0 100644 --- a/src/gui/qgstaskmanagerwidget.cpp +++ b/src/gui/qgstaskmanagerwidget.cpp @@ -33,6 +33,7 @@ QgsTaskManagerWidget::QgsTaskManagerWidget( QgsTaskManager *manager, QWidget *parent ) : QWidget( parent ) + , mManager( manager ) { Q_ASSERT( manager ); @@ -54,6 +55,8 @@ QgsTaskManagerWidget::QgsTaskManagerWidget( QgsTaskManager *manager, QWidget *pa mTreeView->header()->setStretchLastSection( false ); mTreeView->header()->setSectionResizeMode( QgsTaskManagerModel::Description, QHeaderView::Stretch ); + connect( mTreeView, &QTreeView::clicked, this, &QgsTaskManagerWidget::clicked ); + vLayout->addWidget( mTreeView ); setLayout( vLayout ); @@ -97,6 +100,15 @@ void QgsTaskManagerWidget::modelRowsInserted( const QModelIndex &, int start, in } } +void QgsTaskManagerWidget::clicked( const QModelIndex &index ) +{ + QgsTask *task = mModel->indexToTask( index ); + if ( !task ) + return; + + mManager->trigger( task ); +} + ///@cond PRIVATE // // QgsTaskManagerModel diff --git a/src/gui/qgstaskmanagerwidget.h b/src/gui/qgstaskmanagerwidget.h index 9290dbc76ea..d7596e7cc21 100644 --- a/src/gui/qgstaskmanagerwidget.h +++ b/src/gui/qgstaskmanagerwidget.h @@ -55,9 +55,11 @@ class GUI_EXPORT QgsTaskManagerWidget : public QWidget 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; };