Skip to content

Commit 4867b7f

Browse files
committedJul 4, 2014
[FEATURE][API] categorized render: support disabling rendering of some categories
Funded-By: norBIT
1 parent 6af7dbd commit 4867b7f

13 files changed

+243
-21
lines changed
 

‎python/core/layertree/qgslayertreelayer.sip

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ class QgsLayerTreeLayer : QgsLayerTreeNode
3737
Qt::CheckState isVisible() const;
3838
void setVisible( Qt::CheckState visible );
3939

40+
//! @note added in 2.5
41+
bool childrenCheckable() const;
42+
//! @note added in 2.5
43+
void setChildrenCheckable( bool checkable );
44+
4045
static QgsLayerTreeLayer* readXML( QDomElement& element ) /Factory/;
4146
virtual void writeXML( QDomElement& parentElement );
4247

@@ -50,5 +55,5 @@ class QgsLayerTreeLayer : QgsLayerTreeNode
5055

5156
private:
5257
QgsLayerTreeLayer( const QgsLayerTreeLayer& other );
53-
58+
5459
};

‎python/core/symbology-ng/qgscategorizedsymbolrendererv2.sip

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ class QgsRendererCategoryV2
66
public:
77

88
//! takes ownership of symbol
9-
QgsRendererCategoryV2( QVariant value, QgsSymbolV2* symbol /Transfer/, QString label );
9+
QgsRendererCategoryV2( QVariant value, QgsSymbolV2* symbol /Transfer/, QString label, bool render );
1010

1111
//! copy constructor
1212
QgsRendererCategoryV2( const QgsRendererCategoryV2& cat );
@@ -21,6 +21,10 @@ class QgsRendererCategoryV2
2121
void setSymbol( QgsSymbolV2* s /Transfer/ );
2222
void setLabel( const QString &label );
2323

24+
// @note added in 2.5
25+
bool renderState() const;
26+
void setRenderState( bool render );
27+
2428
// debugging
2529
QString dump() const;
2630

@@ -68,10 +72,17 @@ class QgsCategorizedSymbolRendererV2 : QgsFeatureRendererV2
6872
//! return index of category with specified value (-1 if not found)
6973
int categoryIndexForValue( QVariant val );
7074

75+
//! return index of category with specified label (-1 if not found or not unique)
76+
//! @note added in 2.5
77+
int categoryIndexForLabel( QString val );
78+
7179
bool updateCategoryValue( int catIndex, const QVariant &value );
7280
bool updateCategorySymbol( int catIndex, QgsSymbolV2* symbol /Transfer/ );
7381
bool updateCategoryLabel( int catIndex, QString label );
7482

83+
//! @note added in 2.5
84+
bool updateCategoryRenderState( int catIndex, bool render );
85+
7586
void addCategory( const QgsRendererCategoryV2 &category );
7687
bool deleteCategory( int catIndex );
7788
void deleteAllCategories();
@@ -124,6 +135,18 @@ class QgsCategorizedSymbolRendererV2 : QgsFeatureRendererV2
124135
//! @note added in 2.0
125136
QgsSymbolV2::ScaleMethod scaleMethod() const;
126137

138+
//! items of symbology items in legend should be checkable
139+
// @note added in 2.5
140+
virtual bool legendSymbolItemsCheckable() const;
141+
142+
//! item in symbology was checked
143+
// @note added in 2.5
144+
virtual bool legendSymbolItemChecked( QString key );
145+
146+
//! item in symbology was checked
147+
// @note added in 2.5
148+
virtual void checkLegendSymbolItem( QString key, bool state = true );
149+
127150
protected:
128151
void rebuildHash();
129152

‎python/core/symbology-ng/qgsrendererv2.sip

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,18 @@ class QgsFeatureRendererV2
127127
//! return a list of symbology items for the legend
128128
virtual QgsLegendSymbologyList legendSymbologyItems( QSize iconSize );
129129

130+
//! items of symbology items in legend should be checkable
131+
//! @node added in 2.5
132+
virtual bool legendSymbolItemsCheckable() const;
133+
134+
//! items of symbology items in legend is checked
135+
//! @node added in 2.5
136+
virtual bool legendSymbolItemChecked( QString key );
137+
138+
//! item in symbology was checked
139+
//! @node added in 2.5
140+
virtual void checkLegendSymbolItem( QString key, bool state = true );
141+
130142
//! return a list of item text / symbol
131143
//! @note: this method was added in version 1.5
132144
//! @note not available in python bindings

