From 07111661b0ff49ac5a63f65279515d94e687ef84 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Tue, 21 Sep 2021 16:34:41 +1000 Subject: [PATCH] Fix color customisation is lost when configuring renderers using geometry generators Fixes #38377 --- .../qgsgeometrygeneratorsymbollayer.sip.in | 6 ++++ .../qgsgeometrygeneratorsymbollayer.cpp | 33 +++++++++++++++++++ .../qgsgeometrygeneratorsymbollayer.h | 3 ++ .../test_qgsgeometrygeneratorsymbollayer.py | 11 +++++++ 4 files changed, 53 insertions(+) diff --git a/python/core/auto_generated/symbology/qgsgeometrygeneratorsymbollayer.sip.in b/python/core/auto_generated/symbology/qgsgeometrygeneratorsymbollayer.sip.in index 9de6e8960e58..7f74022b4864 100644 --- a/python/core/auto_generated/symbology/qgsgeometrygeneratorsymbollayer.sip.in +++ b/python/core/auto_generated/symbology/qgsgeometrygeneratorsymbollayer.sip.in @@ -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/; diff --git a/src/core/symbology/qgsgeometrygeneratorsymbollayer.cpp b/src/core/symbology/qgsgeometrygeneratorsymbollayer.cpp index 87248de6771b..903f657fc1e6 100644 --- a/src/core/symbology/qgsgeometrygeneratorsymbollayer.cpp +++ b/src/core/symbology/qgsgeometrygeneratorsymbollayer.cpp @@ -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() ); diff --git a/src/core/symbology/qgsgeometrygeneratorsymbollayer.h b/src/core/symbology/qgsgeometrygeneratorsymbollayer.h index 5cc3174999ac..9e3b0bac28fa 100644 --- a/src/core/symbology/qgsgeometrygeneratorsymbollayer.h +++ b/src/core/symbology/qgsgeometrygeneratorsymbollayer.h @@ -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; diff --git a/tests/src/python/test_qgsgeometrygeneratorsymbollayer.py b/tests/src/python/test_qgsgeometrygeneratorsymbollayer.py index 9b30c2a7d15d..1943dad56777 100644 --- a/tests/src/python/test_qgsgeometrygeneratorsymbollayer.py +++ b/tests/src/python/test_qgsgeometrygeneratorsymbollayer.py @@ -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)'})