Skip to content

Commit b32afce

Browse files
committed
Fix inverted polygon & displacement renderer don't show
color wheel in legend menu Move embedded renderer handling to QgsFeatureRendererV2 and add support for embedded renders to legend context menu Fix #14967
1 parent d77a33d commit b32afce

9 files changed

+82
-30
lines changed

python/core/symbology-ng/qgsinvertedpolygonrenderer.sip

+5-8
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@ class QgsInvertedPolygonRenderer : QgsFeatureRendererV2
66
public:
77

88
/** Constructor
9-
* @param embeddedRenderer optional embeddedRenderer. If null, a default one will be assigned
9+
* @param embeddedRenderer optional embeddedRenderer. If null, a default one will be assigned.
10+
* Ownership will be transferred.
1011
*/
11-
QgsInvertedPolygonRenderer( const QgsFeatureRendererV2* embeddedRenderer /Transfer/ = 0 );
12+
QgsInvertedPolygonRenderer( QgsFeatureRendererV2* embeddedRenderer /Transfer/ = 0 );
13+
1214
virtual ~QgsInvertedPolygonRenderer();
1315

1416
/** Used to clone this feature renderer.*/
@@ -80,12 +82,7 @@ class QgsInvertedPolygonRenderer : QgsFeatureRendererV2
8082
*/
8183
virtual QDomElement save( QDomDocument& doc );
8284

83-
/** Sets the embedded renderer
84-
* @param subRenderer the embedded renderer (will be cloned)
85-
*/
86-
void setEmbeddedRenderer( const QgsFeatureRendererV2* subRenderer );
87-
/** @returns the current embedded renderer
88-
*/
85+
void setEmbeddedRenderer( QgsFeatureRendererV2* subRenderer /Transfer/ );
8986
const QgsFeatureRendererV2* embeddedRenderer() const;
9087

9188
/** @returns true if the geometries are to be preprocessed (merged with an union) before rendering.*/

python/core/symbology-ng/qgspointdisplacementrenderer.sip

-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@ class QgsPointDisplacementRenderer : QgsFeatureRendererV2
6868
void setLabelAttributeName( const QString& name );
6969
QString labelAttributeName() const;
7070

71-
/** Sets embedded renderer (takes ownership)*/
7271
void setEmbeddedRenderer( QgsFeatureRendererV2* r /Transfer/ );
7372
QgsFeatureRendererV2* embeddedRenderer();
7473

python/core/symbology-ng/qgsrendererv2.sip

+15
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,21 @@ class QgsFeatureRendererV2
391391
*/
392392
void setOrderByEnabled( bool enabled );
393393

394+
/** Sets an embedded renderer (subrenderer) for this feature renderer. The base class implementation
395+
* does nothing with subrenderers, but individual derived classes can use these to modify their behaviour.
396+
* @param subRenderer the embedded renderer. Ownership will be transferred.
397+
* @see embeddedRenderer()
398+
* @note added in QGIS 2.16
399+
*/
400+
virtual void setEmbeddedRenderer( QgsFeatureRendererV2* subRenderer /Transfer/ );
401+
402+
/** Returns the current embedded renderer (subrenderer) for this feature renderer. The base class
403+
* implementation does not use subrenderers and will always return null.
404+
* @see setEmbeddedRenderer()
405+
* @note added in QGIS 2.16
406+
*/
407+
virtual const QgsFeatureRendererV2* embeddedRenderer() const;
408+
394409
protected:
395410
QgsFeatureRendererV2( const QString& type );
396411

src/app/qgsapplayertreeviewmenuprovider.cpp

+30-4
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,11 @@ QMenu* QgsAppLayerTreeViewMenuProvider::createContextMenu()
147147

