Skip to content

Commit 17e8813

Browse files
committedJan 7, 2014
add checkbox to invert color ramps in graduated and categorized symbology
1 parent 5c38775 commit 17e8813

8 files changed

+74
-15
lines changed
 

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ QgsCategorizedSymbolRendererV2::QgsCategorizedSymbolRendererV2( QString attrName
140140
mCategories( categories ),
141141
mSourceSymbol( NULL ),
142142
mSourceColorRamp( NULL ),
143+
mInvertedColorRamp( false ),
143144
mScaleMethod( DEFAULT_SCALE_METHOD ),
144145
mRotationFieldIdx( -1 ),
145146
mSizeScaleFieldIdx( -1 )
@@ -450,7 +451,10 @@ QgsFeatureRendererV2* QgsCategorizedSymbolRendererV2::clone()
450451
if ( mSourceSymbol )
451452
r->setSourceSymbol( mSourceSymbol->clone() );
452453
if ( mSourceColorRamp )
454+
{
453455
r->setSourceColorRamp( mSourceColorRamp->clone() );
456+
r->setInvertedColorRamp( mInvertedColorRamp );
457+
}
454458
r->setUsingSymbolLevels( usingSymbolLevels() );
455459
r->setRotationField( rotationField() );
456460
r->setSizeScaleField( sizeScaleField() );
@@ -537,6 +541,9 @@ QgsFeatureRendererV2* QgsCategorizedSymbolRendererV2::create( QDomElement& eleme
537541
if ( !sourceColorRampElem.isNull() && sourceColorRampElem.attribute( "name" ) == "[source]" )
538542
{
539543
r->setSourceColorRamp( QgsSymbolLayerV2Utils::loadColorRamp( sourceColorRampElem ) );
544+
QDomElement invertedColorRampElem = element.firstChildElement( "invertedcolorramp" );
545+
if ( !invertedColorRampElem.isNull() )
546+
r->setInvertedColorRamp( invertedColorRampElem.attribute( "value" ) == "1" );
540547
}
541548

542549
QDomElement rotationElem = element.firstChildElement( "rotation" );
@@ -600,6 +607,9 @@ QDomElement QgsCategorizedSymbolRendererV2::save( QDomDocument& doc )
600607
{
601608
QDomElement colorRampElem = QgsSymbolLayerV2Utils::saveColorRamp( "[source]", mSourceColorRamp, doc );
602609
rendererElem.appendChild( colorRampElem );
610+
QDomElement invertedElem = doc.createElement( "invertedcolorramp" );
611+
invertedElem.setAttribute( "value", mInvertedColorRamp );
612+
rendererElem.appendChild( invertedElem );
603613
}
604614

605615
QDomElement rotationElem = doc.createElement( "rotation" );

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,9 @@ class CORE_EXPORT QgsCategorizedSymbolRendererV2 : public QgsFeatureRendererV2
132132

133133
QgsVectorColorRampV2* sourceColorRamp();
134134
void setSourceColorRamp( QgsVectorColorRampV2* ramp );
135+
//! @note added in 2.1
136+
bool invertedColorRamp() { return mInvertedColorRamp; }
137+
void setInvertedColorRamp( bool inverted ) { mInvertedColorRamp = inverted; }
135138

136139
//! @note added in 1.6
137140
void setRotationField( QString fieldName ) { mRotationField = fieldName; }
@@ -153,6 +156,7 @@ class CORE_EXPORT QgsCategorizedSymbolRendererV2 : public QgsFeatureRendererV2
153156
QgsCategoryList mCategories;
154157
QgsSymbolV2* mSourceSymbol;
155158
QgsVectorColorRampV2* mSourceColorRamp;
159+
bool mInvertedColorRamp;
156160
QString mRotationField;
157161
QString mSizeScaleField;
158162
QgsSymbolV2::ScaleMethod mScaleMethod;

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

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ QgsGraduatedSymbolRendererV2::QgsGraduatedSymbolRendererV2( QString attrName, Qg
156156
mMode( Custom ),
157157
mSourceSymbol( NULL ),
158158
mSourceColorRamp( NULL ),
159+
mInvertedColorRamp( false ),
159160
mScaleMethod( DEFAULT_SCALE_METHOD ),
160161
mRotationFieldIdx( -1 ),
161162
mSizeScaleFieldIdx( -1 )
@@ -359,7 +360,10 @@ QgsFeatureRendererV2* QgsGraduatedSymbolRendererV2::clone()
359360
if ( mSourceSymbol )
360361
r->setSourceSymbol( mSourceSymbol->clone() );
361362
if ( mSourceColorRamp )
363+
{
362364
r->setSourceColorRamp( mSourceColorRamp->clone() );
365+
r->setInvertedColorRamp( mInvertedColorRamp );
366+
}
363367
r->setUsingSymbolLevels( usingSymbolLevels() );
364368
r->setRotationField( rotationField() );
365369
r->setSizeScaleField( sizeScaleField() );
@@ -786,7 +790,8 @@ QgsGraduatedSymbolRendererV2* QgsGraduatedSymbolRendererV2::createRenderer(
786790
int classes,
787791
Mode mode,
788792
QgsSymbolV2* symbol,
789-
QgsVectorColorRampV2* ramp )
793+
QgsVectorColorRampV2* ramp,
794+
bool inverted )
790795
{
791796
if ( classes < 1 )
792797
return NULL;
@@ -890,7 +895,9 @@ QgsGraduatedSymbolRendererV2* QgsGraduatedSymbolRendererV2::createRenderer(
890895
}
891896

892897
QgsSymbolV2* newSymbol = symbol->clone();
893-
double colorValue = ( breaks.count() > 1 ? ( double ) i / ( breaks.count() - 1 ) : 0 );
898+
double colorValue;
899+
if ( inverted ) colorValue = ( breaks.count() > 1 ? ( double )( breaks.count() - i - 1 ) / ( breaks.count() - 1 ) : 0 );
900+
else colorValue = ( breaks.count() > 1 ? ( double ) i / ( breaks.count() - 1 ) : 0 );
894901
newSymbol->setColor( ramp->color( colorValue ) ); // color from (0 / cl-1) to (cl-1 / cl-1)
895902

896903
ranges.append( QgsRendererRangeV2( lower, upper, newSymbol, label ) );
@@ -899,6 +906,7 @@ QgsGraduatedSymbolRendererV2* QgsGraduatedSymbolRendererV2::createRenderer(
899906
QgsGraduatedSymbolRendererV2* r = new QgsGraduatedSymbolRendererV2( attrName, ranges );
900907
r->setSourceSymbol( symbol->clone() );
901908
r->setSourceColorRamp( ramp->clone() );
909+
r->setInvertedColorRamp( inverted );
902910
r->setMode( mode );
903911
return r;
904912
}
@@ -958,6 +966,9 @@ QgsFeatureRendererV2* QgsGraduatedSymbolRendererV2::create( QDomElement& element
958966
if ( !sourceColorRampElem.isNull() && sourceColorRampElem.attribute( "name" ) == "[source]" )
959967
{
960968
r->setSourceColorRamp( QgsSymbolLayerV2Utils::loadColorRamp( sourceColorRampElem ) );
969+
QDomElement invertedColorRampElem = element.firstChildElement( "invertedcolorramp" );
970+
if ( !invertedColorRampElem.isNull() )
971+
r->setInvertedColorRamp( invertedColorRampElem.attribute( "value" ) == "1" );
961972
}
962973

963974
// try to load mode
@@ -1039,6 +1050,9 @@ QDomElement QgsGraduatedSymbolRendererV2::save( QDomDocument& doc )
10391050
{
10401051
QDomElement colorRampElem = QgsSymbolLayerV2Utils::saveColorRamp( "[source]", mSourceColorRamp, doc );
10411052
rendererElem.appendChild( colorRampElem );
1053+
QDomElement invertedElem = doc.createElement( "invertedcolorramp" );
1054+
invertedElem.setAttribute( "value", mInvertedColorRamp );
1055+
rendererElem.appendChild( invertedElem );
10421056
}
10431057

10441058
// save mode
@@ -1144,18 +1158,21 @@ void QgsGraduatedSymbolRendererV2::setSourceColorRamp( QgsVectorColorRampV2* ram
11441158
mSourceColorRamp = ramp;
11451159
}
11461160

1147-
void QgsGraduatedSymbolRendererV2::updateColorRamp( QgsVectorColorRampV2 *ramp )
1161+
void QgsGraduatedSymbolRendererV2::updateColorRamp( QgsVectorColorRampV2 *ramp, bool inverted )
11481162
{
11491163
int i = 0;
11501164
foreach ( QgsRendererRangeV2 range, mRanges )
11511165
{
11521166
QgsSymbolV2* symbol = range.symbol()->clone();
1153-
double colorValue = ( mRanges.count() > 1 ? ( double ) i / ( mRanges.count() - 1 ) : 0 );
1167+
double colorValue;
1168+
if ( inverted ) colorValue = ( mRanges.count() > 1 ? ( double )( mRanges.count() - i - 1 ) / ( mRanges.count() - 1 ) : 0 );
1169+
else colorValue = ( mRanges.count() > 1 ? ( double ) i / ( mRanges.count() - 1 ) : 0 );
11541170
symbol->setColor( ramp->color( colorValue ) );
11551171
updateRangeSymbol( i, symbol );
11561172
++i;
11571173
}
11581174
this->setSourceColorRamp( ramp );
1175+
this->setInvertedColorRamp( inverted );
11591176
}
11601177

11611178
void QgsGraduatedSymbolRendererV2::updateSymbols( QgsSymbolV2 *sym )

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,8 @@ class CORE_EXPORT QgsGraduatedSymbolRendererV2 : public QgsFeatureRendererV2
124124
int classes,
125125
Mode mode,
126126
QgsSymbolV2* symbol,
127-
QgsVectorColorRampV2* ramp );
127+
QgsVectorColorRampV2* ramp,
128+
bool inverted = false );
128129

129130
//! create renderer from XML element
130131
static QgsFeatureRendererV2* create( QDomElement& element );
@@ -145,11 +146,14 @@ class CORE_EXPORT QgsGraduatedSymbolRendererV2 : public QgsFeatureRendererV2
145146

146147
QgsVectorColorRampV2* sourceColorRamp();
147148
void setSourceColorRamp( QgsVectorColorRampV2* ramp );
149+
//! @note added in 2.1
150+
bool invertedColorRamp() { return mInvertedColorRamp; }
151+
void setInvertedColorRamp( bool inverted ) { mInvertedColorRamp = inverted; }
148152

149153
/** Update the color ramp used. Also updates all symbols colors.
150154
* Doesn't alter current breaks.
151155
*/
152-
void updateColorRamp( QgsVectorColorRampV2* ramp );
156+
void updateColorRamp( QgsVectorColorRampV2* ramp, bool inverted = false );
153157

154158
/** Update the all symbols but leave breaks and colors. */
155159
void updateSymbols( QgsSymbolV2* sym );
@@ -176,6 +180,7 @@ class CORE_EXPORT QgsGraduatedSymbolRendererV2 : public QgsFeatureRendererV2
176180
Mode mMode;
177181
QgsSymbolV2* mSourceSymbol;
178182
QgsVectorColorRampV2* mSourceColorRamp;
183+
bool mInvertedColorRamp;
179184
QString mRotationField;
180185
QString mSizeScaleField;
181186
QgsSymbolV2::ScaleMethod mScaleMethod;

‎src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,7 @@ void QgsCategorizedSymbolRendererV2Widget::updateUiFromRenderer()
464464
if ( mRenderer->sourceColorRamp() )
465465
{
466466
cboCategorizedColorRamp->setSourceColorRamp( mRenderer->sourceColorRamp() );
467+
cbxInvertedColorRamp->setChecked( mRenderer->invertedColorRamp() );
467468
}
468469

469470
}
@@ -582,7 +583,7 @@ void QgsCategorizedSymbolRendererV2Widget::changeCategorySymbol()
582583
mRenderer->updateCategorySymbol( catIdx, symbol );
583584
}
584585

