Skip to content

Commit

Permalink
Fix color customisation is lost when configuring renderers using
Browse files Browse the repository at this point in the history
geometry generators

Fixes #38377
  • Loading branch information
nyalldawson committed Sep 21, 2021
1 parent c2243a7 commit 0711166
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 0 deletions.
Expand Up @@ -52,6 +52,12 @@ that is created by this generator.

virtual bool usesMapUnits() const;

virtual QColor color() const;

virtual QgsUnitTypes::RenderUnit outputUnit() const;

virtual QgsMapUnitScale mapUnitScale() const;


virtual QgsSymbolLayer *clone() const /Factory/;

Expand Down
33 changes: 33 additions & 0 deletions src/core/symbology/qgsgeometrygeneratorsymbollayer.cpp
Expand Up @@ -124,6 +124,39 @@ bool QgsGeometryGeneratorSymbolLayer::usesMapUnits() const
return false;
}

QColor QgsGeometryGeneratorSymbolLayer::color() const
{
if ( mFillSymbol )
return mFillSymbol->color();
else if ( mLineSymbol )
return mLineSymbol->color();
else if ( mMarkerSymbol )
return mMarkerSymbol->color();
return QColor();
}

QgsUnitTypes::RenderUnit QgsGeometryGeneratorSymbolLayer::outputUnit() const
{
if ( mFillSymbol )
return mFillSymbol->outputUnit();
else if ( mLineSymbol )
return mLineSymbol->outputUnit();
else if ( mMarkerSymbol )
return mMarkerSymbol->outputUnit();
return QgsUnitTypes::RenderUnknownUnit;
}

QgsMapUnitScale QgsGeometryGeneratorSymbolLayer::mapUnitScale() const
{
if ( mFillSymbol )
return mFillSymbol->mapUnitScale();
else if ( mLineSymbol )
return mLineSymbol->mapUnitScale();
else if ( mMarkerSymbol )
return mMarkerSymbol->mapUnitScale();
return QgsMapUnitScale();
}

QgsSymbolLayer *QgsGeometryGeneratorSymbolLayer::clone() const
{
QgsGeometryGeneratorSymbolLayer *clone = new QgsGeometryGeneratorSymbolLayer( mExpression->expression() );
Expand Down
3 changes: 3 additions & 0 deletions src/core/symbology/qgsgeometrygeneratorsymbollayer.h
Expand Up @@ -59,6 +59,9 @@ class CORE_EXPORT QgsGeometryGeneratorSymbolLayer : public QgsSymbolLayer
void startFeatureRender( const QgsFeature &feature, QgsRenderContext &context ) override;
void stopFeatureRender( const QgsFeature &feature, QgsRenderContext &context ) override;
bool usesMapUnits() const override;
QColor color() const override;
QgsUnitTypes::RenderUnit outputUnit() const override;
QgsMapUnitScale mapUnitScale() const override;

QgsSymbolLayer *clone() const override SIP_FACTORY;

Expand Down
11 changes: 11 additions & 0 deletions tests/src/python/test_qgsgeometrygeneratorsymbollayer.py
Expand Up @@ -133,6 +133,17 @@ def test_properties_create(self):
self.assertEqual(layer2.units(), QgsUnitTypes.RenderMillimeters)
self.assertEqual(layer2.geometryExpression(), 'centroid($geometry)')

def test_color(self):
"""
Test that subsymbol color is returned for symbol layer
"""
sym_layer = QgsGeometryGeneratorSymbolLayer.create({'geometryModifier': 'buffer($geometry, 2)'})
sym_layer.setSymbolType(Qgis.SymbolType.Fill)
sym_layer.setUnits(QgsUnitTypes.RenderMillimeters)
sym_layer.subSymbol().symbolLayer(0).setColor(QColor(0, 255, 255))

self.assertEqual(sym_layer.color(), QColor(0, 255, 255))

def test_marker(self):
sym = self.polys_layer.renderer().symbol()
sym_layer = QgsGeometryGeneratorSymbolLayer.create({'geometryModifier': 'centroid($geometry)'})
Expand Down

0 comments on commit 0711166

Please sign in to comment.