Skip to content

Commit abd9e3c

Browse files
committedSep 20, 2014
Numerous enhancements to graduated and categorized symbol renderers
1 parent 1622bed commit abd9e3c

14 files changed

+225
-67
lines changed
 

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,10 @@ class QgsCategorizedSymbolRendererV2 : QgsFeatureRendererV2
120120
bool invertedColorRamp();
121121
void setInvertedColorRamp( bool inverted );
122122

123+
// Update the color ramp used and all symbols colors.
124+
//! @note added in 2.5
125+
void updateColorRamp( QgsVectorColorRampV2* ramp, bool inverted = false );
126+
123127
//! @note added in 1.6
124128
void setRotationField( QString fieldOrExpression );
125129
//! @note added in 1.6
@@ -147,6 +151,10 @@ class QgsCategorizedSymbolRendererV2 : QgsFeatureRendererV2
147151
// @note added in 2.5
148152
virtual void checkLegendSymbolItem( QString key, bool state = true );
149153

154+
//! If supported by the renderer, return classification attribute for the use in legend
155+
//! @note added in 2.6
156+
virtual QString legendClassificationAttribute() const;
157+
150158
//! creates a QgsCategorizedSymbolRendererV2 from an existing renderer.
151159
//! @note added in 2.5
152160
//! @returns a new renderer if the conversion was possible, otherwise 0.

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

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ class QgsGraduatedSymbolRendererV2 : QgsFeatureRendererV2
8080
bool updateRangeLowerValue( int rangeIndex, double value );
8181
//! @note added in 2.5
8282
bool updateRangeRenderState( int rangeIndex, bool render );
83+
QString defaultRangeLabel( const QgsRendererRangeV2 &range );
84+
8385

8486
void addClass( QgsSymbolV2* symbol );
8587
//! @note available in python bindings as addClassRange
@@ -106,14 +108,22 @@ class QgsGraduatedSymbolRendererV2 : QgsFeatureRendererV2
106108
Mode mode() const;
107109
void setMode( Mode mode );
108110

111+
QString units();
112+
void setUnits( QString units, bool updateRanges=true );
113+
114+
int decimalPlaces() const;
115+
void setDecimalPlaces( int decimalPlaces, bool updateRanges=true );
116+
109117
static QgsGraduatedSymbolRendererV2* createRenderer(
110118
QgsVectorLayer* vlayer,
111119
QString attrName,
112120
int classes,
113121
Mode mode,
114122
QgsSymbolV2* symbol /Transfer/,
115123
QgsVectorColorRampV2* ramp /Transfer/,
116-
bool inverted = false ) /Factory/;
124+
bool inverted = false,
125+
QString units = "",
126+
int decimalPlaces = 4 ) /Factory/;
117127

118128
//! create renderer from XML element
119129
static QgsFeatureRendererV2* create( QDomElement& element ) /Factory/;
@@ -141,7 +151,7 @@ class QgsGraduatedSymbolRendererV2 : QgsFeatureRendererV2
141151
/** Update the color ramp used. Also updates all symbols colors.
142152
* Doesn't alter current breaks.
143153
*/
144-
void updateColorRamp( QgsVectorColorRampV2* ramp /Transfer/ );
154+
void updateColorRamp( QgsVectorColorRampV2* ramp /Transfer/, bool inverted = false );
145155

146156
/** Update the all symbols but leave breaks and colors. */
147157
void updateSymbols( QgsSymbolV2* sym /Transfer/ );
@@ -178,6 +188,10 @@ class QgsGraduatedSymbolRendererV2 : QgsFeatureRendererV2
178188
//! @returns a new renderer if the conversion was possible, otherwise 0.
179189
static QgsGraduatedSymbolRendererV2* convertFromRenderer( const QgsFeatureRendererV2 *renderer ) /Factory/;
180190

191+
//! If supported by the renderer, return classification attribute for the use in legend
192+
//! @note added in 2.6
193+
virtual QString legendClassificationAttribute();
194+
181195
protected:
182196
QgsSymbolV2* symbolForValue( double value );
183197

‎python/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.sip

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ class QgsCategorizedSymbolRendererV2Widget : QgsRendererV2Widget
1818
void categoriesDoubleClicked( const QModelIndex & idx );
1919
void addCategory();
2020
void addCategories();
21+
void applyColorRamp();
2122
void deleteCategories();
2223
void deleteAllCategories();
2324

