Skip to content

Commit

Permalink
Merge pull request #1556 from leyan/convertToRuleBasedSymbology
Browse files Browse the repository at this point in the history
[FEATURE] Keep renderer settings when changing renderer type (where it is possible)
  • Loading branch information
wonder-sk committed Sep 13, 2014
2 parents 2313be9 + ced5ae4 commit c3db6d0
Show file tree
Hide file tree
Showing 29 changed files with 419 additions and 83 deletions.
7 changes: 6 additions & 1 deletion python/core/symbology-ng/qgscategorizedsymbolrendererv2.sip
Expand Up @@ -55,7 +55,7 @@ class QgsCategorizedSymbolRendererV2 : QgsFeatureRendererV2

virtual QString dump() const;

virtual QgsFeatureRendererV2* clone() /Factory/;
virtual QgsFeatureRendererV2* clone() const /Factory/;

virtual void toSld( QDomDocument& doc, QDomElement &element ) const;

Expand Down Expand Up @@ -147,6 +147,11 @@ class QgsCategorizedSymbolRendererV2 : QgsFeatureRendererV2
// @note added in 2.5
virtual void checkLegendSymbolItem( QString key, bool state = true );

//! creates a QgsCategorizedSymbolRendererV2 from an existing renderer.
//! @note added in 2.5
//! @returns a new renderer if the conversion was possible, otherwise 0.
static QgsCategorizedSymbolRendererV2* convertFromRenderer( const QgsFeatureRendererV2 *renderer ) /Factory/;

protected:
void rebuildHash();

Expand Down
7 changes: 5 additions & 2 deletions python/core/symbology-ng/qgsgraduatedsymbolrendererv2.sip
Expand Up @@ -59,7 +59,7 @@ class QgsGraduatedSymbolRendererV2 : QgsFeatureRendererV2

virtual QString dump() const;

virtual QgsFeatureRendererV2* clone() /Factory/;
virtual QgsFeatureRendererV2* clone() const /Factory/;

virtual void toSld( QDomDocument& doc, QDomElement &element ) const;

Expand Down Expand Up @@ -173,7 +173,10 @@ class QgsGraduatedSymbolRendererV2 : QgsFeatureRendererV2
// @note added in 2.5
virtual void checkLegendSymbolItem( QString key, bool state = true );


//! creates a QgsGraduatedSymbolRendererV2 from an existing renderer.
//! @note added in 2.5
//! @returns a new renderer if the conversion was possible, otherwise 0.
static QgsGraduatedSymbolRendererV2* convertFromRenderer( const QgsFeatureRendererV2 *renderer ) /Factory/;

protected:
QgsSymbolV2* symbolForValue( double value );
Expand Down
8 changes: 7 additions & 1 deletion python/core/symbology-ng/qgsinvertedpolygonrenderer.sip
Expand Up @@ -12,7 +12,7 @@ class QgsInvertedPolygonRenderer : QgsFeatureRendererV2
virtual ~QgsInvertedPolygonRenderer();

/** Used to clone this feature renderer.*/
virtual QgsFeatureRendererV2* clone() /Factory/;
virtual QgsFeatureRendererV2* clone() const /Factory/;

virtual void startRender( QgsRenderContext& context, const QgsFields& fields );

Expand Down Expand Up @@ -81,4 +81,10 @@ class QgsInvertedPolygonRenderer : QgsFeatureRendererV2
This will involve some CPU-demanding computations and is thus disabled by default.
*/
void setPreprocessingEnabled( bool enabled );

/** creates a QgsInvertedPolygonRenderer by a conversion from an existing renderer.
@note added in 2.5
@returns a new renderer if the conversion was possible, otherwise 0.
*/
static QgsInvertedPolygonRenderer* convertFromRenderer( const QgsFeatureRendererV2* renderer ) /Factory/;
};
7 changes: 6 additions & 1 deletion python/core/symbology-ng/qgspointdisplacementrenderer.sip
Expand Up @@ -7,7 +7,7 @@ class QgsPointDisplacementRenderer : QgsFeatureRendererV2
QgsPointDisplacementRenderer( const QString& labelAttributeName = "" );
~QgsPointDisplacementRenderer();

QgsFeatureRendererV2* clone() /Factory/;
QgsFeatureRendererV2* clone() const /Factory/;

