[categorized][graduated] Handle categorized<->graduated renderer conversion

(fixes #31633)
This commit is contained in:
nirvn 2019-09-20 12:01:09 +07:00 committed by Mathieu Pellerin
parent f21e03c5ef
commit 531e1b0715
6 changed files with 105 additions and 12 deletions

View File

@ -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.

View File

@ -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.

View File

@ -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<QgsCategorizedSymbolRenderer *>( renderer->clone() );
r.reset( static_cast<QgsCategorizedSymbolRenderer *>( renderer->clone() ) );
}
else if ( renderer->type() == QLatin1String( "graduatedSymbol" ) )
{
const QgsGraduatedSymbolRenderer *graduatedSymbolRenderer = dynamic_cast<const QgsGraduatedSymbolRenderer *>( 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<const QgsPointDistanceRenderer *>( renderer );
if ( pointDistanceRenderer )
r = convertFromRenderer( pointDistanceRenderer->embeddedRenderer() );
r.reset( convertFromRenderer( pointDistanceRenderer->embeddedRenderer() ) );
}
else if ( renderer->type() == QLatin1String( "invertedPolygonRenderer" ) )
{
const QgsInvertedPolygonRenderer *invertedPolygonRenderer = dynamic_cast<const QgsInvertedPolygonRenderer *>( 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<QgsFeatureRenderer *>( 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 )

View File

@ -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

View File

@ -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<QgsGraduatedSymbolRenderer *>( renderer->clone() );
r.reset( static_cast<QgsGraduatedSymbolRenderer *>( renderer->clone() ) );
}
else if ( renderer->type() == QLatin1String( "categorizedSymbol" ) )
{
const QgsCategorizedSymbolRenderer *categorizedSymbolRenderer = dynamic_cast<const QgsCategorizedSymbolRenderer *>( renderer );
if ( categorizedSymbolRenderer )
{
r = qgis::make_unique< QgsGraduatedSymbolRenderer >( QString(), QgsRangeList() );
r->setSourceSymbol( categorizedSymbolRenderer->sourceSymbol()->clone() );
if ( categorizedSymbolRenderer->sourceColorRamp() )
{
bool isRandom = dynamic_cast<const QgsRandomColorRamp *>( categorizedSymbolRenderer->sourceColorRamp() ) ||
dynamic_cast<const QgsLimitedRandomColorRamp *>( 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<const QgsPointDistanceRenderer *>( renderer );
if ( pointDistanceRenderer )
r = convertFromRenderer( pointDistanceRenderer->embeddedRenderer() );
r.reset( convertFromRenderer( pointDistanceRenderer->embeddedRenderer() ) );
}
else if ( renderer->type() == QLatin1String( "invertedPolygonRenderer" ) )
{
const QgsInvertedPolygonRenderer *invertedPolygonRenderer = dynamic_cast<const QgsInvertedPolygonRenderer *>( 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<QgsFeatureRenderer *>( 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 )

View File

@ -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