‎src/core/layertree/qgslayertreelayer.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ QgsLayerTreeLayer::QgsLayerTreeLayer( QgsMapLayer *layer )
2525
, mLayerId( layer->id() )
2626
, mLayer( layer )
2727
, mVisible( Qt::Checked )
28+
, mChildrenCheckable( false )
2829
{
2930
Q_ASSERT( QgsMapLayerRegistry::instance()->mapLayer( mLayerId ) == layer );
3031
}
@@ -35,6 +36,7 @@ QgsLayerTreeLayer::QgsLayerTreeLayer( QString layerId, QString name )
3536
, mLayerName( name )
3637
, mLayer( 0 )
3738
, mVisible( Qt::Checked )
39+
, mChildrenCheckable( false )
3840
{
3941
attachToLayer();
4042
}
@@ -45,6 +47,7 @@ QgsLayerTreeLayer::QgsLayerTreeLayer( const QgsLayerTreeLayer& other )
4547
, mLayerName( other.mLayerName )
4648
, mLayer( 0 )
4749
, mVisible( other.mVisible )
50+
, mChildrenCheckable( other.mChildrenCheckable )
4851
{
4952
attachToLayer();
5053
}

‎src/core/layertree/qgslayertreelayer.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ class CORE_EXPORT QgsLayerTreeLayer : public QgsLayerTreeNode
5757
Qt::CheckState isVisible() const { return mVisible; }
5858
void setVisible( Qt::CheckState visible );
5959

60+
//! @note added in 2.5
61+
bool childrenCheckable() const { return mChildrenCheckable; }
62+
//! @note added in 2.5
63+
void setChildrenCheckable( bool checkable ) { mChildrenCheckable = checkable; }
64+
6065
static QgsLayerTreeLayer* readXML( QDomElement& element );
6166
virtual void writeXML( QDomElement& parentElement );
6267

@@ -78,6 +83,7 @@ class CORE_EXPORT QgsLayerTreeLayer : public QgsLayerTreeNode
7883
QString mLayerName; // only used if layer does not exist
7984
QgsMapLayer* mLayer; // not owned! may be null
8085
Qt::CheckState mVisible;
86+
bool mChildrenCheckable;
8187
};
8288

8389

‎src/core/symbology-ng/qgscategorizedsymbolrendererv2.cpp

Lines changed: 66 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,17 +32,19 @@ QgsRendererCategoryV2::QgsRendererCategoryV2()
3232
{
3333
}
3434

35-
QgsRendererCategoryV2::QgsRendererCategoryV2( QVariant value, QgsSymbolV2* symbol, QString label )
35+
QgsRendererCategoryV2::QgsRendererCategoryV2( QVariant value, QgsSymbolV2* symbol, QString label, bool render )
3636
: mValue( value )
3737
, mSymbol( symbol )
3838
, mLabel( label )
39+
, mRender( render )
3940
{
4041
}
4142

4243
QgsRendererCategoryV2::QgsRendererCategoryV2( const QgsRendererCategoryV2& cat )
4344
: mValue( cat.mValue )
4445
, mSymbol( cat.mSymbol.data() ? cat.mSymbol->clone() : NULL )
4546
, mLabel( cat.mLabel )
47+
, mRender( cat.mRender )
4648
{
4749
}
4850

@@ -75,6 +77,11 @@ QString QgsRendererCategoryV2::label() const
7577
return mLabel;
7678
}
7779

80+
bool QgsRendererCategoryV2::renderState() const
81+
{
82+
return mRender;
83+
}
84+
7885
void QgsRendererCategoryV2::setValue( const QVariant &value )
7986
{
8087
mValue = value;
@@ -90,9 +97,14 @@ void QgsRendererCategoryV2::setLabel( const QString &label )
9097
mLabel = label;
9198
}
9299

100+
void QgsRendererCategoryV2::setRenderState( bool render )
101+
{
102+
mRender = render;
103+
}
104+
93105
QString QgsRendererCategoryV2::dump() const
94106
{
95-
return QString( "%1::%2::%3\n" ).arg( mValue.toString() ).arg( mLabel ).arg( mSymbol->dump() );
107+
return QString( "%1::%2::%3:%4\n" ).arg( mValue.toString() ).arg( mLabel ).arg( mSymbol->dump() ).arg( mRender );
96108
}
97109

