From 40c5ae4407d45cf85dfcc10f4b9a03f003d6fe2b Mon Sep 17 00:00:00 2001 From: rldhont Date: Fri, 7 Nov 2014 14:41:09 +0100 Subject: [PATCH] [FIXED] #11572 Filter Legend By Map Content doesn't maintain point displacement legend The fix from https://github.com/qgis/QGIS/pull/1673 has to be enhance to have something more generic. This fix add methods to QgsPointDisplacementRenderer: * capabilities * symbolForFeature * originalSymbolForFeature * symbolsForFeature * originalSymbolsForFeature * willRenderFeature --- src/core/qgsmaphittest.cpp | 6 -- .../qgspointdisplacementrenderer.cpp | 98 +++++++++++++------ .../qgspointdisplacementrenderer.h | 20 +++- 3 files changed, 86 insertions(+), 38 deletions(-) diff --git a/src/core/qgsmaphittest.cpp b/src/core/qgsmaphittest.cpp index c021124b45c..b9f62c4638e 100644 --- a/src/core/qgsmaphittest.cpp +++ b/src/core/qgsmaphittest.cpp @@ -53,12 +53,6 @@ void QgsMapHitTest::run() void QgsMapHitTest::runHitTestLayer( QgsVectorLayer* vl, SymbolV2Set& usedSymbols, QgsRenderContext& context ) { QgsFeatureRendererV2* r = vl->rendererV2(); - - // Point displacement case - QgsPointDisplacementRenderer* pdr = dynamic_cast( r ); - if ( pdr ) - r = pdr->embeddedRenderer(); - bool moreSymbolsPerFeature = r->capabilities() & QgsFeatureRendererV2::MoreSymbolsPerFeature; r->startRender( context, vl->pendingFields() ); QgsFeature f; diff --git a/src/core/symbology-ng/qgspointdisplacementrenderer.cpp b/src/core/symbology-ng/qgspointdisplacementrenderer.cpp index 50707695362..59aae04f8c9 100644 --- a/src/core/symbology-ng/qgspointdisplacementrenderer.cpp +++ b/src/core/symbology-ng/qgspointdisplacementrenderer.cpp @@ -196,12 +196,80 @@ void QgsPointDisplacementRenderer::setEmbeddedRenderer( QgsFeatureRendererV2* r mRenderer = r; } +QList QgsPointDisplacementRenderer::usedAttributes() +{ + QList attributeList; + if ( !mLabelAttributeName.isEmpty() ) + { + attributeList.push_back( mLabelAttributeName ); + } + if ( mRenderer ) + { + attributeList += mRenderer->usedAttributes(); + } + return attributeList; +} + +int QgsPointDisplacementRenderer::capabilities() +{ + if ( !mRenderer ) + { + return 0; + } + return mRenderer->capabilities(); +} + +QgsSymbolV2List QgsPointDisplacementRenderer::symbols() +{ + if ( !mRenderer ) + { + return QgsSymbolV2List(); + } + return mRenderer->symbols(); +} + QgsSymbolV2* QgsPointDisplacementRenderer::symbolForFeature( QgsFeature& feature ) { - Q_UNUSED( feature ); - return 0; //not used any more + if ( !mRenderer ) + { + return 0; + } + return mRenderer->symbolForFeature( feature ); } +QgsSymbolV2* QgsPointDisplacementRenderer::originalSymbolForFeature( QgsFeature& feat ) +{ + if ( !mRenderer ) + return 0; + return mRenderer->originalSymbolForFeature( feat ); +} + +QgsSymbolV2List QgsPointDisplacementRenderer::symbolsForFeature( QgsFeature& feature ) +{ + if ( !mRenderer ) + { + return QgsSymbolV2List(); + } + return mRenderer->symbolsForFeature( feature ); +} + +QgsSymbolV2List QgsPointDisplacementRenderer::originalSymbolsForFeature( QgsFeature& feat ) +{ + if ( !mRenderer ) + return QgsSymbolV2List(); + return mRenderer->originalSymbolsForFeature( feat ); +} + +bool QgsPointDisplacementRenderer::willRenderFeature( QgsFeature& feat ) +{ + if ( !mRenderer ) + { + return false; + } + return mRenderer->willRenderFeature( feat ); +} + + void QgsPointDisplacementRenderer::startRender( QgsRenderContext& context, const QgsFields& fields ) { mRenderer->startRender( context, fields ); @@ -257,32 +325,6 @@ void QgsPointDisplacementRenderer::stopRender( QgsRenderContext& context ) } } -QList QgsPointDisplacementRenderer::usedAttributes() -{ - QList attributeList; - if ( !mLabelAttributeName.isEmpty() ) - { - attributeList.push_back( mLabelAttributeName ); - } - if ( mRenderer ) - { - attributeList += mRenderer->usedAttributes(); - } - return attributeList; -} - -QgsSymbolV2List QgsPointDisplacementRenderer::symbols() -{ - if ( mRenderer ) - { - return mRenderer->symbols(); - } - else - { - return QgsSymbolV2List(); - } -} - QgsFeatureRendererV2* QgsPointDisplacementRenderer::create( QDomElement& symbologyElem ) { QgsPointDisplacementRenderer* r = new QgsPointDisplacementRenderer(); diff --git a/src/core/symbology-ng/qgspointdisplacementrenderer.h b/src/core/symbology-ng/qgspointdisplacementrenderer.h index 326668b4529..578cd0633ed 100644 --- a/src/core/symbology-ng/qgspointdisplacementrenderer.h +++ b/src/core/symbology-ng/qgspointdisplacementrenderer.h @@ -41,15 +41,27 @@ class CORE_EXPORT QgsPointDisplacementRenderer: public QgsFeatureRendererV2 /**Reimplemented from QgsFeatureRendererV2*/ bool renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer = -1, bool selected = false, bool drawVertexMarker = false ); - QgsSymbolV2* symbolForFeature( QgsFeature& feature ); + /** Partial proxy that will call this method on the embedded renderer. */ + virtual QList usedAttributes(); + /** Proxy that will call this method on the embedded renderer. */ + virtual int capabilities(); + /** Proxy that will call this method on the embedded renderer. */ + virtual QgsSymbolV2List symbols(); + /** Proxy that will call this method on the embedded renderer. */ + virtual QgsSymbolV2* symbolForFeature( QgsFeature& feature ); + /** Proxy that will call this method on the embedded renderer. */ + virtual QgsSymbolV2* originalSymbolForFeature( QgsFeature& feat ); + /** Proxy that will call this method on the embedded renderer. */ + virtual QgsSymbolV2List symbolsForFeature( QgsFeature& feat ); + /** Proxy that will call this method on the embedded renderer. */ + virtual QgsSymbolV2List originalSymbolsForFeature( QgsFeature& feat ); + /** Proxy that will call this method on the embedded renderer. */ + virtual bool willRenderFeature( QgsFeature& feat ); void startRender( QgsRenderContext& context, const QgsFields& fields ); void stopRender( QgsRenderContext& context ); - QList usedAttributes(); - QgsSymbolV2List symbols(); - //! create a renderer from XML element static QgsFeatureRendererV2* create( QDomElement& symbologyElem ); QDomElement save( QDomDocument& doc );