More flexible API for preview job determination

This commit is contained in:
Nyall Dawson 2017-12-02 10:52:58 +10:00
parent 16a1bd7948
commit 01e8ed85e3
4 changed files with 25 additions and 4 deletions

View File

@ -380,6 +380,7 @@ Current time stamp of data source
.. versionadded:: 3.0
%End
signals:
void fullExtentCalculated();

View File

@ -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;
}

View File

@ -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:

View File

@ -2273,9 +2273,12 @@ void QgsMapCanvas::startPreviewJob( int number )
// truncate preview layers to fast layers
const QList<QgsMapLayer *> 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;