98110
void QgsRendererCategoryV2::toSld( QDomDocument &doc, QDomElement &element, QgsStringMap props ) const
@@ -157,7 +169,7 @@ void QgsCategorizedSymbolRendererV2::rebuildHash()
157169
for ( int i = 0; i < mCategories.count(); ++i )
158170
{
159171
QgsRendererCategoryV2& cat = mCategories[i];
160-
mSymbolHash.insert( cat.value().toString(), cat.symbol() );
172+
mSymbolHash.insert( cat.value().toString(), cat.renderState() ? cat.symbol() : 0 );
161173
}
162174
}
163175

@@ -197,7 +209,7 @@ QgsSymbolV2* QgsCategorizedSymbolRendererV2::symbolForFeature( QgsFeature& featu
197209

198210
// find the right symbol for the category
199211
QgsSymbolV2* symbol = symbolForValue( value );
200-
if ( symbol == NULL )
212+
if ( !symbol )
201213
{
202214
// if no symbol found use default one
203215
return symbolForValue( QVariant( "" ) );
@@ -240,6 +252,22 @@ int QgsCategorizedSymbolRendererV2::categoryIndexForValue( QVariant val )
240252
return -1;
241253
}
242254

255+
int QgsCategorizedSymbolRendererV2::categoryIndexForLabel( QString val )
256+
{
257+
int idx = -1;
258+
for ( int i = 0; i < mCategories.count(); i++ )
259+
{
260+
if ( mCategories[i].label() == val )
261+
{
262+
if ( idx != -1 )
263+
return -1;
264+
else
265+
idx = i;
266+
}
267+
}
268+
return idx;
269+
}
270+
243271
bool QgsCategorizedSymbolRendererV2::updateCategoryValue( int catIndex, const QVariant &value )
244272
{
245273
if ( catIndex < 0 || catIndex >= mCategories.size() )
@@ -264,16 +292,23 @@ bool QgsCategorizedSymbolRendererV2::updateCategoryLabel( int catIndex, QString
264292
return true;
265293
}
266294

295+
bool QgsCategorizedSymbolRendererV2::updateCategoryRenderState( int catIndex, bool render )
296+
{
297+
if ( catIndex < 0 || catIndex >= mCategories.size() )
298+
return false;
299+
mCategories[catIndex].setRenderState( render );
300+
return true;
301+
}
302+
267303
void QgsCategorizedSymbolRendererV2::addCategory( const QgsRendererCategoryV2 &cat )
268304
{
269-
if ( cat.symbol() == NULL )
305+
if ( !cat.symbol() )
270306
{
271307
QgsDebugMsg( "invalid symbol in a category! ignoring..." );
308+
return;
272309
}
273-
else
274-
{
275-
mCategories.append( cat );
276-
}
310+
311+
mCategories.append( cat );
277312
}
278313

279314
bool QgsCategorizedSymbolRendererV2::deleteCategory( int catIndex )
@@ -486,10 +521,11 @@ QgsFeatureRendererV2* QgsCategorizedSymbolRendererV2::create( QDomElement& eleme
486521
QVariant value = QVariant( catElem.attribute( "value" ) );
487522
QString symbolName = catElem.attribute( "symbol" );
488523
QString label = catElem.attribute( "label" );
524+
bool render = catElem.attribute( "render" ) != "false";
489525
if ( symbolMap.contains( symbolName ) )
490526
{
491527
QgsSymbolV2* symbol = symbolMap.take( symbolName );
492-
cats.append( QgsRendererCategoryV2( value, symbol, label ) );
528+
cats.append( QgsRendererCategoryV2( value, symbol, label, render ) );
493529
}
494530
}
495531
catElem = catElem.nextSiblingElement();
@@ -561,6 +597,7 @@ QDomElement QgsCategorizedSymbolRendererV2::save( QDomDocument& doc )
561597
catElem.setAttribute( "value", cat.value().toString() );
562598
catElem.setAttribute( "symbol", symbolName );
563599
catElem.setAttribute( "label", cat.label() );
600+
catElem.setAttribute( "render", cat.renderState() ? "true" : "false" );
564601
catsElem.appendChild( catElem );
565602
i++;
566603
}
@@ -707,3 +744,22 @@ void QgsCategorizedSymbolRendererV2::setScaleMethod( QgsSymbolV2::ScaleMethod sc
707744
setScaleMethodToSymbol( catIt->symbol(), scaleMethod );
708745
}
709746
}
747+
748+
bool QgsCategorizedSymbolRendererV2::legendSymbolItemsCheckable() const
749+
{
750+
return true;
751+
}
752+
753+
bool QgsCategorizedSymbolRendererV2::legendSymbolItemChecked( QString key )
754+
{
755+
int idx = categoryIndexForLabel( key );
756+
return idx < 0 ? true : mCategories[ idx ].renderState();
757+
}
758+
759+
void QgsCategorizedSymbolRendererV2::checkLegendSymbolItem( QString key, bool state )
760+
{
761+
int idx = categoryIndexForLabel( key );
762+
if ( idx < 0 )
763+
return;
764+
updateCategoryRenderState( idx, state );
765+
}

