Skip to content

Commit a1e1614

Browse files
committedJun 30, 2016
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 (cherry-picked from b32afce)
1 parent 0a93bdd commit a1e1614

9 files changed

+82
-30
lines changed
 

‎python/core/symbology-ng/qgsinvertedpolygonrenderer.sip

Lines changed: 5 additions & 8 deletions
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

Lines changed: 0 additions & 1 deletion
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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,21 @@ class QgsFeatureRendererV2
384384
*/
385385
void setOrderByEnabled( bool enabled );
386386

387+
/** Sets an embedded renderer (subrenderer) for this feature renderer. The base class implementation
388+
* does nothing with subrenderers, but individual derived classes can use these to modify their behaviour.
389+
* @param subRenderer the embedded renderer. Ownership will be transferred.
390+
* @see embeddedRenderer()
391+
* @note added in QGIS 2.16
392+
*/
393+
virtual void setEmbeddedRenderer( QgsFeatureRendererV2* subRenderer /Transfer/ );
394+
395+
/** Returns the current embedded renderer (subrenderer) for this feature renderer. The base class
396+
* implementation does not use subrenderers and will always return null.
397+
* @see setEmbeddedRenderer()
398+
* @note added in QGIS 2.16
399+
*/
400+
virtual const QgsFeatureRendererV2* embeddedRenderer() const;
401+
387402
protected:
388403
QgsFeatureRendererV2( const QString& type );
389404

‎src/app/qgsapplayertreeviewmenuprovider.cpp

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,11 @@ QMenu* QgsAppLayerTreeViewMenuProvider::createContextMenu()
129129

130130
if ( vlayer )
131131
{
132-
QgsSingleSymbolRendererV2* singleRenderer = dynamic_cast< QgsSingleSymbolRendererV2* >( vlayer->rendererV2() );
132+
const QgsSingleSymbolRendererV2* singleRenderer = dynamic_cast< const QgsSingleSymbolRendererV2* >( vlayer->rendererV2() );
133+
if ( !singleRenderer && vlayer->rendererV2()->embeddedRenderer() )
134+
{
135+
singleRenderer = dynamic_cast< const QgsSingleSymbolRendererV2* >( vlayer->rendererV2()->embeddedRenderer() );
136+
}
133137
if ( singleRenderer && singleRenderer->symbol() )
134138
{
135139
//single symbol renderer, so add set color/edit symbol actions
@@ -488,12 +492,34 @@ void QgsAppLayerTreeViewMenuProvider::setVectorSymbolColor( const QColor& color
488492
return;
489493

490494
QgsSingleSymbolRendererV2* singleRenderer = dynamic_cast< QgsSingleSymbolRendererV2* >( layer->rendererV2() );
491-
if ( !singleRenderer || !singleRenderer->symbol() )
495+
QgsSymbolV2* newSymbol = nullptr;
496+
497+
if ( singleRenderer && singleRenderer->symbol() )
498+
newSymbol = singleRenderer->symbol()->clone();
499+
500+
const QgsSingleSymbolRendererV2* embeddedRenderer = nullptr;
501+
if ( !newSymbol && layer->rendererV2()->embeddedRenderer() )
502+
{
503+
embeddedRenderer = dynamic_cast< const QgsSingleSymbolRendererV2* >( layer->rendererV2()->embeddedRenderer() );
504+
if ( embeddedRenderer && embeddedRenderer->symbol() )
505+
newSymbol = embeddedRenderer->symbol()->clone();
506+
}
507+
508+
if ( !newSymbol )
492509
return;
493510

494-
QgsSymbolV2* newSymbol = singleRenderer->symbol()->clone();
495511
newSymbol->setColor( color );
496-
singleRenderer->setSymbol( newSymbol );
512+
if ( singleRenderer )
513+
{
514+
singleRenderer->setSymbol( newSymbol );
515+
}
516+
else if ( embeddedRenderer )
517+
{
518+
QgsSingleSymbolRendererV2* newRenderer = embeddedRenderer->clone();
519+
newRenderer->setSymbol( newSymbol );
520+
layer->rendererV2()->setEmbeddedRenderer( newRenderer );
521+
}
522+
497523
layer->triggerRepaint();
498524
mView->refreshLayerSymbology( layer->id() );
499525
}

‎src/core/symbology-ng/qgsinvertedpolygonrenderer.cpp

Lines changed: 4 additions & 5 deletions
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

Lines changed: 6 additions & 9 deletions
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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,11 @@ void QgsPointDisplacementRenderer::setEmbeddedRenderer( QgsFeatureRendererV2* r
221221
mRenderer = r;
222222
}
223223

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

‎src/core/symbology-ng/qgspointdisplacementrenderer.h

Lines changed: 2 additions & 3 deletions
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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,21 @@ class CORE_EXPORT QgsFeatureRendererV2
405405
*/
406406
void setOrderByEnabled( bool enabled );
407407

408+
/** Sets an embedded renderer (subrenderer) for this feature renderer. The base class implementation
409+
* does nothing with subrenderers, but individual derived classes can use these to modify their behaviour.
410+
* @param subRenderer the embedded renderer. Ownership will be transferred.
411+
* @see embeddedRenderer()
412+
* @note added in QGIS 2.16
413+
*/
414+
virtual void setEmbeddedRenderer( QgsFeatureRendererV2* subRenderer ) { delete subRenderer; }
415+
416+
/** Returns the current embedded renderer (subrenderer) for this feature renderer. The base class
417+
* implementation does not use subrenderers and will always return null.
418+
* @see setEmbeddedRenderer()
419+
* @note added in QGIS 2.16
420+
*/
421+
virtual const QgsFeatureRendererV2* embeddedRenderer() const { return nullptr; }
422+
408423
protected:
409424
QgsFeatureRendererV2( const QString& type );
410425

0 commit comments

Comments
 (0)
Please sign in to comment.