585-
static void _createCategories( QgsCategoryList& cats, QList<QVariant>& values, QgsSymbolV2* symbol, QgsVectorColorRampV2* ramp )
586+
static void _createCategories( QgsCategoryList& cats, QList<QVariant>& values, QgsSymbolV2* symbol, QgsVectorColorRampV2* ramp, bool invert )
586587
{
587588
// sort the categories first
588589
QgsSymbolLayerV2Utils::sortVariantList( values, Qt::AscendingOrder );
@@ -598,7 +599,7 @@ static void _createCategories( QgsCategoryList& cats, QList<QVariant>& values, Q
598599
{
599600
hasNull = true;
600601
}
601-
double x = i / ( double ) num;
602+
double x = ( invert ? num - i : i ) / ( double ) num;
602603
QgsSymbolV2* newSymbol = symbol->clone();
603604
newSymbol->setColor( ramp->color( x ) );
604605

@@ -609,7 +610,7 @@ static void _createCategories( QgsCategoryList& cats, QList<QVariant>& values, Q
609610
if ( !hasNull )
610611
{
611612
QgsSymbolV2* newSymbol = symbol->clone();
612-
newSymbol->setColor( ramp->color( 1 ) );
613+
newSymbol->setColor( ramp->color( invert ? 0 : 1 ) );
613614
cats.append( QgsRendererCategoryV2( QVariant( "" ), newSymbol, QString() ) );
614615
}
615616
}
@@ -670,7 +671,7 @@ void QgsCategorizedSymbolRendererV2Widget::addCategories()
670671
}
671672

672673
QgsCategoryList cats;
673-
_createCategories( cats, unique_vals, mCategorizedSymbol, ramp );
674+
_createCategories( cats, unique_vals, mCategorizedSymbol, ramp, cbxInvertedColorRamp->isChecked() );
674675

675676
bool deleteExisting = false;
676677

@@ -737,6 +738,7 @@ void QgsCategorizedSymbolRendererV2Widget::addCategories()
737738
r->setScaleMethod( mRenderer->scaleMethod() );
738739
r->setSizeScaleField( mRenderer->sizeScaleField() );
739740
r->setRotationField( mRenderer->rotationField() );
741+
r->setInvertedColorRamp( cbxInvertedColorRamp->isChecked() );
740742

741743
if ( mModel )
742744
{

‎src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,7 @@ void QgsGraduatedSymbolRendererV2Widget::updateUiFromRenderer()
462462
if ( mRenderer->sourceColorRamp() )
463463
{
464464
cboGraduatedColorRamp->setSourceColorRamp( mRenderer->sourceColorRamp() );
465+
cbxInvertedColorRamp->setChecked( mRenderer->invertedColorRamp() );
465466
}
466467
}
467468

@@ -540,7 +541,7 @@ void QgsGraduatedSymbolRendererV2Widget::classifyGraduated()
540541
// create and set new renderer
541542
QApplication::setOverrideCursor( Qt::WaitCursor );
542543
QgsGraduatedSymbolRendererV2* r = QgsGraduatedSymbolRendererV2::createRenderer(
543-
mLayer, attrName, classes, mode, mGraduatedSymbol, ramp );
544+
mLayer, attrName, classes, mode, mGraduatedSymbol, ramp, cbxInvertedColorRamp->isChecked() );
544545
QApplication::restoreOverrideCursor();
545546
if ( !r )
546547
{
@@ -566,7 +567,7 @@ void QgsGraduatedSymbolRendererV2Widget::reapplyColorRamp()
566567
if ( ramp == NULL )
567568
return;
568569

569-
mRenderer->updateColorRamp( ramp );
570+
mRenderer->updateColorRamp( ramp, cbxInvertedColorRamp->isChecked() );
570571
refreshSymbolView();
571572
}
572573

