From 4a2226af31f7f932ae65dee352a0cb40fb086d41 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Sun, 23 Apr 2017 13:07:04 +1000 Subject: [PATCH] Allow canceling background map renders --- python/core/qgsmaprenderertask.sip | 3 +++ src/core/qgsmaprenderertask.cpp | 27 ++++++++++++++++++++++++--- src/core/qgsmaprenderertask.h | 7 +++++++ 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/python/core/qgsmaprenderertask.sip b/python/core/qgsmaprenderertask.sip index 0fb5d5050fa..aa34a73f84e 100644 --- a/python/core/qgsmaprenderertask.sip +++ b/python/core/qgsmaprenderertask.sip @@ -47,6 +47,9 @@ class QgsMapRendererTask : QgsTask Adds ``annotations`` to be rendered on the map. %End + virtual void cancel(); + + signals: void renderingComplete(); diff --git a/src/core/qgsmaprenderertask.cpp b/src/core/qgsmaprenderertask.cpp index 6a42ea6ecf2..bd63124ba16 100644 --- a/src/core/qgsmaprenderertask.cpp +++ b/src/core/qgsmaprenderertask.cpp @@ -18,7 +18,6 @@ #include "qgsannotation.h" #include "qgsannotationmanager.h" #include "qgsmaprenderertask.h" -#include "qgsmaprenderercustompainterjob.h" QgsMapRendererTask::QgsMapRendererTask( const QgsMapSettings &ms, const QString &fileName, const QString &fileFormat ) @@ -47,6 +46,16 @@ void QgsMapRendererTask::addAnnotations( QList< QgsAnnotation * > annotations ) } } +void QgsMapRendererTask::cancel() +{ + mJobMutex.lock(); + if ( mJob ) + mJob->cancelWithoutBlocking(); + mJobMutex.unlock(); + + QgsTask::cancel(); +} + bool QgsMapRendererTask::run() { QImage img; @@ -73,14 +82,26 @@ bool QgsMapRendererTask::run() if ( !destPainter ) return false; - QgsMapRendererCustomPainterJob r( mMapSettings, destPainter ); - r.renderSynchronously(); + mJobMutex.lock(); + mJob.reset( new QgsMapRendererCustomPainterJob( mMapSettings, destPainter ) ); + mJobMutex.unlock(); + mJob->renderSynchronously(); + + mJobMutex.lock(); + mJob.reset( nullptr ); + mJobMutex.unlock(); + + if ( isCanceled() ) + return false; QgsRenderContext context = QgsRenderContext::fromMapSettings( mMapSettings ); context.setPainter( destPainter ); Q_FOREACH ( QgsAnnotation *annotation, mAnnotations ) { + if ( isCanceled() ) + return false; + if ( !annotation || !annotation->isVisible() ) { continue; diff --git a/src/core/qgsmaprenderertask.h b/src/core/qgsmaprenderertask.h index 941ee31c684..a94b010d18c 100644 --- a/src/core/qgsmaprenderertask.h +++ b/src/core/qgsmaprenderertask.h @@ -24,8 +24,10 @@ #include "qgsannotationmanager.h" #include "qgsmapsettings.h" #include "qgstaskmanager.h" +#include "qgsmaprenderercustompainterjob.h" #include +class QgsMapRendererCustomPainterJob; /** * \class QgsMapRendererTask @@ -65,6 +67,8 @@ class CORE_EXPORT QgsMapRendererTask : public QgsTask */ void addAnnotations( QList< QgsAnnotation * > annotations ); + void cancel() override; + signals: /** @@ -86,6 +90,9 @@ class CORE_EXPORT QgsMapRendererTask : public QgsTask QgsMapSettings mMapSettings; + QMutex mJobMutex; + std::unique_ptr< QgsMapRendererCustomPainterJob > mJob; + QPainter *mPainter = nullptr; QString mFileName;