virtual void toSld( QDomDocument& doc, QDomElement &element ) const;

Expand Down Expand Up @@ -69,6 +69,11 @@ class QgsPointDisplacementRenderer : QgsFeatureRendererV2
void setTolerance( double t );
double tolerance() const;

//! creates a QgsPointDisplacementRenderer from an existing renderer.
//! @note added in 2.5
//! @returns a new renderer if the conversion was possible, otherwise 0.
static QgsPointDisplacementRenderer* convertFromRenderer(const QgsFeatureRendererV2 *renderer ) /Factory/;

private:
QgsPointDisplacementRenderer( const QgsPointDisplacementRenderer & );
QgsPointDisplacementRenderer & operator=( const QgsPointDisplacementRenderer & );
Expand Down
2 changes: 1 addition & 1 deletion python/core/symbology-ng/qgsrendererv2.sip
Expand Up @@ -71,7 +71,7 @@ class QgsFeatureRendererV2

virtual ~QgsFeatureRendererV2();

virtual QgsFeatureRendererV2* clone() = 0 /Factory/;
virtual QgsFeatureRendererV2* clone() const = 0 /Factory/;

virtual bool renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer = -1, bool selected = false, bool drawVertexMarker = false );

Expand Down
10 changes: 9 additions & 1 deletion python/core/symbology-ng/qgsrulebasedrendererv2.sip
Expand Up @@ -166,7 +166,7 @@ class QgsRuleBasedRendererV2 : QgsFeatureRendererV2

virtual QList<QString> usedAttributes();

virtual QgsFeatureRendererV2* clone() /Factory/;
virtual QgsFeatureRendererV2* clone() const /Factory/;

virtual void toSld( QDomDocument& doc, QDomElement &element ) const;

Expand Down Expand Up @@ -233,6 +233,14 @@ class QgsRuleBasedRendererV2 : QgsFeatureRendererV2
//! take a rule and create a list of new rules with intervals of scales given by the passed scale denominators
static void refineRuleScales( QgsRuleBasedRendererV2::Rule* initialRule, QList<int> scales );

//! creates a QgsRuleBasedRendererV2 from an existing renderer.
//! @note added in 2.5
//! @returns a new renderer if the conversion was possible, otherwise 0.
static QgsRuleBasedRendererV2* convertFromRenderer( const QgsFeatureRendererV2 *renderer ) /Factory/;

//! helper function to convert the size scale and rotation fields present in some other renderers to data defined symbology
static void convertToDataDefinedSymbology( QgsSymbolV2* symbol, QString sizeScaleField, QString rotationField );

private:
QgsRuleBasedRendererV2( const QgsRuleBasedRendererV2 & );
QgsRuleBasedRendererV2 & operator=( const QgsRuleBasedRendererV2 & );
Expand Down
7 changes: 6 additions & 1 deletion python/core/symbology-ng/qgssinglesymbolrendererv2.sip
Expand Up @@ -37,7 +37,7 @@ class QgsSingleSymbolRendererV2 : QgsFeatureRendererV2

virtual QString dump() const;

virtual QgsFeatureRendererV2* clone() /Factory/;
virtual QgsFeatureRendererV2* clone() const /Factory/;

virtual void toSld( QDomDocument& doc, QDomElement &element ) const;
static QgsFeatureRendererV2* createFromSld( QDomElement& element, QGis::GeometryType geomType );
Expand Down Expand Up @@ -66,6 +66,11 @@ class QgsSingleSymbolRendererV2 : QgsFeatureRendererV2
//! @note added in 2.6
virtual QgsLegendSymbolListV2 legendSymbolItemsV2() const;

//! creates a QgsSingleSymbolRendererV2 from an existing renderer.
//! @note added in 2.5
//! @returns a new renderer if the conversion was possible, otherwise 0.
static QgsSingleSymbolRendererV2* convertFromRenderer( const QgsFeatureRendererV2 *renderer ) /Factory/;

private:
QgsSingleSymbolRendererV2( const QgsSingleSymbolRendererV2 & );
QgsSingleSymbolRendererV2 & operator=( const QgsSingleSymbolRendererV2 & );
Expand Down
23 changes: 22 additions & 1 deletion src/core/symbology-ng/qgscategorizedsymbolrendererv2.cpp
Expand Up @@ -19,6 +19,8 @@
#include "qgssymbolv2.h"
#include "qgssymbollayerv2utils.h"
#include "qgsvectorcolorrampv2.h"
#include "qgspointdisplacementrenderer.h"
#include "qgsinvertedpolygonrenderer.h"

