diff --git a/python/core/auto_generated/symbology/qgscategorizedsymbolrenderer.sip.in b/python/core/auto_generated/symbology/qgscategorizedsymbolrenderer.sip.in index f44dc33f675..c8a632736c9 100644 --- a/python/core/auto_generated/symbology/qgscategorizedsymbolrenderer.sip.in +++ b/python/core/auto_generated/symbology/qgscategorizedsymbolrenderer.sip.in @@ -336,6 +336,7 @@ the categories' color. .. seealso:: :py:func:`sourceColorRamp` %End + void setSourceSymbol( QgsSymbol *sym /Transfer/ ); %Docstring Sets the source symbol for the renderer, which is the base symbol used for the each categories' symbol before applying @@ -357,6 +358,7 @@ Returns the source color ramp, from which each categories' color is derived. .. seealso:: :py:func:`sourceSymbol` %End + void setSourceColorRamp( QgsColorRamp *ramp /Transfer/ ); %Docstring Sets the source color ramp. diff --git a/python/core/auto_generated/symbology/qgsgraduatedsymbolrenderer.sip.in b/python/core/auto_generated/symbology/qgsgraduatedsymbolrenderer.sip.in index 9f9f10deebf..6ebcd571120 100644 --- a/python/core/auto_generated/symbology/qgsgraduatedsymbolrenderer.sip.in +++ b/python/core/auto_generated/symbology/qgsgraduatedsymbolrenderer.sip.in @@ -347,6 +347,7 @@ the classes' color. .. seealso:: :py:func:`sourceColorRamp` %End + void setSourceSymbol( QgsSymbol *sym /Transfer/ ); %Docstring Sets the source symbol for the renderer, which is the base symbol used for the each classes' symbol before applying @@ -368,6 +369,7 @@ Returns the source color ramp, from which each classes' color is derived. .. seealso:: :py:func:`sourceSymbol` %End + void setSourceColorRamp( QgsColorRamp *ramp /Transfer/ ); %Docstring Sets the source color ramp. diff --git a/src/core/symbology/qgscategorizedsymbolrenderer.cpp b/src/core/symbology/qgscategorizedsymbolrenderer.cpp index 690c43e52da..5f5ec683110 100644 --- a/src/core/symbology/qgscategorizedsymbolrenderer.cpp +++ b/src/core/symbology/qgscategorizedsymbolrenderer.cpp @@ -20,6 +20,7 @@ #include "qgssymbol.h" #include "qgssymbollayerutils.h" #include "qgscolorramp.h" +#include "qgsgraduatedsymbolrenderer.h" #include "qgspointdisplacementrenderer.h" #include "qgsinvertedpolygonrenderer.h" #include "qgspainteffect.h" @@ -953,6 +954,12 @@ QgsSymbol *QgsCategorizedSymbolRenderer::sourceSymbol() { return mSourceSymbol.get(); } + +const QgsSymbol *QgsCategorizedSymbolRenderer::sourceSymbol() const +{ + return mSourceSymbol.get(); +} + void QgsCategorizedSymbolRenderer::setSourceSymbol( QgsSymbol *sym ) { mSourceSymbol.reset( sym ); @@ -963,6 +970,11 @@ QgsColorRamp *QgsCategorizedSymbolRenderer::sourceColorRamp() return mSourceColorRamp.get(); } +const QgsColorRamp *QgsCategorizedSymbolRenderer::sourceColorRamp() const +{ + return mSourceColorRamp.get(); +} + void QgsCategorizedSymbolRenderer::setSourceColorRamp( QgsColorRamp *ramp ) { mSourceColorRamp.reset( ramp ); @@ -1038,22 +1050,36 @@ void QgsCategorizedSymbolRenderer::checkLegendSymbolItem( const QString &key, bo QgsCategorizedSymbolRenderer *QgsCategorizedSymbolRenderer::convertFromRenderer( const QgsFeatureRenderer *renderer ) { - QgsCategorizedSymbolRenderer *r = nullptr; + std::unique_ptr< QgsCategorizedSymbolRenderer > r; if ( renderer->type() == QLatin1String( "categorizedSymbol" ) ) { - r = dynamic_cast( renderer->clone() ); + r.reset( static_cast( renderer->clone() ) ); + } + else if ( renderer->type() == QLatin1String( "graduatedSymbol" ) ) + { + const QgsGraduatedSymbolRenderer *graduatedSymbolRenderer = dynamic_cast( renderer ); + if ( graduatedSymbolRenderer ) + { + r.reset( new QgsCategorizedSymbolRenderer( QString(), QgsCategoryList() ) ); + r->setSourceSymbol( graduatedSymbolRenderer->sourceSymbol()->clone() ); + if ( graduatedSymbolRenderer->sourceColorRamp() ) + { + r->setSourceColorRamp( graduatedSymbolRenderer->sourceColorRamp()->clone() ); + } + r->setClassAttribute( graduatedSymbolRenderer->classAttribute() ); + } } else if ( renderer->type() == QLatin1String( "pointDisplacement" ) || renderer->type() == QLatin1String( "pointCluster" ) ) { const QgsPointDistanceRenderer *pointDistanceRenderer = dynamic_cast( renderer ); if ( pointDistanceRenderer ) - r = convertFromRenderer( pointDistanceRenderer->embeddedRenderer() ); + r.reset( convertFromRenderer( pointDistanceRenderer->embeddedRenderer() ) ); } else if ( renderer->type() == QLatin1String( "invertedPolygonRenderer" ) ) { const QgsInvertedPolygonRenderer *invertedPolygonRenderer = dynamic_cast( renderer ); if ( invertedPolygonRenderer ) - r = convertFromRenderer( invertedPolygonRenderer->embeddedRenderer() ); + r.reset( convertFromRenderer( invertedPolygonRenderer->embeddedRenderer() ) ); } // If not one of the specifically handled renderers, then just grab the symbol from the renderer @@ -1061,7 +1087,7 @@ QgsCategorizedSymbolRenderer *QgsCategorizedSymbolRenderer::convertFromRenderer( if ( !r ) { - r = new QgsCategorizedSymbolRenderer( QString(), QgsCategoryList() ); + r = qgis::make_unique< QgsCategorizedSymbolRenderer >( QString(), QgsCategoryList() ); QgsRenderContext context; QgsSymbolList symbols = const_cast( renderer )->symbols( context ); if ( !symbols.isEmpty() ) @@ -1073,7 +1099,7 @@ QgsCategorizedSymbolRenderer *QgsCategorizedSymbolRenderer::convertFromRenderer( r->setOrderBy( renderer->orderBy() ); r->setOrderByEnabled( renderer->orderByEnabled() ); - return r; + return r.release(); } void QgsCategorizedSymbolRenderer::setDataDefinedSizeLegend( QgsDataDefinedSizeLegend *settings ) diff --git a/src/core/symbology/qgscategorizedsymbolrenderer.h b/src/core/symbology/qgscategorizedsymbolrenderer.h index 74b8bf9d1a8..ce6e287fb36 100644 --- a/src/core/symbology/qgscategorizedsymbolrenderer.h +++ b/src/core/symbology/qgscategorizedsymbolrenderer.h @@ -323,6 +323,15 @@ class CORE_EXPORT QgsCategorizedSymbolRenderer : public QgsFeatureRenderer */ QgsSymbol *sourceSymbol(); + /** + * Returns the renderer's source symbol, which is the base symbol used for the each categories' symbol before applying + * the categories' color. + * \see setSourceSymbol() + * \see sourceColorRamp() + * \note Not available in Python bindings. + */ + const QgsSymbol *sourceSymbol() const SIP_SKIP; + /** * Sets the source symbol for the renderer, which is the base symbol used for the each categories' symbol before applying * the categories' color. @@ -339,6 +348,14 @@ class CORE_EXPORT QgsCategorizedSymbolRenderer : public QgsFeatureRenderer */ QgsColorRamp *sourceColorRamp(); + /** + * Returns the source color ramp, from which each categories' color is derived. + * \see setSourceColorRamp() + * \see sourceSymbol() + * \note Not available in Python bindings. + */ + const QgsColorRamp *sourceColorRamp() const SIP_SKIP; + /** * Sets the source color ramp. * \param ramp color ramp. Ownership is transferred to the renderer diff --git a/src/core/symbology/qgsgraduatedsymbolrenderer.cpp b/src/core/symbology/qgsgraduatedsymbolrenderer.cpp index 4a61fa943c6..8fd0e8df4d6 100644 --- a/src/core/symbology/qgsgraduatedsymbolrenderer.cpp +++ b/src/core/symbology/qgsgraduatedsymbolrenderer.cpp @@ -21,6 +21,7 @@ #include "qgsgraduatedsymbolrenderer.h" #include "qgsattributes.h" +#include "qgscategorizedsymbolrenderer.h" #include "qgscolorramp.h" #include "qgsdatadefinedsizelegend.h" #include "qgsexpression.h" @@ -795,6 +796,12 @@ QgsSymbol *QgsGraduatedSymbolRenderer::sourceSymbol() { return mSourceSymbol.get(); } + +const QgsSymbol *QgsGraduatedSymbolRenderer::sourceSymbol() const +{ + return mSourceSymbol.get(); +} + void QgsGraduatedSymbolRenderer::setSourceSymbol( QgsSymbol *sym ) { mSourceSymbol.reset( sym ); @@ -805,6 +812,11 @@ QgsColorRamp *QgsGraduatedSymbolRenderer::sourceColorRamp() return mSourceColorRamp.get(); } +const QgsColorRamp *QgsGraduatedSymbolRenderer::sourceColorRamp() const +{ + return mSourceColorRamp.get(); +} + void QgsGraduatedSymbolRenderer::setSourceColorRamp( QgsColorRamp *ramp ) { if ( ramp == mSourceColorRamp.get() ) @@ -1208,22 +1220,39 @@ void QgsGraduatedSymbolRenderer::setAstride( bool astride ) SIP_DEPRECATED QgsGraduatedSymbolRenderer *QgsGraduatedSymbolRenderer::convertFromRenderer( const QgsFeatureRenderer *renderer ) { - QgsGraduatedSymbolRenderer *r = nullptr; + std::unique_ptr< QgsGraduatedSymbolRenderer > r; if ( renderer->type() == QLatin1String( "graduatedSymbol" ) ) { - r = dynamic_cast( renderer->clone() ); + r.reset( static_cast( renderer->clone() ) ); + } + else if ( renderer->type() == QLatin1String( "categorizedSymbol" ) ) + { + const QgsCategorizedSymbolRenderer *categorizedSymbolRenderer = dynamic_cast( renderer ); + if ( categorizedSymbolRenderer ) + { + r = qgis::make_unique< QgsGraduatedSymbolRenderer >( QString(), QgsRangeList() ); + r->setSourceSymbol( categorizedSymbolRenderer->sourceSymbol()->clone() ); + if ( categorizedSymbolRenderer->sourceColorRamp() ) + { + bool isRandom = dynamic_cast( categorizedSymbolRenderer->sourceColorRamp() ) || + dynamic_cast( categorizedSymbolRenderer->sourceColorRamp() ); + if ( !isRandom ) + r->setSourceColorRamp( categorizedSymbolRenderer->sourceColorRamp()->clone() ); + } + r->setClassAttribute( categorizedSymbolRenderer->classAttribute() ); + } } else if ( renderer->type() == QLatin1String( "pointDisplacement" ) || renderer->type() == QLatin1String( "pointCluster" ) ) { const QgsPointDistanceRenderer *pointDistanceRenderer = dynamic_cast( renderer ); if ( pointDistanceRenderer ) - r = convertFromRenderer( pointDistanceRenderer->embeddedRenderer() ); + r.reset( convertFromRenderer( pointDistanceRenderer->embeddedRenderer() ) ); } else if ( renderer->type() == QLatin1String( "invertedPolygonRenderer" ) ) { const QgsInvertedPolygonRenderer *invertedPolygonRenderer = dynamic_cast( renderer ); if ( invertedPolygonRenderer ) - r = convertFromRenderer( invertedPolygonRenderer->embeddedRenderer() ); + r.reset( convertFromRenderer( invertedPolygonRenderer->embeddedRenderer() ) ); } // If not one of the specifically handled renderers, then just grab the symbol from the renderer @@ -1231,7 +1260,7 @@ QgsGraduatedSymbolRenderer *QgsGraduatedSymbolRenderer::convertFromRenderer( con if ( !r ) { - r = new QgsGraduatedSymbolRenderer( QString(), QgsRangeList() ); + r = qgis::make_unique< QgsGraduatedSymbolRenderer >( QString(), QgsRangeList() ); QgsRenderContext context; QgsSymbolList symbols = const_cast( renderer )->symbols( context ); if ( !symbols.isEmpty() ) @@ -1243,7 +1272,7 @@ QgsGraduatedSymbolRenderer *QgsGraduatedSymbolRenderer::convertFromRenderer( con r->setOrderBy( renderer->orderBy() ); r->setOrderByEnabled( renderer->orderByEnabled() ); - return r; + return r.release(); } void QgsGraduatedSymbolRenderer::setDataDefinedSizeLegend( QgsDataDefinedSizeLegend *settings ) diff --git a/src/core/symbology/qgsgraduatedsymbolrenderer.h b/src/core/symbology/qgsgraduatedsymbolrenderer.h index c25019c04b0..ef1eb1160f0 100644 --- a/src/core/symbology/qgsgraduatedsymbolrenderer.h +++ b/src/core/symbology/qgsgraduatedsymbolrenderer.h @@ -300,6 +300,15 @@ class CORE_EXPORT QgsGraduatedSymbolRenderer : public QgsFeatureRenderer */ QgsSymbol *sourceSymbol(); + /** + * Returns the renderer's source symbol, which is the base symbol used for the each classes' symbol before applying + * the classes' color. + * \see setSourceSymbol() + * \see sourceColorRamp() + * \note Not available in Python bindings. + */ + const QgsSymbol *sourceSymbol() const SIP_SKIP; + /** * Sets the source symbol for the renderer, which is the base symbol used for the each classes' symbol before applying * the classes' color. @@ -316,6 +325,14 @@ class CORE_EXPORT QgsGraduatedSymbolRenderer : public QgsFeatureRenderer */ QgsColorRamp *sourceColorRamp(); + /** + * Returns the source color ramp, from which each classes' color is derived. + * \see setSourceColorRamp() + * \see sourceSymbol() + * \note Not available in Python bindings. + */ + const QgsColorRamp *sourceColorRamp() const SIP_SKIP; + /** * Sets the source color ramp. * \param ramp color ramp. Ownership is transferred to the renderer