diff --git a/python/core/symbology-ng/qgscategorizedsymbolrendererv2.sip b/python/core/symbology-ng/qgscategorizedsymbolrendererv2.sip index e36cde763156..8df8f711f1b5 100644 --- a/python/core/symbology-ng/qgscategorizedsymbolrendererv2.sip +++ b/python/core/symbology-ng/qgscategorizedsymbolrendererv2.sip @@ -120,6 +120,10 @@ class QgsCategorizedSymbolRendererV2 : QgsFeatureRendererV2 bool invertedColorRamp(); void setInvertedColorRamp( bool inverted ); + // Update the color ramp used and all symbols colors. + //! @note added in 2.5 + void updateColorRamp( QgsVectorColorRampV2* ramp, bool inverted = false ); + //! @note added in 1.6 void setRotationField( QString fieldOrExpression ); //! @note added in 1.6 @@ -147,6 +151,10 @@ class QgsCategorizedSymbolRendererV2 : QgsFeatureRendererV2 // @note added in 2.5 virtual void checkLegendSymbolItem( QString key, bool state = true ); + //! If supported by the renderer, return classification attribute for the use in legend + //! @note added in 2.6 + virtual QString legendClassificationAttribute() const; + //! creates a QgsCategorizedSymbolRendererV2 from an existing renderer. //! @note added in 2.5 //! @returns a new renderer if the conversion was possible, otherwise 0. diff --git a/python/core/symbology-ng/qgsgraduatedsymbolrendererv2.sip b/python/core/symbology-ng/qgsgraduatedsymbolrendererv2.sip index 7e84a8c5edb4..70fbcc8ad4fe 100644 --- a/python/core/symbology-ng/qgsgraduatedsymbolrendererv2.sip +++ b/python/core/symbology-ng/qgsgraduatedsymbolrendererv2.sip @@ -80,6 +80,8 @@ class QgsGraduatedSymbolRendererV2 : QgsFeatureRendererV2 bool updateRangeLowerValue( int rangeIndex, double value ); //! @note added in 2.5 bool updateRangeRenderState( int rangeIndex, bool render ); + QString defaultRangeLabel( const QgsRendererRangeV2 &range ); + void addClass( QgsSymbolV2* symbol ); //! @note available in python bindings as addClassRange @@ -106,6 +108,12 @@ class QgsGraduatedSymbolRendererV2 : QgsFeatureRendererV2 Mode mode() const; void setMode( Mode mode ); + QString units(); + void setUnits( QString units, bool updateRanges=true ); + + int decimalPlaces() const; + void setDecimalPlaces( int decimalPlaces, bool updateRanges=true ); + static QgsGraduatedSymbolRendererV2* createRenderer( QgsVectorLayer* vlayer, QString attrName, @@ -113,7 +121,9 @@ class QgsGraduatedSymbolRendererV2 : QgsFeatureRendererV2 Mode mode, QgsSymbolV2* symbol /Transfer/, QgsVectorColorRampV2* ramp /Transfer/, - bool inverted = false ) /Factory/; + bool inverted = false, + QString units = "", + int decimalPlaces = 4 ) /Factory/; //! create renderer from XML element static QgsFeatureRendererV2* create( QDomElement& element ) /Factory/; @@ -141,7 +151,7 @@ class QgsGraduatedSymbolRendererV2 : QgsFeatureRendererV2 /** Update the color ramp used. Also updates all symbols colors. * Doesn't alter current breaks. */ - void updateColorRamp( QgsVectorColorRampV2* ramp /Transfer/ ); + void updateColorRamp( QgsVectorColorRampV2* ramp /Transfer/, bool inverted = false ); /** Update the all symbols but leave breaks and colors. */ void updateSymbols( QgsSymbolV2* sym /Transfer/ ); @@ -178,6 +188,10 @@ class QgsGraduatedSymbolRendererV2 : QgsFeatureRendererV2 //! @returns a new renderer if the conversion was possible, otherwise 0. static QgsGraduatedSymbolRendererV2* convertFromRenderer( const QgsFeatureRendererV2 *renderer ) /Factory/; + //! If supported by the renderer, return classification attribute for the use in legend + //! @note added in 2.6 + virtual QString legendClassificationAttribute(); + protected: QgsSymbolV2* symbolForValue( double value ); diff --git a/python/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.sip b/python/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.sip index 87c1b5ab6395..8ca4b45f4ab7 100644 --- a/python/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.sip +++ b/python/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.sip @@ -18,6 +18,7 @@ class QgsCategorizedSymbolRendererV2Widget : QgsRendererV2Widget void categoriesDoubleClicked( const QModelIndex & idx ); void addCategory(); void addCategories(); + void applyColorRamp(); void deleteCategories(); void deleteAllCategories(); @@ -49,6 +50,8 @@ class QgsCategorizedSymbolRendererV2Widget : QgsRendererV2Widget void changeCategorySymbol(); + QgsVectorColorRampV2* getColorRamp(); + QList selectedSymbols(); QgsCategoryList selectedCategoryList(); void refreshSymbolView(); diff --git a/python/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.sip b/python/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.sip index 3b4e7702228a..923c1e795904 100644 --- a/python/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.sip +++ b/python/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.sip @@ -26,10 +26,14 @@ class QgsGraduatedSymbolRendererV2Widget : QgsRendererV2Widget void deleteClasses(); /**Removes all classes from the classification*/ void deleteAllClasses(); + /**Toggle the link between classes boundaries */ + void toggleBoundariesLink( bool linked ); void rotationFieldChanged( QString fldName ); void sizeScaleFieldChanged( QString fldName ); void scaleMethodChanged( QgsSymbolV2::ScaleMethod scaleMethod ); + void decimalPlacesChanged(); + void unitsChanged( QString units ); void showSymbolLevels(); diff --git a/src/core/symbology-ng/qgscategorizedsymbolrendererv2.cpp b/src/core/symbology-ng/qgscategorizedsymbolrendererv2.cpp index 4e07543831e5..dd26defe54b6 100644 --- a/src/core/symbology-ng/qgscategorizedsymbolrendererv2.cpp +++ b/src/core/symbology-ng/qgscategorizedsymbolrendererv2.cpp @@ -168,7 +168,7 @@ void QgsCategorizedSymbolRendererV2::rebuildHash() { mSymbolHash.clear(); - for ( int i = 0; i < mCategories.count(); ++i ) + for ( int i = 0; i < mCategories.size(); ++i ) { QgsRendererCategoryV2& cat = mCategories[i]; mSymbolHash.insert( cat.value().toString(), ( cat.renderState() || mCounting ) ? cat.symbol() : &sSkipRender ); @@ -181,7 +181,7 @@ QgsSymbolV2* QgsCategorizedSymbolRendererV2::symbolForValue( QVariant value ) QHash::iterator it = mSymbolHash.find( value.toString() ); if ( it == mSymbolHash.end() ) { - if ( mSymbolHash.count() == 0 ) + if ( mSymbolHash.size() == 0 ) { QgsDebugMsg( "there are no hashed symbols!!!" ); } @@ -689,11 +689,27 @@ QgsVectorColorRampV2* QgsCategorizedSymbolRendererV2::sourceColorRamp() { return mSourceColorRamp.data(); } + void QgsCategorizedSymbolRendererV2::setSourceColorRamp( QgsVectorColorRampV2* ramp ) { mSourceColorRamp.reset( ramp ); } +void QgsCategorizedSymbolRendererV2::updateColorRamp( QgsVectorColorRampV2* ramp, bool inverted ) +{ + setSourceColorRamp(ramp); + setInvertedColorRamp(inverted); + double num=mCategories.count()-1; + double count = 0; + foreach ( const QgsRendererCategoryV2 &cat, mCategories ) + { + double value=count/num; + if( mInvertedColorRamp ) value=1.0-value; + cat.symbol()->setColor(mSourceColorRamp->color(value)); + count += 1; + } +} + void QgsCategorizedSymbolRendererV2::setRotationField( QString fieldOrExpression ) { mRotation.reset( QgsSymbolLayerV2Utils::fieldOrExpressionToExpression( fieldOrExpression ) ); @@ -777,5 +793,16 @@ QgsCategorizedSymbolRendererV2* QgsCategorizedSymbolRendererV2::convertFromRende const QgsInvertedPolygonRenderer* invertedPolygonRenderer = dynamic_cast( renderer ); return convertFromRenderer( invertedPolygonRenderer->embeddedRenderer() ); } - return 0; + + // If not one of the specifically handled renderers, then just grab the symbol from the renderer + // Could have applied this to specific renderer types (singleSymbol, graduatedSymbo) + + QgsCategorizedSymbolRendererV2* r =new QgsCategorizedSymbolRendererV2( "", QgsCategoryList() ); + QgsSymbolV2List symbols=const_cast(renderer)->symbols(); + if( symbols.size() > 0 ) + { + r->setSourceSymbol(symbols.at(0)->clone()); + } + return r; + } diff --git a/src/core/symbology-ng/qgscategorizedsymbolrendererv2.h b/src/core/symbology-ng/qgscategorizedsymbolrendererv2.h index 2c3b79109345..2a0e3ef77ccd 100644 --- a/src/core/symbology-ng/qgscategorizedsymbolrendererv2.h +++ b/src/core/symbology-ng/qgscategorizedsymbolrendererv2.h @@ -142,8 +142,6 @@ class CORE_EXPORT QgsCategorizedSymbolRendererV2 : public QgsFeatureRendererV2 QgsSymbolV2* sourceSymbol(); void setSourceSymbol( QgsSymbolV2* sym ); - //! @note added in 2.5 - void updateSymbols( QgsSymbolV2* sym ); QgsVectorColorRampV2* sourceColorRamp(); void setSourceColorRamp( QgsVectorColorRampV2* ramp ); @@ -152,9 +150,10 @@ class CORE_EXPORT QgsCategorizedSymbolRendererV2 : public QgsFeatureRendererV2 bool invertedColorRamp() { return mInvertedColorRamp; } void setInvertedColorRamp( bool inverted ) { mInvertedColorRamp = inverted; } - // Update the color ramp used. Also updates all symbols colors. - // @note added in 2.5 + // Update the color ramp used and all symbols colors. + //! @note added in 2.5 void updateColorRamp( QgsVectorColorRampV2* ramp, bool inverted = false ); + //! @note added in 1.6 void setRotationField( QString fieldOrExpression ); //! @note added in 1.6 diff --git a/src/core/symbology-ng/qgsgraduatedsymbolrendererv2.cpp b/src/core/symbology-ng/qgsgraduatedsymbolrendererv2.cpp index a379d44ed0b1..baf94efeef53 100644 --- a/src/core/symbology-ng/qgsgraduatedsymbolrendererv2.cpp +++ b/src/core/symbology-ng/qgsgraduatedsymbolrendererv2.cpp @@ -164,6 +164,7 @@ QgsGraduatedSymbolRendererV2::QgsGraduatedSymbolRendererV2( QString attrName, Qg mMode( Custom ), mInvertedColorRamp( false ), mUnits(""), + mDecimalPlaces(4), mScaleMethod( DEFAULT_SCALE_METHOD ) { // TODO: check ranges for sanity (NULL symbols, invalid ranges) @@ -360,7 +361,9 @@ bool QgsGraduatedSymbolRendererV2::updateRangeRenderState( int rangeIndex, bool QString QgsGraduatedSymbolRendererV2::defaultRangeLabel(const QgsRendererRangeV2 & range ) { - return QString::number( range.lowerValue(), 'f', 4 ) + " - " + QString::number( range.upperValue(), 'f', 4 ) + mUnits; + int ndp=mDecimalPlaces; + return QString::number( range.lowerValue(), 'f', mDecimalPlaces ) + + " - " + QString::number( range.upperValue(), 'f', mDecimalPlaces ) + mUnits; } QString QgsGraduatedSymbolRendererV2::dump() const @@ -387,6 +390,7 @@ QgsFeatureRendererV2* QgsGraduatedSymbolRendererV2::clone() const r->setSizeScaleField( sizeScaleField() ); r->setScaleMethod( scaleMethod() ); r->setUnits( units(), false ); + r->setDecimalPlaces( decimalPlaces(), false ); return r; } @@ -814,7 +818,8 @@ QgsGraduatedSymbolRendererV2* QgsGraduatedSymbolRendererV2::createRenderer( QgsSymbolV2* symbol, QgsVectorColorRampV2* ramp, bool inverted, - QString units ) + QString units, + int decimalPlaces ) { if ( classes < 1 ) return NULL; @@ -910,6 +915,7 @@ QgsGraduatedSymbolRendererV2* QgsGraduatedSymbolRendererV2::createRenderer( r->setInvertedColorRamp( inverted ); r->setMode( mode ); r->setUnits( units ); + r->setDecimalPlaces( decimalPlaces ); // "breaks" list contains all values at class breaks plus maximum as last break int i = 0; @@ -1043,11 +1049,13 @@ QgsFeatureRendererV2* QgsGraduatedSymbolRendererV2::create( QDomElement& element r->setSizeScaleField( sizeScaleElem.attribute( "field" ) ); r->setScaleMethod( QgsSymbolLayerV2Utils::decodeScaleMethod( sizeScaleElem.attribute( "scalemethod" ) ) ); - QDomElement unitsElem = element.firstChildElement( "units" ); - if( ! unitsElem.isNull() ) + QDomElement labelSettingsElem = element.firstChildElement( "labelsettings" ); + if( ! labelSettingsElem.isNull() ) { - QString unitString=unitsElem.attribute("name"); + QString unitString=labelSettingsElem.attribute("units"); r->setUnits(unitString, false); + int decimalPlaces=labelSettingsElem.attribute("decimalplaces").toInt(); + r->setDecimalPlaces(decimalPlaces,false); } // TODO: symbol levels return r; @@ -1136,9 +1144,10 @@ QDomElement QgsGraduatedSymbolRendererV2::save( QDomDocument& doc ) sizeScaleElem.setAttribute( "scalemethod", QgsSymbolLayerV2Utils::encodeScaleMethod( mScaleMethod ) ); rendererElem.appendChild( sizeScaleElem ); - QDomElement unitsElem=doc.createElement("units"); - unitsElem.setAttribute("name",mUnits); - rendererElem.appendChild( unitsElem ); + QDomElement labelSettingsElem=doc.createElement("labelsettings"); + labelSettingsElem.setAttribute("units",mUnits); + labelSettingsElem.setAttribute("decimalplaces",mDecimalPlaces); + rendererElem.appendChild( labelSettingsElem ); return rendererElem; } @@ -1297,7 +1306,7 @@ void QgsGraduatedSymbolRendererV2::deleteAllClasses() void QgsGraduatedSymbolRendererV2::setUnits( QString units, bool updateRanges ) { - if( updateRanges ) + if( updateRanges && units != mUnits ) { for ( QgsRangeList::iterator it = mRanges.begin(); it != mRanges.end(); ++it ) { @@ -1312,6 +1321,29 @@ void QgsGraduatedSymbolRendererV2::setUnits( QString units, bool updateRanges ) mUnits=units; } +void QgsGraduatedSymbolRendererV2::setDecimalPlaces( int decimalPlaces, bool updateRanges ) +{ + if( decimalPlaces < 0 ) decimalPlaces=0; + if( decimalPlaces > 10 ) decimalPlaces=10; + + if( updateRanges && decimalPlaces != mDecimalPlaces ) + { + int saveDecimalPlaces=mDecimalPlaces; + for ( QgsRangeList::iterator it = mRanges.begin(); it != mRanges.end(); ++it ) + { + QString label=it->label(); + QString defaultLabel=defaultRangeLabel(*it); + if( label == defaultLabel ) + { + mDecimalPlaces=decimalPlaces; + it->setLabel(defaultRangeLabel(*it)); + mDecimalPlaces=saveDecimalPlaces; + } + } + } + mDecimalPlaces=decimalPlaces; +} + void QgsGraduatedSymbolRendererV2::moveClass( int from, int to ) { if ( from < 0 || from >= mRanges.size() || to < 0 || to >= mRanges.size() ) return; @@ -1379,5 +1411,16 @@ QgsGraduatedSymbolRendererV2* QgsGraduatedSymbolRendererV2::convertFromRenderer( const QgsInvertedPolygonRenderer* invertedPolygonRenderer = dynamic_cast( renderer ); return convertFromRenderer( invertedPolygonRenderer->embeddedRenderer() ); } - return 0; + + // If not one of the specifically handled renderers, then just grab the symbol from the renderer + // Could have applied this to specific renderer types (singleSymbol, graduatedSymbo) + + QgsGraduatedSymbolRendererV2* r =new QgsGraduatedSymbolRendererV2( "", QgsRangeList() ); + QgsSymbolV2List symbols=const_cast(renderer)->symbols(); + if( symbols.size() > 0 ) + { + r->setSourceSymbol(symbols.at(0)->clone()); + } + return r; + } diff --git a/src/core/symbology-ng/qgsgraduatedsymbolrendererv2.h b/src/core/symbology-ng/qgsgraduatedsymbolrendererv2.h index 59f7226e2531..6ae6de63bd07 100644 --- a/src/core/symbology-ng/qgsgraduatedsymbolrendererv2.h +++ b/src/core/symbology-ng/qgsgraduatedsymbolrendererv2.h @@ -135,6 +135,9 @@ class CORE_EXPORT QgsGraduatedSymbolRendererV2 : public QgsFeatureRendererV2 QString units() const { return mUnits; } void setUnits( QString units, bool updateRanges=true ); + int decimalPlaces() const { return mDecimalPlaces; }; + void setDecimalPlaces( int decimalPlaces, bool updateRanges=true ); + static QgsGraduatedSymbolRendererV2* createRenderer( QgsVectorLayer* vlayer, QString attrName, @@ -143,7 +146,8 @@ class CORE_EXPORT QgsGraduatedSymbolRendererV2 : public QgsFeatureRendererV2 QgsSymbolV2* symbol, QgsVectorColorRampV2* ramp, bool inverted = false, - QString units = ""); + QString units = "", + int decimalPlaces = 4); //! create renderer from XML element static QgsFeatureRendererV2* create( QDomElement& element ); @@ -215,6 +219,7 @@ class CORE_EXPORT QgsGraduatedSymbolRendererV2 : public QgsFeatureRendererV2 protected: QString mAttrName; QString mUnits; + int mDecimalPlaces; QgsRangeList mRanges; Mode mMode; QScopedPointer mSourceSymbol; diff --git a/src/core/symbology-ng/qgssinglesymbolrendererv2.cpp b/src/core/symbology-ng/qgssinglesymbolrendererv2.cpp index 93d90548b91b..968cb1beb721 100644 --- a/src/core/symbology-ng/qgssinglesymbolrendererv2.cpp +++ b/src/core/symbology-ng/qgssinglesymbolrendererv2.cpp @@ -393,5 +393,11 @@ QgsSingleSymbolRendererV2* QgsSingleSymbolRendererV2::convertFromRenderer( const return convertFromRenderer( invertedPolygonRenderer->embeddedRenderer() ); } + + QgsSymbolV2List symbols=const_cast(renderer)->symbols(); + if( symbols.size() > 0 ) + { + return new QgsSingleSymbolRendererV2(symbols.at(0)->clone()); + } return 0; } diff --git a/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.cpp b/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.cpp index f9315fb367cd..4a6a7183a24b 100644 --- a/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.cpp +++ b/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.cpp @@ -410,8 +410,14 @@ QgsCategorizedSymbolRendererV2Widget::QgsCategorizedSymbolRendererV2Widget( QgsV cboCategorizedColorRamp->setCurrentIndex( index ); } + mCategorizedSymbol = QgsSymbolV2::defaultSymbol( mLayer->geometryType() ); + mModel = new QgsCategorizedSymbolRendererV2Model( this ); mModel->setRenderer( mRenderer ); + + // update GUI from renderer + updateUiFromRenderer(); + viewCategories->setModel( mModel ); viewCategories->resizeColumnToContents( 0 ); viewCategories->resizeColumnToContents( 1 ); @@ -419,8 +425,6 @@ QgsCategorizedSymbolRendererV2Widget::QgsCategorizedSymbolRendererV2Widget( QgsV viewCategories->setStyle( new QgsCategorizedSymbolRendererV2ViewStyle( viewCategories->style() ) ); - mCategorizedSymbol = QgsSymbolV2::defaultSymbol( mLayer->geometryType() ); - connect( mModel, SIGNAL( rowsMoved() ), this, SLOT( rowsMoved() ) ); connect( mExpressionWidget, SIGNAL( fieldChanged( QString ) ), this, SLOT( categoryColumnChanged( QString ) ) ); @@ -436,9 +440,6 @@ QgsCategorizedSymbolRendererV2Widget::QgsCategorizedSymbolRendererV2Widget( QgsV connect( cbxInvertedColorRamp, SIGNAL( toggled(bool)), this, SLOT( applyColorRamp())); connect( cboCategorizedColorRamp, SIGNAL(currentIndexChanged(int)), this, SLOT( applyColorRamp())); - // update GUI from renderer - updateUiFromRenderer(); - // menus for data-defined rotation/size QMenu* advMenu = new QMenu; @@ -460,16 +461,17 @@ QgsCategorizedSymbolRendererV2Widget::~QgsCategorizedSymbolRendererV2Widget() void QgsCategorizedSymbolRendererV2Widget::updateUiFromRenderer() { + // Note: This assumes that the signals for UI element changes have not + // yet been connected, so that the updates to color ramp, symbol, etc + // don't override existing customisations. + updateCategorizedSymbolIcon(); //mModel->setRenderer ( mRenderer ); // necessary? // set column - disconnect( mExpressionWidget, SIGNAL( fieldChanged( QString ) ), this, SLOT( categoryColumnChanged( QString ) ) ); QString attrName = mRenderer->classAttribute(); mExpressionWidget->setField( attrName ); - connect( mExpressionWidget, SIGNAL( fieldChanged( QString ) ), this, SLOT( categoryColumnChanged( QString ) ) ); - // set source symbol if ( mRenderer->sourceSymbol() ) @@ -621,30 +623,20 @@ static void _createCategories( QgsCategoryList& cats, QList& values, Q } } -void QgsCategorizedSymbolRendererV2Widget::applyColorRampToCategories(const QgsCategoryList& cats ) +QgsVectorColorRampV2* QgsCategorizedSymbolRendererV2Widget::getColorRamp() { - QgsVectorColorRampV2* ramp = cboCategorizedColorRamp->currentColorRamp(); - bool invert = cbxInvertedColorRamp->isChecked(); - if ( ramp == NULL ) { if ( cboCategorizedColorRamp->count() == 0 ) QMessageBox::critical( this, tr( "Error" ), tr( "There are no available color ramps. You can add them in Style Manager." ) ); else QMessageBox::critical( this, tr( "Error" ), tr( "The selected color ramp is not available." ) ); - return; - } - - int num=cats.length()-1; - for( int i=0; i <= num; i++ ) - { - double x = ( invert ? num - i : i ) / ( double ) num; - cats.at(i).symbol()->setColor(ramp->color( x ) ); } - + return ramp; } + void QgsCategorizedSymbolRendererV2Widget::addCategories() { QString attrName = mExpressionWidget->currentField(); @@ -711,9 +703,12 @@ void QgsCategorizedSymbolRendererV2Widget::addCategories() deleteExisting = ( res == QMessageBox::Yes ); } + // First element to apply coloring to + bool keepExistingColors=false; if ( !deleteExisting ) { QgsCategoryList prevCats = mRenderer->categories(); + keepExistingColors=prevCats.size() > 0; for ( int i = 0; i < cats.size(); ++i ) { bool contains = false; @@ -752,13 +747,12 @@ void QgsCategorizedSymbolRendererV2Widget::addCategories() // recreate renderer QgsCategorizedSymbolRendererV2 *r = new QgsCategorizedSymbolRendererV2( attrName, cats ); r->setSourceSymbol( mCategorizedSymbol->clone() ); - QgsVectorColorRampV2* ramp = cboCategorizedColorRamp->currentColorRamp(); - if( ramp ) r->setSourceColorRamp( ramp->clone() ); - r->setInvertedColorRamp( cbxInvertedColorRamp->isChecked() ); r->setScaleMethod( mRenderer->scaleMethod() ); r->setSizeScaleField( mRenderer->sizeScaleField() ); r->setRotationField( mRenderer->rotationField() ); r->setInvertedColorRamp( cbxInvertedColorRamp->isChecked() ); + QgsVectorColorRampV2* ramp = getColorRamp(); + if( ramp ) r->setSourceColorRamp(ramp->clone()); if ( mModel ) { @@ -766,16 +760,17 @@ void QgsCategorizedSymbolRendererV2Widget::addCategories() } delete mRenderer; mRenderer = r; + if( ! keepExistingColors && ramp ) applyColorRamp(); } void QgsCategorizedSymbolRendererV2Widget::applyColorRamp() { - const QgsCategoryList& categories=mRenderer->categories(); - if( categories.length() > 0 ) + QgsVectorColorRampV2* ramp = getColorRamp(); + if( ramp ) { - applyColorRampToCategories( categories ); - mModel->updateSymbology(); + mRenderer->updateColorRamp(ramp->clone(),cbxInvertedColorRamp->isChecked()); } + mModel->updateSymbology(); } int QgsCategorizedSymbolRendererV2Widget::currentCategoryRow() diff --git a/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.h b/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.h index 935880eed10e..2b64f46545c9 100644 --- a/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.h +++ b/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.h @@ -118,7 +118,7 @@ class GUI_EXPORT QgsCategorizedSymbolRendererV2Widget : public QgsRendererV2Widg void changeCategorySymbol(); - void applyColorRampToCategories( const QgsCategoryList& cats ); + QgsVectorColorRampV2* getColorRamp(); QList selectedSymbols(); QgsCategoryList selectedCategoryList(); diff --git a/src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.cpp b/src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.cpp index 0faafcace5c1..c22172caad65 100644 --- a/src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.cpp +++ b/src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.cpp @@ -433,6 +433,7 @@ QgsGraduatedSymbolRendererV2Widget::QgsGraduatedSymbolRendererV2Widget( QgsVecto connect( cboGraduatedMode, SIGNAL( currentIndexChanged( int ) ) , this, SLOT( classifyGraduated() ) ); connect( cboGraduatedColorRamp, SIGNAL( currentIndexChanged( int ) ) , this, SLOT( reapplyColorRamp() ) ); connect( cbxInvertedColorRamp, SIGNAL( toggled( bool ) ) , this, SLOT( reapplyColorRamp() ) ); + connect( spinDecimalPlaces, SIGNAL(valueChanged(int)), this, SLOT(decimalPlacesChanged())); connect( txtUnits, SIGNAL( textChanged(QString)), this, SLOT(unitsChanged(QString))); // menus for data-defined rotation/size @@ -491,6 +492,7 @@ void QgsGraduatedSymbolRendererV2Widget::updateUiFromRenderer() cbxInvertedColorRamp->setChecked( mRenderer->invertedColorRamp() ); } + spinDecimalPlaces->setValue( mRenderer->decimalPlaces()); txtUnits->setText( mRenderer->units() ); } @@ -541,7 +543,7 @@ void QgsGraduatedSymbolRendererV2Widget::classifyGraduated() QApplication::setOverrideCursor( Qt::WaitCursor ); QgsGraduatedSymbolRendererV2* r = QgsGraduatedSymbolRendererV2::createRenderer( mLayer, attrName, classes, mode, mGraduatedSymbol, ramp, - cbxInvertedColorRamp->isChecked(), txtUnits->text() ); + cbxInvertedColorRamp->isChecked(), txtUnits->text(), spinDecimalPlaces->value() ); QApplication::restoreOverrideCursor(); if ( !r ) { @@ -708,8 +710,10 @@ void QgsGraduatedSymbolRendererV2Widget::changeRange( int rangeIdx ) QgsLUDialog dialog( this ); const QgsRendererRangeV2& range = mRenderer->ranges()[rangeIdx]; - dialog.setLowerValue( QString::number( range.lowerValue(), 'f', 4 ) ); - dialog.setUpperValue( QString::number( range.upperValue(), 'f', 4 ) ); + // Add arbitrary 3 to number of decimal places to retain a bit extra accuracy in + // case we want to?? + dialog.setLowerValue( QString::number( range.lowerValue(), 'f', mRenderer->decimalPlaces()+3 ) ); + dialog.setUpperValue( QString::number( range.upperValue(), 'f', mRenderer->decimalPlaces()+3 ) ); if ( dialog.exec() == QDialog::Accepted ) { @@ -789,6 +793,12 @@ void QgsGraduatedSymbolRendererV2Widget::scaleMethodChanged( QgsSymbolV2::ScaleM mRenderer->setScaleMethod( scaleMethod ); } +void QgsGraduatedSymbolRendererV2Widget::decimalPlacesChanged() +{ + mRenderer->setDecimalPlaces( spinDecimalPlaces->value() ); + mModel->updateLabels(); +} + void QgsGraduatedSymbolRendererV2Widget::unitsChanged(QString units) { mRenderer->setUnits(units); diff --git a/src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.h b/src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.h index aae513b33f5c..315505867c04 100644 --- a/src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.h +++ b/src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.h @@ -102,6 +102,7 @@ class GUI_EXPORT QgsGraduatedSymbolRendererV2Widget : public QgsRendererV2Widget void rotationFieldChanged( QString fldName ); void sizeScaleFieldChanged( QString fldName ); void scaleMethodChanged( QgsSymbolV2::ScaleMethod scaleMethod ); + void decimalPlacesChanged(); void unitsChanged( QString units ); void showSymbolLevels(); diff --git a/src/ui/qgsgraduatedsymbolrendererv2widget.ui b/src/ui/qgsgraduatedsymbolrendererv2widget.ui index 182c0fbb47e6..55ecf3582f3d 100644 --- a/src/ui/qgsgraduatedsymbolrendererv2widget.ui +++ b/src/ui/qgsgraduatedsymbolrendererv2widget.ui @@ -140,29 +140,78 @@ - - + + + + Column + + - - + + - Units + Decimal places Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + spinDecimalPlaces + + + + + + + + 0 + 0 + + + + 0 + + + 10 + + + 4 + + + + + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + Label units + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + txtUnits - + 0 + + + 0 + 0 + + 500 @@ -186,13 +235,6 @@ - - - - Column - - - @@ -298,11 +340,12 @@ + txtUnits + spinDecimalPlaces btnChangeGraduatedSymbol + spinGraduatedClasses cboGraduatedColorRamp cbxInvertedColorRamp - txtUnits - spinGraduatedClasses cboGraduatedMode viewGraduated btnGraduatedClassify