#include "qgsfeature.h"
#include "qgsvectorlayer.h"
Expand Down Expand Up @@ -462,7 +464,7 @@ QString QgsCategorizedSymbolRendererV2::dump() const
return s;
}

QgsFeatureRendererV2* QgsCategorizedSymbolRendererV2::clone()
QgsFeatureRendererV2* QgsCategorizedSymbolRendererV2::clone() const
{
QgsCategorizedSymbolRendererV2* r = new QgsCategorizedSymbolRendererV2( mAttrName, mCategories );
if ( mSourceSymbol.data() )
Expand Down Expand Up @@ -758,3 +760,22 @@ void QgsCategorizedSymbolRendererV2::checkLegendSymbolItem( QString key, bool st
}

QgsMarkerSymbolV2 QgsCategorizedSymbolRendererV2::sSkipRender;

QgsCategorizedSymbolRendererV2* QgsCategorizedSymbolRendererV2::convertFromRenderer( const QgsFeatureRendererV2 *renderer )
{
if ( renderer->type() == "categorizedSymbol" )
{
return dynamic_cast<QgsCategorizedSymbolRendererV2*>( renderer->clone() );
}
if ( renderer->type() == "pointDisplacement" )
{
const QgsPointDisplacementRenderer* pointDisplacementRenderer = dynamic_cast<const QgsPointDisplacementRenderer*>( renderer );
return convertFromRenderer( pointDisplacementRenderer->embeddedRenderer() );
}
if ( renderer->type() == "invertedPolygonRenderer" )
{
const QgsInvertedPolygonRenderer* invertedPolygonRenderer = dynamic_cast<const QgsInvertedPolygonRenderer*>( renderer );
return convertFromRenderer( invertedPolygonRenderer->embeddedRenderer() );
}
return 0;
}
9 changes: 7 additions & 2 deletions src/core/symbology-ng/qgscategorizedsymbolrendererv2.h
Expand Up @@ -85,7 +85,7 @@ class CORE_EXPORT QgsCategorizedSymbolRendererV2 : public QgsFeatureRendererV2

virtual QString dump() const;

virtual QgsFeatureRendererV2* clone();
virtual QgsFeatureRendererV2* clone() const;

virtual void toSld( QDomDocument& doc, QDomElement &element ) const;

Expand Down Expand Up @@ -166,7 +166,7 @@ class CORE_EXPORT QgsCategorizedSymbolRendererV2 : public QgsFeatureRendererV2
QgsSymbolV2::ScaleMethod scaleMethod() const { return mScaleMethod; }

//! items of symbology items in legend should be checkable
// @note added in 2.5
//! @note added in 2.5
virtual bool legendSymbolItemsCheckable() const;

//! item in symbology was checked
Expand All @@ -181,6 +181,11 @@ class CORE_EXPORT QgsCategorizedSymbolRendererV2 : public QgsFeatureRendererV2
//! @note added in 2.6
virtual QString legendClassificationAttribute() const { return classAttribute(); }

//! creates a QgsCategorizedSymbolRendererV2 from an existing renderer.
//! @note added in 2.5
//! @returns a new renderer if the conversion was possible, otherwise 0.
static QgsCategorizedSymbolRendererV2* convertFromRenderer( const QgsFeatureRendererV2 *renderer );

protected:
QString mAttrName;
QgsCategoryList mCategories;
Expand Down
22 changes: 21 additions & 1 deletion src/core/symbology-ng/qgsgraduatedsymbolrendererv2.cpp
Expand Up @@ -17,6 +17,8 @@
#include "qgssymbolv2.h"
#include "qgssymbollayerv2utils.h"
#include "qgsvectorcolorrampv2.h"
#include "qgspointdisplacementrenderer.h"
#include "qgsinvertedpolygonrenderer.h"

#include "qgsfeature.h"
#include "qgsvectorlayer.h"
Expand Down Expand Up @@ -357,7 +359,7 @@ QString QgsGraduatedSymbolRendererV2::dump() const
return s;
}

