From 01e8ed85e31916abe8e5bc94d03e78728ee87852 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Sat, 2 Dec 2017 10:52:58 +1000 Subject: [PATCH] More flexible API for preview job determination --- python/core/qgsdataprovider.sip | 1 + src/core/qgsdataprovider.cpp | 4 ++-- src/core/qgsdataprovider.h | 19 ++++++++++++++++++- src/gui/qgsmapcanvas.cpp | 5 ++++- 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/python/core/qgsdataprovider.sip b/python/core/qgsdataprovider.sip index 92a014a044a..1b2f9a8836a 100644 --- a/python/core/qgsdataprovider.sip +++ b/python/core/qgsdataprovider.sip @@ -380,6 +380,7 @@ Current time stamp of data source .. versionadded:: 3.0 %End + signals: void fullExtentCalculated(); diff --git a/src/core/qgsdataprovider.cpp b/src/core/qgsdataprovider.cpp index 6507a27a2fc..0306c9ececd 100644 --- a/src/core/qgsdataprovider.cpp +++ b/src/core/qgsdataprovider.cpp @@ -42,7 +42,7 @@ void QgsDataProvider::setListening( bool isListening ) Q_UNUSED( isListening ); } -bool QgsDataProvider::renderInPreview( double lastRenderingTimeMS, double maxRenderingTimeMS ) +bool QgsDataProvider::renderInPreview( QgsDataProvider::PreviewContext context ) { - return lastRenderingTimeMS <= maxRenderingTimeMS; + return context.lastRenderingTimeMs <= context.maxRenderingTimeMs; } diff --git a/src/core/qgsdataprovider.h b/src/core/qgsdataprovider.h index 0367c51cde1..33c9ec23041 100644 --- a/src/core/qgsdataprovider.h +++ b/src/core/qgsdataprovider.h @@ -461,6 +461,23 @@ class CORE_EXPORT QgsDataProvider : public QObject */ virtual void setListening( bool isListening ); +#ifndef SIP_RUN + + /** + * Stores settings related to the context in which a preview job runs. + * \note Not available in Python bindings + * \since QGIS 3.0 + */ + struct PreviewContext + { + //! Previous rendering time for the layer, in ms + double lastRenderingTimeMs = -1; + + //! Default maximum allowable render time, in ms + double maxRenderingTimeMs = MAXIMUM_LAYER_PREVIEW_TIME_MS; + }; +#endif + /** * Returns whether the layer must be rendered in preview jobs. * @@ -474,7 +491,7 @@ class CORE_EXPORT QgsDataProvider : public QObject * * \note not available in Python bindings */ - virtual bool renderInPreview( double lastRenderingTimeMS, double maxRenderingTimeMS ); // SIP_SKIP + virtual bool renderInPreview( QgsDataProvider::PreviewContext context ); // SIP_SKIP signals: diff --git a/src/gui/qgsmapcanvas.cpp b/src/gui/qgsmapcanvas.cpp index 6a7ca3a99ed..64b6850540c 100644 --- a/src/gui/qgsmapcanvas.cpp +++ b/src/gui/qgsmapcanvas.cpp @@ -2273,9 +2273,12 @@ void QgsMapCanvas::startPreviewJob( int number ) // truncate preview layers to fast layers const QList layers = jobSettings.layers(); QList< QgsMapLayer * > previewLayers; + QgsDataProvider::PreviewContext context; + context.maxRenderingTimeMs = MAXIMUM_LAYER_PREVIEW_TIME_MS; for ( QgsMapLayer *layer : layers ) { - if ( !layer->dataProvider()->renderInPreview( mLastLayerRenderTime.value( layer->id() ), MAXIMUM_LAYER_PREVIEW_TIME_MS ) ) + context.lastRenderingTimeMs = mLastLayerRenderTime.value( layer->id() ); + if ( !layer->dataProvider()->renderInPreview( context ) ) { QgsDebugMsgLevel( QString( "Layer %1 not rendered because it does not match the renderInPreview criterion %2" ).arg( layer->id() ).arg( mLastLayerRenderTime.value( layer->id() ) ), 3 ); continue;