Skip to content

Commit d4b8c40

Browse files
committed
Add render state support for graduated renderer
Add check state role for graduated renderer Sync sip bindings
1 parent 9dc536a commit d4b8c40

File tree

4 files changed

+104
-7
lines changed

4 files changed

+104
-7
lines changed

python/core/symbology-ng/qgsgraduatedsymbolrendererv2.sip

+20-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ class QgsRendererRangeV2
55
%End
66

77
public:
8-
QgsRendererRangeV2( double lowerValue, double upperValue, QgsSymbolV2* symbol /Transfer/, QString label );
8+
QgsRendererRangeV2( double lowerValue, double upperValue, QgsSymbolV2* symbol /Transfer/, QString label, bool render = true );
99
QgsRendererRangeV2( const QgsRendererRangeV2& range );
1010

1111
// default dtor is ok
@@ -22,6 +22,10 @@ class QgsRendererRangeV2
2222
void setLowerValue( double lowerValue );
2323
void setUpperValue( double upperValue );
2424

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

@@ -74,6 +78,8 @@ class QgsGraduatedSymbolRendererV2 : QgsFeatureRendererV2
7478
bool updateRangeLabel( int rangeIndex, QString label );
7579
bool updateRangeUpperValue( int rangeIndex, double value );
7680
bool updateRangeLowerValue( int rangeIndex, double value );
81+
//! @note added in 2.5
82+
bool updateRangeRenderState( int rangeIndex, bool render );
7783

7884
void addClass( QgsSymbolV2* symbol );
7985
//! @note available in python bindings as addClassRange
@@ -155,6 +161,19 @@ class QgsGraduatedSymbolRendererV2 : QgsFeatureRendererV2
155161
//! @note added in 2.0
156162
QgsSymbolV2::ScaleMethod scaleMethod() const;
157163

164+
//! items of symbology items in legend should be checkable
165+
// @note added in 2.5
166+
virtual bool legendSymbolItemsCheckable() const;
167+
168+
//! item in symbology was checked
169+
// @note added in 2.5
170+
virtual bool legendSymbolItemChecked( int index );
171+
172+
//! item in symbology was checked
173+
// @note added in 2.5
174+
virtual void checkLegendSymbolItem( int index, bool state = true );
175+
176+
158177

159178
protected:
160179
QgsSymbolV2* symbolForValue( double value );

src/core/symbology-ng/qgsgraduatedsymbolrendererv2.cpp

+47-2
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,12 @@ QgsRendererRangeV2::QgsRendererRangeV2()
3535
{
3636
}
3737

38-
QgsRendererRangeV2::QgsRendererRangeV2( double lowerValue, double upperValue, QgsSymbolV2* symbol, QString label )
38+
QgsRendererRangeV2::QgsRendererRangeV2( double lowerValue, double upperValue, QgsSymbolV2* symbol, QString label, bool render )
3939
: mLowerValue( lowerValue )
4040
, mUpperValue( upperValue )
4141
, mSymbol( symbol )
4242
, mLabel( label )
43+
, mRender( render )
4344
{
4445
}
4546

@@ -48,6 +49,7 @@ QgsRendererRangeV2::QgsRendererRangeV2( const QgsRendererRangeV2& range )
4849
, mUpperValue( range.mUpperValue )
4950
, mSymbol( range.mSymbol.data() ? range.mSymbol->clone() : NULL )
5051
, mLabel( range.mLabel )
52+
, mRender( range.mRender )
5153
{
5254
}
5355

@@ -106,6 +108,16 @@ void QgsRendererRangeV2::setLowerValue( double lowerValue )
106108
mLowerValue = lowerValue;
107109
}
108110