QgsFeatureRendererV2* QgsGraduatedSymbolRendererV2::clone()
QgsFeatureRendererV2* QgsGraduatedSymbolRendererV2::clone() const
{
QgsGraduatedSymbolRendererV2* r = new QgsGraduatedSymbolRendererV2( mAttrName, mRanges );
r->setMode( mMode );
Expand Down Expand Up @@ -1311,3 +1313,21 @@ void QgsGraduatedSymbolRendererV2::sortByLabel( Qt::SortOrder order )
}
}

QgsGraduatedSymbolRendererV2* QgsGraduatedSymbolRendererV2::convertFromRenderer( const QgsFeatureRendererV2 *renderer )
{
if ( renderer->type() == "graduatedSymbol" )
{
return dynamic_cast<QgsGraduatedSymbolRendererV2*>( renderer->clone() );
}
if ( renderer->type() == "pointDisplacement" )
{
const QgsPointDisplacementRenderer* pointDisplacementRenderer = dynamic_cast<const QgsPointDisplacementRenderer*>( renderer );
return convertFromRenderer( pointDisplacementRenderer->embeddedRenderer() );
}
if ( renderer->type() == "invertedPolygonRenderer" )
{
const QgsInvertedPolygonRenderer* invertedPolygonRenderer = dynamic_cast<const QgsInvertedPolygonRenderer*>( renderer );
return convertFromRenderer( invertedPolygonRenderer->embeddedRenderer() );
}
return 0;
}
13 changes: 9 additions & 4 deletions src/core/symbology-ng/qgsgraduatedsymbolrendererv2.h
Expand Up @@ -83,7 +83,7 @@ class CORE_EXPORT QgsGraduatedSymbolRendererV2 : public QgsFeatureRendererV2

virtual QString dump() const;

virtual QgsFeatureRendererV2* clone();
virtual QgsFeatureRendererV2* clone() const;

virtual void toSld( QDomDocument& doc, QDomElement &element ) const;

Expand All @@ -96,7 +96,7 @@ class CORE_EXPORT QgsGraduatedSymbolRendererV2 : public QgsFeatureRendererV2
QString classAttribute() const { return mAttrName; }
void setClassAttribute( QString attr ) { mAttrName = attr; }

const QgsRangeList& ranges() { return mRanges; }
const QgsRangeList& ranges() const { return mRanges; }

bool updateRangeSymbol( int rangeIndex, QgsSymbolV2* symbol );
bool updateRangeLabel( int rangeIndex, QString label );
Expand Down Expand Up @@ -168,7 +168,7 @@ class CORE_EXPORT QgsGraduatedSymbolRendererV2 : public QgsFeatureRendererV2
*/
void updateColorRamp( QgsVectorColorRampV2* ramp, bool inverted = false );

/** Update the all symbols but leave breaks and colors. */
/** Update all the symbols but leave breaks and colors. */
void updateSymbols( QgsSymbolV2* sym );

//! @note added in 1.6
Expand All @@ -187,7 +187,7 @@ class CORE_EXPORT QgsGraduatedSymbolRendererV2 : public QgsFeatureRendererV2
QgsSymbolV2::ScaleMethod scaleMethod() const { return mScaleMethod; }

//! items of symbology items in legend should be checkable
// @note added in 2.5
//! @note added in 2.5
virtual bool legendSymbolItemsCheckable() const;

//! item in symbology was checked
Expand All @@ -202,6 +202,11 @@ class CORE_EXPORT QgsGraduatedSymbolRendererV2 : public QgsFeatureRendererV2
//! @note added in 2.6
virtual QString legendClassificationAttribute() const { return classAttribute(); }

//! creates a QgsGraduatedSymbolRendererV2 from an existing renderer.
//! @note added in 2.5
//! @returns a new renderer if the conversion was possible, otherwise 0.
static QgsGraduatedSymbolRendererV2* convertFromRenderer( const QgsFeatureRendererV2 *renderer );

protected:
QString mAttrName;
QgsRangeList mRanges;
Expand Down
19 changes: 18 additions & 1 deletion src/core/symbology-ng/qgsinvertedpolygonrenderer.cpp
Expand Up @@ -325,7 +325,7 @@ QString QgsInvertedPolygonRenderer::dump() const
return "INVERTED [" + mSubRenderer->dump() + "]";
}