‎src/core/symbology-ng/qgscategorizedsymbolrendererv2.h

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class CORE_EXPORT QgsRendererCategoryV2
3232
QgsRendererCategoryV2( );
3333

3434
//! takes ownership of symbol
35-
QgsRendererCategoryV2( QVariant value, QgsSymbolV2* symbol, QString label );
35+
QgsRendererCategoryV2( QVariant value, QgsSymbolV2* symbol, QString label, bool render );
3636

3737
//! copy constructor
3838
QgsRendererCategoryV2( const QgsRendererCategoryV2& cat );
@@ -47,6 +47,10 @@ class CORE_EXPORT QgsRendererCategoryV2
4747
void setSymbol( QgsSymbolV2* s );
4848
void setLabel( const QString &label );
4949

50+
// @note added in 2.5
51+
bool renderState() const;
52+
void setRenderState( bool render );
53+
5054
// debugging
5155
QString dump() const;
5256

@@ -56,6 +60,7 @@ class CORE_EXPORT QgsRendererCategoryV2
5660
QVariant mValue;
5761
QScopedPointer<QgsSymbolV2> mSymbol;
5862
QString mLabel;
63+
bool mRender;
5964

6065
void swap( QgsRendererCategoryV2 & other );
6166
};
@@ -97,10 +102,17 @@ class CORE_EXPORT QgsCategorizedSymbolRendererV2 : public QgsFeatureRendererV2
97102
//! return index of category with specified value (-1 if not found)
98103
int categoryIndexForValue( QVariant val );
99104

105+
//! return index of category with specified label (-1 if not found or not unique)
106+
//! @note added in 2.5
107+
int categoryIndexForLabel( QString val );
108+
100109
bool updateCategoryValue( int catIndex, const QVariant &value );
101110
bool updateCategorySymbol( int catIndex, QgsSymbolV2* symbol );
102111
bool updateCategoryLabel( int catIndex, QString label );
103112

113+
//! @note added in 2.5
114+
bool updateCategoryRenderState( int catIndex, bool render );
115+
104116
void addCategory( const QgsRendererCategoryV2 &category );
105117
bool deleteCategory( int catIndex );
106118
void deleteAllCategories();
@@ -153,6 +165,18 @@ class CORE_EXPORT QgsCategorizedSymbolRendererV2 : public QgsFeatureRendererV2
153165
//! @note added in 2.0
154166
QgsSymbolV2::ScaleMethod scaleMethod() const { return mScaleMethod; }
155167

168+
//! items of symbology items in legend should be checkable
169+
// @note added in 2.5
170+
virtual bool legendSymbolItemsCheckable() const;
171+
172+
//! item in symbology was checked
173+
// @note added in 2.5
174+
virtual bool legendSymbolItemChecked( QString key );
175+
176+
//! item in symbology was checked
177+
// @note added in 2.5
178+
virtual void checkLegendSymbolItem( QString key, bool state = true );
179+
156180
protected:
157181
QString mAttrName;
158182
QgsCategoryList mCategories;

‎src/core/symbology-ng/qgsrendererv2.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -513,6 +513,22 @@ QgsLegendSymbologyList QgsFeatureRendererV2::legendSymbologyItems( QSize iconSiz
513513
return QgsLegendSymbologyList();
514514
}
515515

516+
bool QgsFeatureRendererV2::legendSymbolItemsCheckable() const
517+
{
518+
return false;
519+
}
520+
521+
bool QgsFeatureRendererV2::legendSymbolItemChecked( QString item )
522+
{
523+
return false;
524+
}
525+
526+
void QgsFeatureRendererV2::checkLegendSymbolItem( QString item, bool state )
527+
{
528+
Q_UNUSED( item );
529+
Q_UNUSED( state );
530+
}
531+
516532
QgsLegendSymbolList QgsFeatureRendererV2::legendSymbolItems( double scaleDenominator, QString rule )
517533
{
518534
Q_UNUSED( scaleDenominator );

0 commit comments

Comments
 (0)
Please sign in to comment.