111+
bool QgsRendererRangeV2::renderState() const
112+
{
113+
return mRender;
114+
}
115+
116+
void QgsRendererRangeV2::setRenderState( bool render )
117+
{
118+
mRender = render;
119+
}
120+
109121
QString QgsRendererRangeV2::dump() const
110122
{
111123
return QString( "%1 - %2::%3::%4\n" ).arg( mLowerValue ).arg( mUpperValue ).arg( mLabel ).arg( mSymbol->dump() );
@@ -164,7 +176,12 @@ QgsSymbolV2* QgsGraduatedSymbolRendererV2::symbolForValue( double value )
164176
for ( QgsRangeList::iterator it = mRanges.begin(); it != mRanges.end(); ++it )
165177
{
166178
if ( it->lowerValue() <= value && it->upperValue() >= value )
167-
return it->symbol();
179+
{
180+
if ( it->renderState() )
181+
return it->symbol();
182+
else
183+
return NULL;
184+
}
168185
}
169186
// the value is out of the range: return NULL instead of symbol
170187
return NULL;
@@ -322,6 +339,14 @@ bool QgsGraduatedSymbolRendererV2::updateRangeLowerValue( int rangeIndex, double
322339
return true;
323340
}
324341

342+
bool QgsGraduatedSymbolRendererV2::updateRangeRenderState( int rangeIndex, bool value )
343+
{
344+
if ( rangeIndex < 0 || rangeIndex >= mRanges.size() )
345+
return false;
346+
mRanges[rangeIndex].setRenderState( value );
347+
return true;
348+
}
349+
325350
QString QgsGraduatedSymbolRendererV2::dump() const
326351
{
327352
QString s = QString( "GRADUATED: attr %1\n" ).arg( mAttrName );
@@ -1017,6 +1042,7 @@ QDomElement QgsGraduatedSymbolRendererV2::save( QDomDocument& doc )
10171042
rangeElem.setAttribute( "upper", QString::number( range.upperValue(), 'f' ) );
10181043
rangeElem.setAttribute( "symbol", symbolName );
10191044
rangeElem.setAttribute( "label", range.label() );
1045+
rangeElem.setAttribute( "render", range.renderState() ? "true" : "false" );
10201046
rangesElem.appendChild( rangeElem );
10211047
i++;
10221048
}
@@ -1200,6 +1226,25 @@ void QgsGraduatedSymbolRendererV2::setScaleMethod( QgsSymbolV2::ScaleMethod scal
12001226
}
12011227
}
12021228