@@ -49,6 +50,8 @@ class QgsCategorizedSymbolRendererV2Widget : QgsRendererV2Widget
4950

5051
void changeCategorySymbol();
5152

53+
QgsVectorColorRampV2* getColorRamp();
54+
5255
QList<QgsSymbolV2*> selectedSymbols();
5356
QgsCategoryList selectedCategoryList();
5457
void refreshSymbolView();

‎python/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.sip

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,14 @@ class QgsGraduatedSymbolRendererV2Widget : QgsRendererV2Widget
2626
void deleteClasses();
2727
/**Removes all classes from the classification*/
2828
void deleteAllClasses();
29+
/**Toggle the link between classes boundaries */
30+
void toggleBoundariesLink( bool linked );
2931

3032
void rotationFieldChanged( QString fldName );
3133
void sizeScaleFieldChanged( QString fldName );
3234
void scaleMethodChanged( QgsSymbolV2::ScaleMethod scaleMethod );
35+
void decimalPlacesChanged();
36+
void unitsChanged( QString units );
3337

3438
void showSymbolLevels();
3539

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

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ void QgsCategorizedSymbolRendererV2::rebuildHash()
168168
{
169169
mSymbolHash.clear();
170170

171-
for ( int i = 0; i < mCategories.count(); ++i )
171+
for ( int i = 0; i < mCategories.size(); ++i )
172172
{
173173
QgsRendererCategoryV2& cat = mCategories[i];
174174
mSymbolHash.insert( cat.value().toString(), ( cat.renderState() || mCounting ) ? cat.symbol() : &sSkipRender );
@@ -181,7 +181,7 @@ QgsSymbolV2* QgsCategorizedSymbolRendererV2::symbolForValue( QVariant value )
181181
QHash<QString, QgsSymbolV2*>::iterator it = mSymbolHash.find( value.toString() );
182182
if ( it == mSymbolHash.end() )
183183
{
184-
if ( mSymbolHash.count() == 0 )
184+
if ( mSymbolHash.size() == 0 )
185185
{
186186
QgsDebugMsg( "there are no hashed symbols!!!" );
187187
}
@@ -689,11 +689,27 @@ QgsVectorColorRampV2* QgsCategorizedSymbolRendererV2::sourceColorRamp()
689689
{
690690
return mSourceColorRamp.data();
691691
}
692+
692693
void QgsCategorizedSymbolRendererV2::setSourceColorRamp( QgsVectorColorRampV2* ramp )
693694
{
694695
mSourceColorRamp.reset( ramp );
695696
}
696697

698+
void QgsCategorizedSymbolRendererV2::updateColorRamp( QgsVectorColorRampV2* ramp, bool inverted )
699+
{
700+
setSourceColorRamp(ramp);
701+
setInvertedColorRamp(inverted);
702+
double num=mCategories.count()-1;
703+
double count = 0;
704+
foreach ( const QgsRendererCategoryV2 &cat, mCategories )
705+
{
706+
double value=count/num;
707+
if( mInvertedColorRamp ) value=1.0-value;
708+
cat.symbol()->setColor(mSourceColorRamp->color(value));
709+
count += 1;
710+
}
711+
}
712+
697713
void QgsCategorizedSymbolRendererV2::setRotationField( QString fieldOrExpression )
698714
{
699715
mRotation.reset( QgsSymbolLayerV2Utils::fieldOrExpressionToExpression( fieldOrExpression ) );
@@ -777,5 +793,16 @@ QgsCategorizedSymbolRendererV2* QgsCategorizedSymbolRendererV2::convertFromRende
777793
const QgsInvertedPolygonRenderer* invertedPolygonRenderer = dynamic_cast<const QgsInvertedPolygonRenderer*>( renderer );
778794
return convertFromRenderer( invertedPolygonRenderer->embeddedRenderer() );
779795
}
780-
return 0;
796+
797+
// If not one of the specifically handled renderers, then just grab the symbol from the renderer
798+
// Could have applied this to specific renderer types (singleSymbol, graduatedSymbo)
799+
800+
QgsCategorizedSymbolRendererV2* r =new QgsCategorizedSymbolRendererV2( "", QgsCategoryList() );
801+
QgsSymbolV2List symbols=const_cast<QgsFeatureRendererV2 *>(renderer)->symbols();
802+
if( symbols.size() > 0 )
803+
{
804+
r->setSourceSymbol(symbols.at(0)->clone());
805+
}
806+
return r;
807+
781808
}

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,6 @@ class CORE_EXPORT QgsCategorizedSymbolRendererV2 : public QgsFeatureRendererV2
142142

143143
QgsSymbolV2* sourceSymbol();
144144
void setSourceSymbol( QgsSymbolV2* sym );
145-
//! @note added in 2.5
146-
void updateSymbols( QgsSymbolV2* sym );
147145

148146
QgsVectorColorRampV2* sourceColorRamp();
149147
void setSourceColorRamp( QgsVectorColorRampV2* ramp );
@@ -152,9 +150,10 @@ class CORE_EXPORT QgsCategorizedSymbolRendererV2 : public QgsFeatureRendererV2
152150
bool invertedColorRamp() { return mInvertedColorRamp; }
153151
void setInvertedColorRamp( bool inverted ) { mInvertedColorRamp = inverted; }
154152

155-
// Update the color ramp used. Also updates all symbols colors.
156-
// @note added in 2.5
153+
// Update the color ramp used and all symbols colors.
154+
//! @note added in 2.5
157155
void updateColorRamp( QgsVectorColorRampV2* ramp, bool inverted = false );
156+
158157
//! @note added in 1.6
159158
void setRotationField( QString fieldOrExpression );
160159
//! @note added in 1.6

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

Lines changed: 53 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ QgsGraduatedSymbolRendererV2::QgsGraduatedSymbolRendererV2( QString attrName, Qg
164164
mMode( Custom ),
165165
mInvertedColorRamp( false ),
166166
mUnits(""),
167+
mDecimalPlaces(4),
167168
mScaleMethod( DEFAULT_SCALE_METHOD )
168169
{
169170
// TODO: check ranges for sanity (NULL symbols, invalid ranges)
@@ -360,7 +361,9 @@ bool QgsGraduatedSymbolRendererV2::updateRangeRenderState( int rangeIndex, bool
360361

361362
QString QgsGraduatedSymbolRendererV2::defaultRangeLabel(const QgsRendererRangeV2 & range )
362363
{
363-
return QString::number( range.lowerValue(), 'f', 4 ) + " - " + QString::number( range.upperValue(), 'f', 4 ) + mUnits;
364+
int ndp=mDecimalPlaces;
365+
return QString::number( range.lowerValue(), 'f', mDecimalPlaces )
366+
+ " - " + QString::number( range.upperValue(), 'f', mDecimalPlaces ) + mUnits;
364367
}
365368

366369
QString QgsGraduatedSymbolRendererV2::dump() const
@@ -387,6 +390,7 @@ QgsFeatureRendererV2* QgsGraduatedSymbolRendererV2::clone() const
387390
r->setSizeScaleField( sizeScaleField() );
388391
r->setScaleMethod( scaleMethod() );
389392
r->setUnits( units(), false );
393+
r->setDecimalPlaces( decimalPlaces(), false );
390394
return r;
391395
}
392396

@@ -814,7 +818,8 @@ QgsGraduatedSymbolRendererV2* QgsGraduatedSymbolRendererV2::createRenderer(
814818
QgsSymbolV2* symbol,
815819
QgsVectorColorRampV2* ramp,
816820
bool inverted,
817-
QString units )
821+
QString units,
822+
int decimalPlaces )
818823
{
819824
if ( classes < 1 )
820825
return NULL;
@@ -910,6 +915,7 @@ QgsGraduatedSymbolRendererV2* QgsGraduatedSymbolRendererV2::createRenderer(
910915
r->setInvertedColorRamp( inverted );
911916
r->setMode( mode );
912917
r->setUnits( units );
918+
r->setDecimalPlaces( decimalPlaces );
913919

914920
// "breaks" list contains all values at class breaks plus maximum as last break
915921
int i = 0;
@@ -1043,11 +1049,13 @@ QgsFeatureRendererV2* QgsGraduatedSymbolRendererV2::create( QDomElement& element
10431049
r->setSizeScaleField( sizeScaleElem.attribute( "field" ) );
10441050
r->setScaleMethod( QgsSymbolLayerV2Utils::decodeScaleMethod( sizeScaleElem.attribute( "scalemethod" ) ) );
10451051

1046-
QDomElement unitsElem = element.firstChildElement( "units" );
1047-
if( ! unitsElem.isNull() )
1052+
QDomElement labelSettingsElem = element.firstChildElement( "labelsettings" );
1053+
if( ! labelSettingsElem.isNull() )
10481054
{
1049-
QString unitString=unitsElem.attribute("name");
1055+
QString unitString=labelSettingsElem.attribute("units");
10501056
r->setUnits(unitString, false);
1057+
int decimalPlaces=labelSettingsElem.attribute("decimalplaces").toInt();
1058+
r->setDecimalPlaces(decimalPlaces,false);
10511059
}
10521060
// TODO: symbol levels
10531061
return r;
@@ -1136,9 +1144,10 @@ QDomElement QgsGraduatedSymbolRendererV2::save( QDomDocument& doc )
11361144
sizeScaleElem.setAttribute( "scalemethod", QgsSymbolLayerV2Utils::encodeScaleMethod( mScaleMethod ) );
11371145
rendererElem.appendChild( sizeScaleElem );
11381146

1139-
QDomElement unitsElem=doc.createElement("units");
1140-
unitsElem.setAttribute("name",mUnits);
1141-
rendererElem.appendChild( unitsElem );
1147+
QDomElement labelSettingsElem=doc.createElement("labelsettings");
1148+
labelSettingsElem.setAttribute("units",mUnits);
1149+
labelSettingsElem.setAttribute("decimalplaces",mDecimalPlaces);
1150+
rendererElem.appendChild( labelSettingsElem );
11421151

11431152
return rendererElem;
11441153
}
@@ -1297,7 +1306,7 @@ void QgsGraduatedSymbolRendererV2::deleteAllClasses()
12971306

12981307
void QgsGraduatedSymbolRendererV2::setUnits( QString units, bool updateRanges )
12991308
{
1300-
if( updateRanges )
1309+
if( updateRanges && units != mUnits )
13011310
{
13021311
for ( QgsRangeList::iterator it = mRanges.begin(); it != mRanges.end(); ++it )
13031312
{
@@ -1312,6 +1321,29 @@ void QgsGraduatedSymbolRendererV2::setUnits( QString units, bool updateRanges )
13121321
mUnits=units;
13131322
}
13141323

1324+
void QgsGraduatedSymbolRendererV2::setDecimalPlaces( int decimalPlaces, bool updateRanges )
1325+
{
1326+
if( decimalPlaces < 0 ) decimalPlaces=0;
1327+
if( decimalPlaces > 10 ) decimalPlaces=10;
1328+
1329+
if( updateRanges && decimalPlaces != mDecimalPlaces )
1330+
{
1331+
int saveDecimalPlaces=mDecimalPlaces;
1332+
for ( QgsRangeList::iterator it = mRanges.begin(); it != mRanges.end(); ++it )
1333+
{
1334+
QString label=it->label();
1335+
QString defaultLabel=defaultRangeLabel(*it);
1336+
if( label == defaultLabel )
1337+
{
1338+
mDecimalPlaces=decimalPlaces;
1339+
it->setLabel(defaultRangeLabel(*it));
1340+
mDecimalPlaces=saveDecimalPlaces;
1341+
}
1342+
}
1343+
}
1344+
mDecimalPlaces=decimalPlaces;
1345+
}
1346+
13151347
void QgsGraduatedSymbolRendererV2::moveClass( int from, int to )
13161348
{
13171349
if ( from < 0 || from >= mRanges.size() || to < 0 || to >= mRanges.size() ) return;
@@ -1379,5 +1411,16 @@ QgsGraduatedSymbolRendererV2* QgsGraduatedSymbolRendererV2::convertFromRenderer(
13791411
const QgsInvertedPolygonRenderer* invertedPolygonRenderer = dynamic_cast<const QgsInvertedPolygonRenderer*>( renderer );
13801412
return convertFromRenderer( invertedPolygonRenderer->embeddedRenderer() );
13811413
}
1382-
return 0;
1414+
1415+
// If not one of the specifically handled renderers, then just grab the symbol from the renderer
1416+
// Could have applied this to specific renderer types (singleSymbol, graduatedSymbo)
1417+
1418+
QgsGraduatedSymbolRendererV2* r =new QgsGraduatedSymbolRendererV2( "", QgsRangeList() );
1419+
QgsSymbolV2List symbols=const_cast<QgsFeatureRendererV2 *>(renderer)->symbols();
1420+
if( symbols.size() > 0 )
1421+
{
1422+
r->setSourceSymbol(symbols.at(0)->clone());
1423+
}
1424+
return r;
1425+
13831426
}

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,9 @@ class CORE_EXPORT QgsGraduatedSymbolRendererV2 : public QgsFeatureRendererV2
135135
QString units() const { return mUnits; }
136136
void setUnits( QString units, bool updateRanges=true );
137137

138+
int decimalPlaces() const { return mDecimalPlaces; };
139+
void setDecimalPlaces( int decimalPlaces, bool updateRanges=true );
140+
138141
static QgsGraduatedSymbolRendererV2* createRenderer(
139142
QgsVectorLayer* vlayer,
140143
QString attrName,
@@ -143,7 +146,8 @@ class CORE_EXPORT QgsGraduatedSymbolRendererV2 : public QgsFeatureRendererV2
143146
QgsSymbolV2* symbol,
144147
QgsVectorColorRampV2* ramp,
145148
bool inverted = false,
146-
QString units = "");
149+
QString units = "",
150+
int decimalPlaces = 4);
147151

148152
//! create renderer from XML element
149153
static QgsFeatureRendererV2* create( QDomElement& element );
@@ -215,6 +219,7 @@ class CORE_EXPORT QgsGraduatedSymbolRendererV2 : public QgsFeatureRendererV2
215219
protected:
216220
QString mAttrName;
217221
QString mUnits;
222+
int mDecimalPlaces;
218223
QgsRangeList mRanges;
219224
Mode mMode;
220225
QScopedPointer<QgsSymbolV2> mSourceSymbol;

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,5 +393,11 @@ QgsSingleSymbolRendererV2* QgsSingleSymbolRendererV2::convertFromRenderer( const
393393
return convertFromRenderer( invertedPolygonRenderer->embeddedRenderer() );
394394

395395
}
396+
397+
QgsSymbolV2List symbols=const_cast<QgsFeatureRendererV2 *>(renderer)->symbols();
398+
if( symbols.size() > 0 )
399+
{
400+
return new QgsSingleSymbolRendererV2(symbols.at(0)->clone());
401+
}
396402
return 0;
397403
}

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

Lines changed: 23 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -410,17 +410,21 @@ QgsCategorizedSymbolRendererV2Widget::QgsCategorizedSymbolRendererV2Widget( QgsV
410410
cboCategorizedColorRamp->setCurrentIndex( index );
411411
}
412412

413+
mCategorizedSymbol = QgsSymbolV2::defaultSymbol( mLayer->geometryType() );
414+
413415
mModel = new QgsCategorizedSymbolRendererV2Model( this );
414416
mModel->setRenderer( mRenderer );
417+
418+
// update GUI from renderer
419+
updateUiFromRenderer();
420+
415421
viewCategories->setModel( mModel );
416422
viewCategories->resizeColumnToContents( 0 );
417423
viewCategories->resizeColumnToContents( 1 );
418424
viewCategories->resizeColumnToContents( 2 );
419425

420426
viewCategories->setStyle( new QgsCategorizedSymbolRendererV2ViewStyle( viewCategories->style() ) );
421427

422-
mCategorizedSymbol = QgsSymbolV2::defaultSymbol( mLayer->geometryType() );
423-
424428
connect( mModel, SIGNAL( rowsMoved() ), this, SLOT( rowsMoved() ) );
425429

426430
connect( mExpressionWidget, SIGNAL( fieldChanged( QString ) ), this, SLOT( categoryColumnChanged( QString ) ) );
@@ -436,9 +440,6 @@ QgsCategorizedSymbolRendererV2Widget::QgsCategorizedSymbolRendererV2Widget( QgsV
436440
connect( cbxInvertedColorRamp, SIGNAL( toggled(bool)), this, SLOT( applyColorRamp()));
437441
connect( cboCategorizedColorRamp, SIGNAL(currentIndexChanged(int)), this, SLOT( applyColorRamp()));
438442

439-
// update GUI from renderer
440-
updateUiFromRenderer();
441-
442443
// menus for data-defined rotation/size
443444
QMenu* advMenu = new QMenu;
444445

@@ -460,16 +461,17 @@ QgsCategorizedSymbolRendererV2Widget::~QgsCategorizedSymbolRendererV2Widget()
460461

461462
void QgsCategorizedSymbolRendererV2Widget::updateUiFromRenderer()
462463
{
464+
// Note: This assumes that the signals for UI element changes have not
465+
// yet been connected, so that the updates to color ramp, symbol, etc
466+
// don't override existing customisations.
467+
463468
updateCategorizedSymbolIcon();
464469

465470
//mModel->setRenderer ( mRenderer ); // necessary?
466471

467472
// set column
468-
disconnect( mExpressionWidget, SIGNAL( fieldChanged( QString ) ), this, SLOT( categoryColumnChanged( QString ) ) );
469473
QString attrName = mRenderer->classAttribute();
470474
mExpressionWidget->setField( attrName );
471-
connect( mExpressionWidget, SIGNAL( fieldChanged( QString ) ), this, SLOT( categoryColumnChanged( QString ) ) );
472-
473475

474476
// set source symbol
475477
if ( mRenderer->sourceSymbol() )
@@ -621,30 +623,20 @@ static void _createCategories( QgsCategoryList& cats, QList<QVariant>& values, Q
621623
}
622624
}
623625

624-
void QgsCategorizedSymbolRendererV2Widget::applyColorRampToCategories(const QgsCategoryList& cats )
626+
QgsVectorColorRampV2* QgsCategorizedSymbolRendererV2Widget::getColorRamp()
625627
{
626-
627628
QgsVectorColorRampV2* ramp = cboCategorizedColorRamp->currentColorRamp();
628-
bool invert = cbxInvertedColorRamp->isChecked();
629-
630629
if ( ramp == NULL )
631630
{
632631
if ( cboCategorizedColorRamp->count() == 0 )
633632
QMessageBox::critical( this, tr( "Error" ), tr( "There are no available color ramps. You can add them in Style Manager." ) );
634633
else
635634
QMessageBox::critical( this, tr( "Error" ), tr( "The selected color ramp is not available." ) );
636-
return;
637-
}
638-
639-
int num=cats.length()-1;
640-
for( int i=0; i <= num; i++ )
641-
{
642-
double x = ( invert ? num - i : i ) / ( double ) num;
643-
cats.at(i).symbol()->setColor(ramp->color( x ) );
644635
}
645-
636+
return ramp;
646637
}
647638

639+
648640
void QgsCategorizedSymbolRendererV2Widget::addCategories()
649641
{
650642
QString attrName = mExpressionWidget->currentField();
@@ -711,9 +703,12 @@ void QgsCategorizedSymbolRendererV2Widget::addCategories()
711703
deleteExisting = ( res == QMessageBox::Yes );
712704
}
713705

706+
// First element to apply coloring to
707+
bool keepExistingColors=false;
714708
if ( !deleteExisting )
715709
{
716710
QgsCategoryList prevCats = mRenderer->categories();
711+
keepExistingColors=prevCats.size() > 0;
717712
for ( int i = 0; i < cats.size(); ++i )
718713
{
719714
bool contains = false;
@@ -752,30 +747,30 @@ void QgsCategorizedSymbolRendererV2Widget::addCategories()
752747
// recreate renderer
753748
QgsCategorizedSymbolRendererV2 *r = new QgsCategorizedSymbolRendererV2( attrName, cats );
754749
r->setSourceSymbol( mCategorizedSymbol->clone() );
755-
QgsVectorColorRampV2* ramp = cboCategorizedColorRamp->currentColorRamp();
756-
if( ramp ) r->setSourceColorRamp( ramp->clone() );
757-
r->setInvertedColorRamp( cbxInvertedColorRamp->isChecked() );
758750
r->setScaleMethod( mRenderer->scaleMethod() );
759751
r->setSizeScaleField( mRenderer->sizeScaleField() );
760752
r->setRotationField( mRenderer->rotationField() );
761753
r->setInvertedColorRamp( cbxInvertedColorRamp->isChecked() );
754+
QgsVectorColorRampV2* ramp = getColorRamp();
755+
if( ramp ) r->setSourceColorRamp(ramp->clone());
762756

763757
if ( mModel )
764758
{
765759
mModel->setRenderer( r );
766760
}
767761
delete mRenderer;
768762
mRenderer = r;
763+
if( ! keepExistingColors && ramp ) applyColorRamp();
769764
}
770765

771766
void QgsCategorizedSymbolRendererV2Widget::applyColorRamp()
772767
{
773-
const QgsCategoryList& categories=mRenderer->categories();
774-
if( categories.length() > 0 )
768+
QgsVectorColorRampV2* ramp = getColorRamp();
769+
if( ramp )
775770
{
776-
applyColorRampToCategories( categories );
777-
mModel->updateSymbology();
771+
mRenderer->updateColorRamp(ramp->clone(),cbxInvertedColorRamp->isChecked());
778772
}
773+
mModel->updateSymbology();
779774
}
780775

781776
int QgsCategorizedSymbolRendererV2Widget::currentCategoryRow()

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ class GUI_EXPORT QgsCategorizedSymbolRendererV2Widget : public QgsRendererV2Widg
118118

119119
void changeCategorySymbol();
120120

121-
void applyColorRampToCategories( const QgsCategoryList& cats );
121+
QgsVectorColorRampV2* getColorRamp();
122122

123123
QList<QgsSymbolV2*> selectedSymbols();
124124
QgsCategoryList selectedCategoryList();

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

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,7 @@ QgsGraduatedSymbolRendererV2Widget::QgsGraduatedSymbolRendererV2Widget( QgsVecto
433433
connect( cboGraduatedMode, SIGNAL( currentIndexChanged( int ) ) , this, SLOT( classifyGraduated() ) );
434434
connect( cboGraduatedColorRamp, SIGNAL( currentIndexChanged( int ) ) , this, SLOT( reapplyColorRamp() ) );
435435
connect( cbxInvertedColorRamp, SIGNAL( toggled( bool ) ) , this, SLOT( reapplyColorRamp() ) );
436+
connect( spinDecimalPlaces, SIGNAL(valueChanged(int)), this, SLOT(decimalPlacesChanged()));
436437
connect( txtUnits, SIGNAL( textChanged(QString)), this, SLOT(unitsChanged(QString)));
437438

438439
// menus for data-defined rotation/size
@@ -491,6 +492,7 @@ void QgsGraduatedSymbolRendererV2Widget::updateUiFromRenderer()
491492
cbxInvertedColorRamp->setChecked( mRenderer->invertedColorRamp() );
492493
}
493494

495+
spinDecimalPlaces->setValue( mRenderer->decimalPlaces());
494496
txtUnits->setText( mRenderer->units() );
495497
}
496498

@@ -541,7 +543,7 @@ void QgsGraduatedSymbolRendererV2Widget::classifyGraduated()
541543
QApplication::setOverrideCursor( Qt::WaitCursor );
542544
QgsGraduatedSymbolRendererV2* r = QgsGraduatedSymbolRendererV2::createRenderer(
543545
mLayer, attrName, classes, mode, mGraduatedSymbol, ramp,
544-
cbxInvertedColorRamp->isChecked(), txtUnits->text() );
546+
cbxInvertedColorRamp->isChecked(), txtUnits->text(), spinDecimalPlaces->value() );
545547
QApplication::restoreOverrideCursor();
546548
if ( !r )
547549
{
@@ -708,8 +710,10 @@ void QgsGraduatedSymbolRendererV2Widget::changeRange( int rangeIdx )
708710
QgsLUDialog dialog( this );
709711

710712
const QgsRendererRangeV2& range = mRenderer->ranges()[rangeIdx];
711-
dialog.setLowerValue( QString::number( range.lowerValue(), 'f', 4 ) );
712-
dialog.setUpperValue( QString::number( range.upperValue(), 'f', 4 ) );
713+
// Add arbitrary 3 to number of decimal places to retain a bit extra accuracy in
714+
// case we want to??
715+
dialog.setLowerValue( QString::number( range.lowerValue(), 'f', mRenderer->decimalPlaces()+3 ) );
716+
dialog.setUpperValue( QString::number( range.upperValue(), 'f', mRenderer->decimalPlaces()+3 ) );
713717

714718
if ( dialog.exec() == QDialog::Accepted )
715719
{
@@ -789,6 +793,12 @@ void QgsGraduatedSymbolRendererV2Widget::scaleMethodChanged( QgsSymbolV2::ScaleM
789793
mRenderer->setScaleMethod( scaleMethod );
790794
}
791795

796+
void QgsGraduatedSymbolRendererV2Widget::decimalPlacesChanged()
797+
{
798+
mRenderer->setDecimalPlaces( spinDecimalPlaces->value() );
799+
mModel->updateLabels();
800+
}
801+
792802
void QgsGraduatedSymbolRendererV2Widget::unitsChanged(QString units)
793803
{
794804
mRenderer->setUnits(units);

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ class GUI_EXPORT QgsGraduatedSymbolRendererV2Widget : public QgsRendererV2Widget
102102
void rotationFieldChanged( QString fldName );
103103
void sizeScaleFieldChanged( QString fldName );
104104
void scaleMethodChanged( QgsSymbolV2::ScaleMethod scaleMethod );
105+
void decimalPlacesChanged();
105106
void unitsChanged( QString units );
106107

107108
void showSymbolLevels();

‎src/ui/qgsgraduatedsymbolrendererv2widget.ui

Lines changed: 58 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -140,29 +140,78 @@
140140
</item>
141141
</layout>
142142
</item>
143-
<item row="2" column="3">
144-
<widget class="QLineEdit" name="txtUnits"/>
143+
<item row="2" column="0">
144+
<widget class="QLabel" name="label_4">
145+
<property name="text">
146+
<string>Column</string>
147+
</property>
148+
</widget>
145149
</item>
146-
<item row="2" column="2">
147-
<widget class="QLabel" name="label">
150+
<item row="3" column="2">
151+
<widget class="QLabel" name="label_9">
148152
<property name="text">
149-
<string>Units</string>
153+
<string>Decimal places</string>
150154
</property>
151155
<property name="alignment">
152156
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
153157
</property>
158+
<property name="buddy">
159+
<cstring>spinDecimalPlaces</cstring>
160+
</property>
161+
</widget>
162+
</item>
163+
<item row="3" column="3">
164+
<widget class="QSpinBox" name="spinDecimalPlaces">
165+
<property name="sizePolicy">
166+
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
167+
<horstretch>0</horstretch>
168+
<verstretch>0</verstretch>
169+
</sizepolicy>
170+
</property>
171+
<property name="minimum">
172+
<number>0</number>
173+
</property>
174+
<property name="maximum">
175+
<number>10</number>
176+
</property>
177+
<property name="value">
178+
<number>4</number>
179+
</property>
180+
</widget>
181+
</item>
182+
<item row="3" column="1">
183+
<widget class="QLineEdit" name="txtUnits">
184+
<property name="alignment">
185+
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
186+
</property>
187+
</widget>
188+
</item>
189+
<item row="3" column="0">
190+
<widget class="QLabel" name="label">
191+
<property name="text">
192+
<string>Label units</string>
193+
</property>
194+
<property name="alignment">
195+
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
196+
</property>
154197
<property name="buddy">
155198
<cstring>txtUnits</cstring>
156199
</property>
157200
</widget>
158201
</item>
159-
<item row="2" column="1">
202+
<item row="2" column="1" colspan="2">
160203
<layout class="QHBoxLayout" name="horizontalLayout">
161204
<property name="topMargin">
162205
<number>0</number>
163206
</property>
164207
<item>
165208
<widget class="QgsFieldExpressionWidget" name="mExpressionWidget" native="true">
209+
<property name="minimumSize">
210+
<size>
211+
<width>0</width>
212+
<height>0</height>
213+
</size>
214+
</property>
166215
<property name="maximumSize">
167216
<size>
168217
<width>500</width>
@@ -186,13 +235,6 @@
186235
</item>
187236
</layout>
188237
</item>
189-
<item row="2" column="0">
190-
<widget class="QLabel" name="label_4">
191-
<property name="text">
192-
<string>Column</string>
193-
</property>
194-
</widget>
195-
</item>
196238
</layout>
197239
</item>
198240
<item>
@@ -298,11 +340,12 @@
298340
</customwidget>
299341
</customwidgets>
300342
<tabstops>
343+
<tabstop>txtUnits</tabstop>
344+
<tabstop>spinDecimalPlaces</tabstop>
301345
<tabstop>btnChangeGraduatedSymbol</tabstop>
346+
<tabstop>spinGraduatedClasses</tabstop>
302347
<tabstop>cboGraduatedColorRamp</tabstop>
303348
<tabstop>cbxInvertedColorRamp</tabstop>
304-
<tabstop>txtUnits</tabstop>
305-
<tabstop>spinGraduatedClasses</tabstop>
306349
<tabstop>cboGraduatedMode</tabstop>
307350
<tabstop>viewGraduated</tabstop>
308351
<tabstop>btnGraduatedClassify</tabstop>

0 commit comments

Comments
 (0)
Please sign in to comment.