diff --git a/.gitignore b/.gitignore index ba60fe2269a..e84b6ecec45 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ *.*~ +*.autosave *.aux *.diff *.log* diff --git a/python/core/symbology-ng/qgscategorizedsymbolrendererv2.sip b/python/core/symbology-ng/qgscategorizedsymbolrendererv2.sip index beafd1af747..566b778d33c 100644 --- a/python/core/symbology-ng/qgscategorizedsymbolrendererv2.sip +++ b/python/core/symbology-ng/qgscategorizedsymbolrendererv2.sip @@ -49,7 +49,7 @@ class QgsCategorizedSymbolRendererV2 : QgsFeatureRendererV2 virtual QgsSymbolV2* originalSymbolForFeature( QgsFeature& feature ); - virtual void startRender( QgsRenderContext& context, const QgsFields& fields ); + virtual QgsRenderOptions startRender( QgsRenderContext& context, const QgsFields& fields ); virtual void stopRender( QgsRenderContext& context ); diff --git a/python/core/symbology-ng/qgsgraduatedsymbolrendererv2.sip b/python/core/symbology-ng/qgsgraduatedsymbolrendererv2.sip index 2f8ed306b06..3c79444c304 100644 --- a/python/core/symbology-ng/qgsgraduatedsymbolrendererv2.sip +++ b/python/core/symbology-ng/qgsgraduatedsymbolrendererv2.sip @@ -91,7 +91,7 @@ class QgsGraduatedSymbolRendererV2 : QgsFeatureRendererV2 virtual QgsSymbolV2* originalSymbolForFeature( QgsFeature& feature ); - virtual void startRender( QgsRenderContext& context, const QgsFields& fields ); + virtual QgsRenderOptions startRender( QgsRenderContext& context, const QgsFields& fields ); virtual void stopRender( QgsRenderContext& context ); diff --git a/python/core/symbology-ng/qgsheatmaprenderer.sip b/python/core/symbology-ng/qgsheatmaprenderer.sip index 0f2aaf1de0d..fca3100a5cd 100644 --- a/python/core/symbology-ng/qgsheatmaprenderer.sip +++ b/python/core/symbology-ng/qgsheatmaprenderer.sip @@ -10,7 +10,7 @@ class QgsHeatmapRenderer : QgsFeatureRendererV2 //reimplemented methods virtual QgsFeatureRendererV2* clone() const /Factory/; - virtual void startRender( QgsRenderContext& context, const QgsFields& fields ); + virtual QgsRenderOptions startRender( QgsRenderContext& context, const QgsFields& fields ); virtual bool renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer = -1, bool selected = false, bool drawVertexMarker = false ); virtual void stopRender( QgsRenderContext& context ); virtual QgsSymbolV2* symbolForFeature( QgsFeature& feature ); diff --git a/python/core/symbology-ng/qgsinvertedpolygonrenderer.sip b/python/core/symbology-ng/qgsinvertedpolygonrenderer.sip index 0361f0f7df2..273da0959cf 100644 --- a/python/core/symbology-ng/qgsinvertedpolygonrenderer.sip +++ b/python/core/symbology-ng/qgsinvertedpolygonrenderer.sip @@ -14,7 +14,7 @@ class QgsInvertedPolygonRenderer : QgsFeatureRendererV2 /** Used to clone this feature renderer.*/ virtual QgsFeatureRendererV2* clone() const /Factory/; - virtual void startRender( QgsRenderContext& context, const QgsFields& fields ); + virtual QgsRenderOptions startRender( QgsRenderContext& context, const QgsFields& fields ); /** Renders a given feature. * This will here collect features. The actual rendering will be postponed to stopRender() diff --git a/python/core/symbology-ng/qgspointdisplacementrenderer.sip b/python/core/symbology-ng/qgspointdisplacementrenderer.sip index d44871732ab..55163e022d6 100644 --- a/python/core/symbology-ng/qgspointdisplacementrenderer.sip +++ b/python/core/symbology-ng/qgspointdisplacementrenderer.sip @@ -16,7 +16,7 @@ class QgsPointDisplacementRenderer : QgsFeatureRendererV2 QgsSymbolV2* symbolForFeature( QgsFeature& feature ); - void startRender( QgsRenderContext& context, const QgsFields& fields ); + QgsRenderOptions startRender( QgsRenderContext& context, const QgsFields& fields ); void stopRender( QgsRenderContext& context ); diff --git a/python/core/symbology-ng/qgsrendererv2.sip b/python/core/symbology-ng/qgsrendererv2.sip index ff6ea841895..6b137ef4fdb 100644 --- a/python/core/symbology-ng/qgsrendererv2.sip +++ b/python/core/symbology-ng/qgsrendererv2.sip @@ -17,6 +17,16 @@ class QgsSymbolV2LevelItem int layer(); }; +class QgsRenderOptions +{ +%TypeHeaderCode +#include +%End + public: + void setWhereClause( const QString& whereClause ); + QString whereClause(); +}; + // every level has list of items: symbol + symbol layer num // typedef QList< QgsSymbolV2LevelItem > QgsSymbolV2Level; @@ -74,7 +84,7 @@ class QgsFeatureRendererV2 */ virtual QgsSymbolV2* originalSymbolForFeature( QgsFeature& feature ); - virtual void startRender( QgsRenderContext& context, const QgsFields& fields ) = 0; + virtual QgsRenderOptions startRender( QgsRenderContext& context, const QgsFields& fields ) = 0; //! @deprecated since 2.4 - not using QgsVectorLayer directly anymore virtual void startRender( QgsRenderContext& context, const QgsVectorLayer *vlayer ) /Deprecated/; diff --git a/python/core/symbology-ng/qgsrulebasedrendererv2.sip b/python/core/symbology-ng/qgsrulebasedrendererv2.sip index b7df2d32fef..cdc5f6c02ff 100644 --- a/python/core/symbology-ng/qgsrulebasedrendererv2.sip +++ b/python/core/symbology-ng/qgsrulebasedrendererv2.sip @@ -173,7 +173,7 @@ class QgsRuleBasedRendererV2 : QgsFeatureRendererV2 virtual bool renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer = -1, bool selected = false, bool drawVertexMarker = false ); - virtual void startRender( QgsRenderContext& context, const QgsFields& fields ); + virtual QgsRenderOptions startRender( QgsRenderContext& context, const QgsFields& fields ); virtual void stopRender( QgsRenderContext& context ); diff --git a/python/core/symbology-ng/qgssinglesymbolrendererv2.sip b/python/core/symbology-ng/qgssinglesymbolrendererv2.sip index bf9e39d5748..eb734770a3a 100644 --- a/python/core/symbology-ng/qgssinglesymbolrendererv2.sip +++ b/python/core/symbology-ng/qgssinglesymbolrendererv2.sip @@ -13,7 +13,7 @@ class QgsSingleSymbolRendererV2 : QgsFeatureRendererV2 virtual QgsSymbolV2* originalSymbolForFeature( QgsFeature& feature ); - virtual void startRender( QgsRenderContext& context, const QgsFields& fields ); + virtual QgsRenderOptions startRender( QgsRenderContext& context, const QgsFields& fields ); virtual void stopRender( QgsRenderContext& context ); diff --git a/src/core/symbology-ng/qgscategorizedsymbolrendererv2.cpp b/src/core/symbology-ng/qgscategorizedsymbolrendererv2.cpp index a85d49a82e7..f8d4c618e2d 100644 --- a/src/core/symbology-ng/qgscategorizedsymbolrendererv2.cpp +++ b/src/core/symbology-ng/qgscategorizedsymbolrendererv2.cpp @@ -396,7 +396,7 @@ void QgsCategorizedSymbolRendererV2::sortByLabel( Qt::SortOrder order ) } } -void QgsCategorizedSymbolRendererV2::startRender( QgsRenderContext& context, const QgsFields& fields ) +QgsRenderOptions QgsCategorizedSymbolRendererV2::startRender( QgsRenderContext& context, const QgsFields& fields ) { mCounting = context.rendererScale() == 0.0; @@ -425,6 +425,7 @@ void QgsCategorizedSymbolRendererV2::startRender( QgsRenderContext& context, con mTempSymbols[ it->symbol()] = tempSymbol; } } + return QgsRenderOptions(); } void QgsCategorizedSymbolRendererV2::stopRender( QgsRenderContext& context ) diff --git a/src/core/symbology-ng/qgscategorizedsymbolrendererv2.h b/src/core/symbology-ng/qgscategorizedsymbolrendererv2.h index bd111c83848..c2b78369990 100644 --- a/src/core/symbology-ng/qgscategorizedsymbolrendererv2.h +++ b/src/core/symbology-ng/qgscategorizedsymbolrendererv2.h @@ -79,7 +79,7 @@ class CORE_EXPORT QgsCategorizedSymbolRendererV2 : public QgsFeatureRendererV2 virtual QgsSymbolV2* originalSymbolForFeature( QgsFeature& feature ) override; - virtual void startRender( QgsRenderContext& context, const QgsFields& fields ) override; + virtual QgsRenderOptions startRender( QgsRenderContext& context, const QgsFields& fields ) override; virtual void stopRender( QgsRenderContext& context ) override; diff --git a/src/core/symbology-ng/qgsgraduatedsymbolrendererv2.cpp b/src/core/symbology-ng/qgsgraduatedsymbolrendererv2.cpp index 8318f476e59..e86b3946a3f 100644 --- a/src/core/symbology-ng/qgsgraduatedsymbolrendererv2.cpp +++ b/src/core/symbology-ng/qgsgraduatedsymbolrendererv2.cpp @@ -369,7 +369,7 @@ QgsSymbolV2* QgsGraduatedSymbolRendererV2::originalSymbolForFeature( QgsFeature& return symbolForValue( value.toDouble() ); } -void QgsGraduatedSymbolRendererV2::startRender( QgsRenderContext& context, const QgsFields& fields ) +QgsRenderOptions QgsGraduatedSymbolRendererV2::startRender( QgsRenderContext& context, const QgsFields& fields ) { mCounting = context.rendererScale() == 0.0; @@ -399,6 +399,7 @@ void QgsGraduatedSymbolRendererV2::startRender( QgsRenderContext& context, const mTempSymbols[ it->symbol()] = tempSymbol; } } + return QgsRenderOptions(); } void QgsGraduatedSymbolRendererV2::stopRender( QgsRenderContext& context ) diff --git a/src/core/symbology-ng/qgsgraduatedsymbolrendererv2.h b/src/core/symbology-ng/qgsgraduatedsymbolrendererv2.h index 068a2ec7d54..8086176761f 100644 --- a/src/core/symbology-ng/qgsgraduatedsymbolrendererv2.h +++ b/src/core/symbology-ng/qgsgraduatedsymbolrendererv2.h @@ -123,7 +123,7 @@ class CORE_EXPORT QgsGraduatedSymbolRendererV2 : public QgsFeatureRendererV2 virtual QgsSymbolV2* originalSymbolForFeature( QgsFeature& feature ) override; - virtual void startRender( QgsRenderContext& context, const QgsFields& fields ) override; + virtual QgsRenderOptions startRender( QgsRenderContext& context, const QgsFields& fields ) override; virtual void stopRender( QgsRenderContext& context ) override; diff --git a/src/core/symbology-ng/qgsheatmaprenderer.cpp b/src/core/symbology-ng/qgsheatmaprenderer.cpp index 65c46b0d6ac..307ab86855d 100644 --- a/src/core/symbology-ng/qgsheatmaprenderer.cpp +++ b/src/core/symbology-ng/qgsheatmaprenderer.cpp @@ -63,12 +63,12 @@ void QgsHeatmapRenderer::initializeValues( QgsRenderContext& context ) mRadiusSquared = mRadiusPixels * mRadiusPixels; } -void QgsHeatmapRenderer::startRender( QgsRenderContext& context, const QgsFields& fields ) +QgsRenderOptions QgsHeatmapRenderer::startRender( QgsRenderContext& context, const QgsFields& fields ) { Q_UNUSED( fields ); if ( !context.painter() ) { - return; + return QgsRenderOptions(); } // find out classification attribute index from name @@ -80,6 +80,7 @@ void QgsHeatmapRenderer::startRender( QgsRenderContext& context, const QgsFields } initializeValues( context ); + return QgsRenderOptions(); } QgsMultiPoint QgsHeatmapRenderer::convertToMultipoint( const QgsGeometry* geom ) diff --git a/src/core/symbology-ng/qgsheatmaprenderer.h b/src/core/symbology-ng/qgsheatmaprenderer.h index 0e57ac16fb4..158255b1ab5 100644 --- a/src/core/symbology-ng/qgsheatmaprenderer.h +++ b/src/core/symbology-ng/qgsheatmaprenderer.h @@ -39,7 +39,7 @@ class CORE_EXPORT QgsHeatmapRenderer : public QgsFeatureRendererV2 //reimplemented methods virtual QgsFeatureRendererV2* clone() const override; - virtual void startRender( QgsRenderContext& context, const QgsFields& fields ) override; + virtual QgsRenderOptions startRender( QgsRenderContext& context, const QgsFields& fields ) override; virtual bool renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer = -1, bool selected = false, bool drawVertexMarker = false ) override; virtual void stopRender( QgsRenderContext& context ) override; virtual QgsSymbolV2* symbolForFeature( QgsFeature& feature ) override; diff --git a/src/core/symbology-ng/qgsinvertedpolygonrenderer.cpp b/src/core/symbology-ng/qgsinvertedpolygonrenderer.cpp index 816b81e7a7d..96944205859 100644 --- a/src/core/symbology-ng/qgsinvertedpolygonrenderer.cpp +++ b/src/core/symbology-ng/qgsinvertedpolygonrenderer.cpp @@ -63,11 +63,11 @@ const QgsFeatureRendererV2* QgsInvertedPolygonRenderer::embeddedRenderer() const return mSubRenderer.data(); } -void QgsInvertedPolygonRenderer::startRender( QgsRenderContext& context, const QgsFields& fields ) +QgsRenderOptions QgsInvertedPolygonRenderer::startRender( QgsRenderContext& context, const QgsFields& fields ) { if ( !mSubRenderer ) { - return; + return QgsRenderOptions(); } // first call start render on the sub renderer @@ -85,7 +85,7 @@ void QgsInvertedPolygonRenderer::startRender( QgsRenderContext& context, const Q if ( !context.painter() ) { - return; + return QgsRenderOptions(); } // convert viewport to dest CRS @@ -119,6 +119,8 @@ void QgsInvertedPolygonRenderer::startRender( QgsRenderContext& context, const Q mExtentPolygon.clear(); mExtentPolygon.append( exteriorRing ); + + return QgsRenderOptions(); } bool QgsInvertedPolygonRenderer::renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer, bool selected, bool drawVertexMarker ) diff --git a/src/core/symbology-ng/qgsinvertedpolygonrenderer.h b/src/core/symbology-ng/qgsinvertedpolygonrenderer.h index 1e8ad605f65..13c14304100 100644 --- a/src/core/symbology-ng/qgsinvertedpolygonrenderer.h +++ b/src/core/symbology-ng/qgsinvertedpolygonrenderer.h @@ -50,7 +50,7 @@ class CORE_EXPORT QgsInvertedPolygonRenderer : public QgsFeatureRendererV2 /** Used to clone this feature renderer.*/ virtual QgsFeatureRendererV2* clone() const override; - virtual void startRender( QgsRenderContext& context, const QgsFields& fields ) override; + virtual QgsRenderOptions startRender( QgsRenderContext& context, const QgsFields& fields ) override; /** Renders a given feature. * This will here collect features. The actual rendering will be postponed to stopRender() diff --git a/src/core/symbology-ng/qgspointdisplacementrenderer.cpp b/src/core/symbology-ng/qgspointdisplacementrenderer.cpp index 046d92dff38..a755983062b 100644 --- a/src/core/symbology-ng/qgspointdisplacementrenderer.cpp +++ b/src/core/symbology-ng/qgspointdisplacementrenderer.cpp @@ -279,7 +279,7 @@ bool QgsPointDisplacementRenderer::willRenderFeature( QgsFeature& feat ) } -void QgsPointDisplacementRenderer::startRender( QgsRenderContext& context, const QgsFields& fields ) +QgsRenderOptions QgsPointDisplacementRenderer::startRender( QgsRenderContext& context, const QgsFields& fields ) { mRenderer->startRender( context, fields ); @@ -310,6 +310,7 @@ void QgsPointDisplacementRenderer::startRender( QgsRenderContext& context, const { mCenterSymbol->startRender( context, &fields ); } + return QgsRenderOptions(); } void QgsPointDisplacementRenderer::stopRender( QgsRenderContext& context ) diff --git a/src/core/symbology-ng/qgspointdisplacementrenderer.h b/src/core/symbology-ng/qgspointdisplacementrenderer.h index a908958ee22..5d5f286132e 100644 --- a/src/core/symbology-ng/qgspointdisplacementrenderer.h +++ b/src/core/symbology-ng/qgspointdisplacementrenderer.h @@ -58,7 +58,7 @@ class CORE_EXPORT QgsPointDisplacementRenderer: public QgsFeatureRendererV2 /** Proxy that will call this method on the embedded renderer. */ virtual bool willRenderFeature( QgsFeature& feat ) override; - void startRender( QgsRenderContext& context, const QgsFields& fields ) override; + QgsRenderOptions startRender( QgsRenderContext& context, const QgsFields& fields ) override; void stopRender( QgsRenderContext& context ) override; diff --git a/src/core/symbology-ng/qgsrendererv2.h b/src/core/symbology-ng/qgsrendererv2.h index f9dffcb5cbf..2fad4e5f291 100644 --- a/src/core/symbology-ng/qgsrendererv2.h +++ b/src/core/symbology-ng/qgsrendererv2.h @@ -61,6 +61,15 @@ class CORE_EXPORT QgsSymbolV2LevelItem int mLayer; }; +class CORE_EXPORT QgsRenderOptions +{ + public: + void setWhereClause( const QString& whereClause ) { mWhereClause = whereClause; } + QString whereClause() { return mWhereClause; } + private: + QString mWhereClause; +}; + // every level has list of items: symbol + symbol layer num typedef QList< QgsSymbolV2LevelItem > QgsSymbolV2Level; @@ -95,7 +104,14 @@ class CORE_EXPORT QgsFeatureRendererV2 */ virtual QgsSymbolV2* originalSymbolForFeature( QgsFeature& feature ) { return symbolForFeature( feature ); } - virtual void startRender( QgsRenderContext& context, const QgsFields& fields ) = 0; + /** + * Needs to be called when a new render cycle is started + * + * @param context Additional information passed to the renderer about the job which will be rendered + * @param fields The fields available for rendering + * @return Information passed back from the renderer that can e.g. be used to reduce the amount of requested features + */ + virtual QgsRenderOptions startRender( QgsRenderContext& context, const QgsFields& fields ) = 0; //! @deprecated since 2.4 - not using QgsVectorLayer directly anymore Q_DECL_DEPRECATED virtual void startRender( QgsRenderContext& context, const QgsVectorLayer* vlayer ); diff --git a/src/core/symbology-ng/qgsrulebasedrendererv2.cpp b/src/core/symbology-ng/qgsrulebasedrendererv2.cpp index 0dc9ef62120..f29a4077b2b 100644 --- a/src/core/symbology-ng/qgsrulebasedrendererv2.cpp +++ b/src/core/symbology-ng/qgsrulebasedrendererv2.cpp @@ -779,7 +779,7 @@ bool QgsRuleBasedRendererV2::renderFeature( QgsFeature& feature, } -void QgsRuleBasedRendererV2::startRender( QgsRenderContext& context, const QgsFields& fields ) +QgsRenderOptions QgsRuleBasedRendererV2::startRender( QgsRenderContext& context, const QgsFields& fields ) { // prepare active children mRootRule->startRender( context, fields ); @@ -800,6 +800,7 @@ void QgsRuleBasedRendererV2::startRender( QgsRenderContext& context, const QgsFi } mRootRule->setNormZLevels( zLevelsToNormLevels ); + return QgsRenderOptions(); } void QgsRuleBasedRendererV2::stopRender( QgsRenderContext& context ) diff --git a/src/core/symbology-ng/qgsrulebasedrendererv2.h b/src/core/symbology-ng/qgsrulebasedrendererv2.h index 39a7edb857d..19f0f5b04a2 100644 --- a/src/core/symbology-ng/qgsrulebasedrendererv2.h +++ b/src/core/symbology-ng/qgsrulebasedrendererv2.h @@ -220,7 +220,7 @@ class CORE_EXPORT QgsRuleBasedRendererV2 : public QgsFeatureRendererV2 virtual bool renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer = -1, bool selected = false, bool drawVertexMarker = false ) override; - virtual void startRender( QgsRenderContext& context, const QgsFields& fields ) override; + virtual QgsRenderOptions startRender( QgsRenderContext& context, const QgsFields& fields ) override; virtual void stopRender( QgsRenderContext& context ) override; diff --git a/src/core/symbology-ng/qgssinglesymbolrendererv2.cpp b/src/core/symbology-ng/qgssinglesymbolrendererv2.cpp index 67abc1fd6cf..0d14ed720ef 100644 --- a/src/core/symbology-ng/qgssinglesymbolrendererv2.cpp +++ b/src/core/symbology-ng/qgssinglesymbolrendererv2.cpp @@ -79,9 +79,10 @@ QgsSymbolV2* QgsSingleSymbolRendererV2::originalSymbolForFeature( QgsFeature& fe return mSymbol.data(); } -void QgsSingleSymbolRendererV2::startRender( QgsRenderContext& context, const QgsFields& fields ) +QgsRenderOptions QgsSingleSymbolRendererV2::startRender( QgsRenderContext& context, const QgsFields& fields ) { - if ( !mSymbol.data() ) return; + if ( !mSymbol.data() ) + return QgsRenderOptions(); mSymbol->startRender( context, &fields ); @@ -112,6 +113,8 @@ void QgsSingleSymbolRendererV2::startRender( QgsRenderContext& context, const Qg mOrigSize = 0; } } + + return QgsRenderOptions(); } void QgsSingleSymbolRendererV2::stopRender( QgsRenderContext& context ) diff --git a/src/core/symbology-ng/qgssinglesymbolrendererv2.h b/src/core/symbology-ng/qgssinglesymbolrendererv2.h index 1a58fb005cb..ffce5053c18 100644 --- a/src/core/symbology-ng/qgssinglesymbolrendererv2.h +++ b/src/core/symbology-ng/qgssinglesymbolrendererv2.h @@ -33,7 +33,7 @@ class CORE_EXPORT QgsSingleSymbolRendererV2 : public QgsFeatureRendererV2 virtual QgsSymbolV2* originalSymbolForFeature( QgsFeature& feature ) override; - virtual void startRender( QgsRenderContext& context, const QgsFields& fields ) override; + virtual QgsRenderOptions startRender( QgsRenderContext& context, const QgsFields& fields ) override; virtual void stopRender( QgsRenderContext& context ) override;