1229+
bool QgsGraduatedSymbolRendererV2::legendSymbolItemsCheckable() const
1230+
{
1231+
return true;
1232+
}
1233+
1234+
bool QgsGraduatedSymbolRendererV2::legendSymbolItemChecked( int index )
1235+
{
1236+
if( index >= 0 && index < mRanges.size() )
1237+
return mRanges[ index ].renderState();
1238+
else
1239+
return true;
1240+
}
1241+
1242+
void QgsGraduatedSymbolRendererV2::checkLegendSymbolItem( int index, bool state )
1243+
{
1244+
updateRangeRenderState( index, state );
1245+
}
1246+
1247+
12031248
void QgsGraduatedSymbolRendererV2::addClass( QgsSymbolV2* symbol )
12041249
{
12051250
QgsSymbolV2* newSymbol = symbol->clone();

src/core/symbology-ng/qgsgraduatedsymbolrendererv2.h

+20-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class CORE_EXPORT QgsRendererRangeV2
2424
{
2525
public:
2626
QgsRendererRangeV2();
27-
QgsRendererRangeV2( double lowerValue, double upperValue, QgsSymbolV2* symbol, QString label );
27+
QgsRendererRangeV2( double lowerValue, double upperValue, QgsSymbolV2* symbol, QString label, bool render = true );
2828
QgsRendererRangeV2( const QgsRendererRangeV2& range );
2929

3030
// default dtor is ok
@@ -41,6 +41,10 @@ class CORE_EXPORT QgsRendererRangeV2
4141
void setLowerValue( double lowerValue );
4242
void setUpperValue( double upperValue );
4343

44+
// @note added in 2.5
45+
bool renderState() const;
46+
void setRenderState( bool render );
47+
4448
// debugging
4549
QString dump() const;
4650

@@ -50,6 +54,7 @@ class CORE_EXPORT QgsRendererRangeV2
5054
double mLowerValue, mUpperValue;
5155
QScopedPointer<QgsSymbolV2> mSymbol;
5256
QString mLabel;
57+
bool mRender;
5358

5459
// for cpy+swap idiom
5560
void swap( QgsRendererRangeV2 & other );
@@ -97,6 +102,9 @@ class CORE_EXPORT QgsGraduatedSymbolRendererV2 : public QgsFeatureRendererV2
97102
bool updateRangeLabel( int rangeIndex, QString label );
98103
bool updateRangeUpperValue( int rangeIndex, double value );
99104
bool updateRangeLowerValue( int rangeIndex, double value );
105+
//! @note added in 2.5
106+
bool updateRangeRenderState( int rangeIndex, bool render );
107+
100108

101109
void addClass( QgsSymbolV2* symbol );
102110
//! @note available in python bindings as addClassRange
@@ -178,6 +186,17 @@ class CORE_EXPORT QgsGraduatedSymbolRendererV2 : public QgsFeatureRendererV2
178186
//! @note added in 2.0
179187
QgsSymbolV2::ScaleMethod scaleMethod() const { return mScaleMethod; }
180188

189+
//! items of symbology items in legend should be checkable
190+
// @note added in 2.5
191+
virtual bool legendSymbolItemsCheckable() const;
192+
193+
//! item in symbology was checked
194+
// @note added in 2.5
195+
virtual bool legendSymbolItemChecked( int index );
196+
197+
//! item in symbology was checked
198+
// @note added in 2.5
199+
virtual void checkLegendSymbolItem( int index, bool state = true );
181200

182201
protected:
183202
QString mAttrName;

src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.cpp

+17-3
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ Qt::ItemFlags QgsGraduatedSymbolRendererV2Model::flags( const QModelIndex & inde
9898
return Qt::ItemIsDropEnabled;
9999
}
100100

101-
Qt::ItemFlags flags = Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled;
101+
Qt::ItemFlags flags = Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | Qt::ItemIsUserCheckable;
102102

103103
if ( index.column() == 2 )
104104
{
@@ -120,7 +120,11 @@ QVariant QgsGraduatedSymbolRendererV2Model::data( const QModelIndex &index, int
120120
const QgsRendererRangeV2 range = mRenderer->ranges().value( index.row() );
121121
QString rangeStr = QString::number( range.lowerValue(), 'f', 4 ) + " - " + QString::number( range.upperValue(), 'f', 4 );
122122

123-
if ( role == Qt::DisplayRole || role == Qt::ToolTipRole )
123+
if ( role == Qt::CheckStateRole && index.column() == 0 )
124+
{
125+
return range.renderState() ? Qt::Checked : Qt::Unchecked;
126+
}
127+
else if ( role == Qt::DisplayRole || role == Qt::ToolTipRole )
124128
{
125129
switch ( index.column() )
126130
{
@@ -152,7 +156,17 @@ QVariant QgsGraduatedSymbolRendererV2Model::data( const QModelIndex &index, int
152156

153157
bool QgsGraduatedSymbolRendererV2Model::setData( const QModelIndex & index, const QVariant & value, int role )
154158
{
155-
if ( !index.isValid() || role != Qt::EditRole )
159+
if ( !index.isValid() )
160+
return false;
161+
162+
if ( index.column() == 0 && role == Qt::CheckStateRole )
163+
{
164+
mRenderer->updateRangeRenderState( index.row(), value == Qt::Checked );
165+
emit dataChanged( index, index );
166+
return true;
167+
}
168+
169+
if ( role != Qt::EditRole )
156170
return false;
157171

158172
switch ( index.column() )

0 commit comments

Comments
 (0)