QgsFeatureRendererV2* QgsInvertedPolygonRenderer::clone()
QgsFeatureRendererV2* QgsInvertedPolygonRenderer::clone() const
{
QgsInvertedPolygonRenderer* newRenderer;
if ( mSubRenderer.isNull() )
Expand Down Expand Up @@ -440,3 +440,20 @@ bool QgsInvertedPolygonRenderer::willRenderFeature( QgsFeature& feat )
return mSubRenderer->willRenderFeature( feat );
}

QgsInvertedPolygonRenderer* QgsInvertedPolygonRenderer::convertFromRenderer( const QgsFeatureRendererV2 *renderer )
{
if ( renderer->type() == "invertedPolygonRenderer" )
{
return dynamic_cast<QgsInvertedPolygonRenderer*>( renderer->clone() );
}

if ( renderer->type() == "singleSymbol" ||
renderer->type() == "categorizedSymbol" ||
renderer->type() == "graduatedSymbol" ||
renderer->type() == "ruleRenderer" )
{
return new QgsInvertedPolygonRenderer( renderer->clone() );
}
return 0;
}

8 changes: 7 additions & 1 deletion src/core/symbology-ng/qgsinvertedpolygonrenderer.h
Expand Up @@ -48,7 +48,7 @@ class CORE_EXPORT QgsInvertedPolygonRenderer : public QgsFeatureRendererV2
virtual ~QgsInvertedPolygonRenderer();

/** Used to clone this feature renderer.*/
virtual QgsFeatureRendererV2* clone();
virtual QgsFeatureRendererV2* clone() const;

virtual void startRender( QgsRenderContext& context, const QgsFields& fields );

Expand Down Expand Up @@ -118,6 +118,12 @@ class CORE_EXPORT QgsInvertedPolygonRenderer : public QgsFeatureRendererV2
*/
void setPreprocessingEnabled( bool enabled ) { mPreprocessingEnabled = enabled; }

/** creates a QgsInvertedPolygonRenderer by a conversion from an existing renderer.
@note added in 2.5
@returns a new renderer if the conversion was possible, otherwise 0.
*/
static QgsInvertedPolygonRenderer* convertFromRenderer( const QgsFeatureRendererV2* renderer );

private:
/** Private copy constructor. @see clone() */
QgsInvertedPolygonRenderer( const QgsInvertedPolygonRenderer& );
Expand Down
20 changes: 19 additions & 1 deletion src/core/symbology-ng/qgspointdisplacementrenderer.cpp
Expand Up @@ -22,6 +22,7 @@
#include "qgssymbolv2.h"
#include "qgssymbollayerv2utils.h"
#include "qgsvectorlayer.h"
#include "qgssinglesymbolrendererv2.h"

#include <QDomElement>
#include <QPainter>
Expand Down Expand Up @@ -49,7 +50,7 @@ QgsPointDisplacementRenderer::~QgsPointDisplacementRenderer()
delete mRenderer;
}

QgsFeatureRendererV2* QgsPointDisplacementRenderer::clone()
QgsFeatureRendererV2* QgsPointDisplacementRenderer::clone() const
{
QgsPointDisplacementRenderer* r = new QgsPointDisplacementRenderer( mLabelAttributeName );
r->setEmbeddedRenderer( mRenderer->clone() );
Expand Down Expand Up @@ -517,4 +518,21 @@ QgsSymbolV2* QgsPointDisplacementRenderer::firstSymbolForFeature( QgsFeatureRend
return symbolList.at( 0 );
}

QgsPointDisplacementRenderer* QgsPointDisplacementRenderer::convertFromRenderer( const QgsFeatureRendererV2* renderer )
{
if ( renderer->type() == "pointDisplacement" )
{
return dynamic_cast<QgsPointDisplacementRenderer*>( renderer->clone() );
}

if ( renderer->type() == "singleSymbol" ||
renderer->type() == "categorizedSymbol" ||
renderer->type() == "graduatedSymbol" ||
renderer->type() == "ruleRenderer" )
{
QgsPointDisplacementRenderer* pointRenderer = new QgsPointDisplacementRenderer();
pointRenderer->setEmbeddedRenderer( renderer->clone() );
return pointRenderer;
}
return 0;
}

0 comments on commit c3db6d0

Please sign in to comment.