148148
if ( vlayer )
149149
{
150-
QgsSingleSymbolRendererV2* singleRenderer = dynamic_cast< QgsSingleSymbolRendererV2* >( vlayer->rendererV2() );
150+
const QgsSingleSymbolRendererV2* singleRenderer = dynamic_cast< const QgsSingleSymbolRendererV2* >( vlayer->rendererV2() );
151+
if ( !singleRenderer && vlayer->rendererV2()->embeddedRenderer() )
152+
{
153+
singleRenderer = dynamic_cast< const QgsSingleSymbolRendererV2* >( vlayer->rendererV2()->embeddedRenderer() );
154+
}
151155
if ( singleRenderer && singleRenderer->symbol() )
152156
{
153157
//single symbol renderer, so add set color/edit symbol actions
@@ -511,12 +515,34 @@ void QgsAppLayerTreeViewMenuProvider::setVectorSymbolColor( const QColor& color
511515
return;
512516

513517
QgsSingleSymbolRendererV2* singleRenderer = dynamic_cast< QgsSingleSymbolRendererV2* >( layer->rendererV2() );
514-
if ( !singleRenderer || !singleRenderer->symbol() )
518+
QgsSymbolV2* newSymbol = nullptr;
519+
520+
if ( singleRenderer && singleRenderer->symbol() )
521+
newSymbol = singleRenderer->symbol()->clone();
522+
523+
const QgsSingleSymbolRendererV2* embeddedRenderer = nullptr;
524+
if ( !newSymbol && layer->rendererV2()->embeddedRenderer() )
525+
{
526+
embeddedRenderer = dynamic_cast< const QgsSingleSymbolRendererV2* >( layer->rendererV2()->embeddedRenderer() );
527+
if ( embeddedRenderer && embeddedRenderer->symbol() )
528+
newSymbol = embeddedRenderer->symbol()->clone();
529+
}
530+
531+
if ( !newSymbol )
515532
return;
516533

517-
QgsSymbolV2* newSymbol = singleRenderer->symbol()->clone();
518534
newSymbol->setColor( color );
519-
singleRenderer->setSymbol( newSymbol );
535+
if ( singleRenderer )
536+
{
537+
singleRenderer->setSymbol( newSymbol );
538+
}
539+
else if ( embeddedRenderer )
540+
{
541+
QgsSingleSymbolRendererV2* newRenderer = embeddedRenderer->clone();
542+
newRenderer->setSymbol( newSymbol );
543+
layer->rendererV2()->setEmbeddedRenderer( newRenderer );
544+
}
545+
520546
layer->triggerRepaint();
521547
mView->refreshLayerSymbology( layer->id() );
522548
}

src/core/symbology-ng/qgsinvertedpolygonrenderer.cpp

+4-5
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
#include <QDomDocument>
3030
#include <QDomElement>
3131

32-
QgsInvertedPolygonRenderer::QgsInvertedPolygonRenderer( const QgsFeatureRendererV2* subRenderer )
32+
QgsInvertedPolygonRenderer::QgsInvertedPolygonRenderer( QgsFeatureRendererV2* subRenderer )
3333
: QgsFeatureRendererV2( "invertedPolygonRenderer" )
3434
, mPreprocessingEnabled( false )
3535
{
@@ -47,11 +47,11 @@ QgsInvertedPolygonRenderer::~QgsInvertedPolygonRenderer()
4747
{
4848
}
4949

50-
void QgsInvertedPolygonRenderer::setEmbeddedRenderer( const QgsFeatureRendererV2* subRenderer )
50+
void QgsInvertedPolygonRenderer::setEmbeddedRenderer( QgsFeatureRendererV2* subRenderer )
5151
{
5252
if ( subRenderer )
5353
{
54-
mSubRenderer.reset( const_cast<QgsFeatureRendererV2*>( subRenderer )->clone() );
54+
mSubRenderer.reset( subRenderer );
5555
}
5656
else
5757
{
@@ -341,7 +341,7 @@ QgsInvertedPolygonRenderer* QgsInvertedPolygonRenderer::clone() const
341341
}
342342
else
343343
{
344-
newRenderer = new QgsInvertedPolygonRenderer( mSubRenderer.data() );
344+
newRenderer = new QgsInvertedPolygonRenderer( mSubRenderer.data()->clone() );
345345
}
346346
newRenderer->setPreprocessingEnabled( preprocessingEnabled() );
347347
copyRendererData( newRenderer );
@@ -357,7 +357,6 @@ QgsFeatureRendererV2* QgsInvertedPolygonRenderer::create( QDomElement& element )
357357
{
358358
QgsFeatureRendererV2* renderer = QgsFeatureRendererV2::load( embeddedRendererElem );
359359
r->setEmbeddedRenderer( renderer );
360-
delete renderer;
361360
}
362361
r->setPreprocessingEnabled( element.attribute( "preprocessing", "0" ).toInt() == 1 );
363362
return r;

src/core/symbology-ng/qgsinvertedpolygonrenderer.h

+6-9
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,11 @@ class CORE_EXPORT QgsInvertedPolygonRenderer : public QgsFeatureRendererV2
4242
public:
4343

4444
/** Constructor
45-
* @param embeddedRenderer optional embeddedRenderer. If null, a default one will be assigned
45+
* @param embeddedRenderer optional embeddedRenderer. If null, a default one will be assigned.
46+
* Ownership will be transferred.
4647
*/
47-
QgsInvertedPolygonRenderer( const QgsFeatureRendererV2* embeddedRenderer = nullptr );
48+
QgsInvertedPolygonRenderer( QgsFeatureRendererV2* embeddedRenderer = nullptr );
49+
4850
virtual ~QgsInvertedPolygonRenderer();
4951

5052
/** Used to clone this feature renderer.*/
@@ -116,13 +118,8 @@ class CORE_EXPORT QgsInvertedPolygonRenderer : public QgsFeatureRendererV2
116118
*/
117119
virtual QDomElement save( QDomDocument& doc ) override;
118120

119-
/** Sets the embedded renderer
120-
* @param subRenderer the embedded renderer (will be cloned)
121-
*/
122-
void setEmbeddedRenderer( const QgsFeatureRendererV2* subRenderer );
123-
/** @returns the current embedded renderer
124-
*/
125-
const QgsFeatureRendererV2* embeddedRenderer() const;
121+
void setEmbeddedRenderer( QgsFeatureRendererV2* subRenderer ) override;
122+
const QgsFeatureRendererV2* embeddedRenderer() const override;
126123

127124
/** @returns true if the geometries are to be preprocessed (merged with an union) before rendering.*/
128125
bool preprocessingEnabled() const { return mPreprocessingEnabled; }

src/core/symbology-ng/qgspointdisplacementrenderer.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,11 @@ void QgsPointDisplacementRenderer::setEmbeddedRenderer( QgsFeatureRendererV2* r
222222
mRenderer = r;
223223
}
224224

225+
const QgsFeatureRendererV2* QgsPointDisplacementRenderer::embeddedRenderer() const
226+
{
227+
return mRenderer;
228+
}
229+
225230
QList<QString> QgsPointDisplacementRenderer::usedAttributes()
226231
{
227232
QList<QString> attributeList;

src/core/symbology-ng/qgspointdisplacementrenderer.h

+2-3
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,8 @@ class CORE_EXPORT QgsPointDisplacementRenderer: public QgsFeatureRendererV2
9595
void setLabelAttributeName( const QString& name ) { mLabelAttributeName = name; }
9696
QString labelAttributeName() const { return mLabelAttributeName; }
9797

98-
/** Sets embedded renderer (takes ownership)*/
99-
void setEmbeddedRenderer( QgsFeatureRendererV2* r );
100-
QgsFeatureRendererV2* embeddedRenderer() const { return mRenderer;}
98+
void setEmbeddedRenderer( QgsFeatureRendererV2* r ) override;
99+
const QgsFeatureRendererV2* embeddedRenderer() const override;
101100

102101
//! not available in python bindings
103102
//! @deprecated since 2.4

src/core/symbology-ng/qgsrendererv2.h

+15
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,21 @@ class CORE_EXPORT QgsFeatureRendererV2
413413
*/
414414
void setOrderByEnabled( bool enabled );
415415

416+
/** Sets an embedded renderer (subrenderer) for this feature renderer. The base class implementation
417+
* does nothing with subrenderers, but individual derived classes can use these to modify their behaviour.
418+
* @param subRenderer the embedded renderer. Ownership will be transferred.
419+
* @see embeddedRenderer()
420+
* @note added in QGIS 2.16
421+
*/
422+
virtual void setEmbeddedRenderer( QgsFeatureRendererV2* subRenderer ) { delete subRenderer; }
423+
424+
/** Returns the current embedded renderer (subrenderer) for this feature renderer. The base class
425+
* implementation does not use subrenderers and will always return null.
426+
* @see setEmbeddedRenderer()
427+
* @note added in QGIS 2.16
428+
*/
429+
virtual const QgsFeatureRendererV2* embeddedRenderer() const { return nullptr; }
430+
416431
protected:
417432
QgsFeatureRendererV2( const QString& type );
418433

0 commit comments

Comments
 (0)