‎src/ui/qgscategorizedsymbolrendererv2widget.ui

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,13 @@
116116
</property>
117117
</widget>
118118
</item>
119+
<item>
120+
<widget class="QCheckBox" name="cbxInvertedColorRamp">
121+
<property name="text">
122+
<string>Invert</string>
123+
</property>
124+
</widget>
125+
</item>
119126
</layout>
120127
</item>
121128
<item>
@@ -227,6 +234,7 @@
227234
<tabstop>cboCategorizedColumn</tabstop>
228235
<tabstop>btnChangeCategorizedSymbol</tabstop>
229236
<tabstop>cboCategorizedColorRamp</tabstop>
237+
<tabstop>cbxInvertedColorRamp</tabstop>
230238
<tabstop>viewCategories</tabstop>
231239
<tabstop>btnAddCategories</tabstop>
232240
<tabstop>btnDeleteCategories</tabstop>

‎src/ui/qgsgraduatedsymbolrendererv2widget.ui

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,6 @@
3939
</property>
4040
</widget>
4141
</item>
42-
<item row="5" column="1">
43-
<widget class="QgsColorRampComboBox" name="cboGraduatedColorRamp"/>
44-
</item>
4542
<item row="5" column="3">
4643
<widget class="QComboBox" name="cboGraduatedMode">
4744
<item>
@@ -192,6 +189,20 @@
192189
</item>
193190
</layout>
194191
</item>
192+
<item row="5" column="1">
193+
<layout class="QHBoxLayout" name="horizontalLayout_2">
194+
<item>
195+
<widget class="QgsColorRampComboBox" name="cboGraduatedColorRamp"/>
196+
</item>
197+
<item>
198+
<widget class="QCheckBox" name="cbxInvertedColorRamp">
199+
<property name="text">
200+
<string>Invert</string>
201+
</property>
202+
</widget>
203+
</item>
204+
</layout>
205+
</item>
195206
</layout>
196207
</item>
197208
<item>
@@ -283,6 +294,7 @@
283294
<tabstops>
284295
<tabstop>btnChangeGraduatedSymbol</tabstop>
285296
<tabstop>cboGraduatedColorRamp</tabstop>
297+
<tabstop>cbxInvertedColorRamp</tabstop>
286298
<tabstop>spinGraduatedClasses</tabstop>
287299
<tabstop>cboGraduatedMode</tabstop>
288300
<tabstop>viewGraduated</tabstop>

0 commit comments

Comments
 (0)
Please sign in to comment.