Skip to content

Commit a5911e7

Browse files
committed
Implementation of graduated renderer breakpoint editor, minus SIP for editor
1 parent 2f706bc commit a5911e7

File tree

8 files changed

+420
-46
lines changed

8 files changed

+420
-46
lines changed

python/core/symbology-ng/qgsgraduatedsymbolrendererv2.sip

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -108,12 +108,31 @@ class QgsGraduatedSymbolRendererV2 : QgsFeatureRendererV2
108108
Mode mode() const;
109109
void setMode( Mode mode );
110110
void updateClasses( QgsVectorLayer *vlayer, Mode mode, int nclasses );
111-
112-
QString units();
111+
//! Evaluates the data expression and returns the list of values from the layer
112+
//! @param vlayer The layer for which to evaluate the expression
113+
//! @note Added in 2.6
114+
QList<double> getDataValues( QgsVectorLayer *vlayer );
115+
116+
//! Return the units string used to generate default classification labels
117+
//! @note Added in 2.6
118+
QString units() const ;
119+
//! Set the units string used to generate default classification labels
120+
//! @param units The string appended to classification labels
121+
//! @param updateRanges If true then ranges ending with the old unit string are updated to the new.
122+
//! @note Added in 2.6
113123
void setUnits( QString units, bool updateRanges=true );
114124

125+
//! Return the number of decimal places used to generate labels
126+
//! @note Added in 2.6
115127
int decimalPlaces() const;
128+
//! Reset the number of decimal places used to generate labels
129+
//! @param decimalPlaces the number of decimal places
130+
//! @param updateRanges if true then ranges currently using the default label will be updated
131+
//! @note Added in 2.6
116132
void setDecimalPlaces( int decimalPlaces, bool updateRanges=true );
133+
//! Determine an appropriate number of decimal places based on the minimum class interval
134+
//! @param updateRanges if true then ranges currently using the default label will be updated
135+
//! @note Added in 2.6
117136
void calculateDecimalPlaces( bool updateRanges=true );
118137

119138
static QgsGraduatedSymbolRendererV2* createRenderer(
@@ -153,9 +172,9 @@ class QgsGraduatedSymbolRendererV2 : QgsFeatureRendererV2
153172
/** Update the color ramp used. Also updates all symbols colors.
154173
* Doesn't alter current breaks.
155174
*/
156-
void updateColorRamp( QgsVectorColorRampV2* ramp /Transfer/, bool inverted = false );
175+
void updateColorRamp( QgsVectorColorRampV2* ramp /Transfer/ = 0, bool inverted = false );
157176

158-
/** Update the all symbols but leave breaks and colors. */
177+
/** Update all the symbols but leave breaks and colors. */
159178
void updateSymbols( QgsSymbolV2* sym /Transfer/ );
160179

161180
//! @note added in 1.6

src/core/symbology-ng/qgsgraduatedsymbolrendererv2.cpp

Lines changed: 45 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -833,40 +833,61 @@ QgsGraduatedSymbolRendererV2* QgsGraduatedSymbolRendererV2::createRenderer(
833833
return r;
834834
}
835835

836+
QList<double> QgsGraduatedSymbolRendererV2::getDataValues( QgsVectorLayer *vlayer )
837+
{
838+
QList<double> values;
839+
QScopedPointer<QgsExpression> expression;
840+
int attrNum = vlayer->fieldNameIndex( mAttrName );
841+
842+
if ( attrNum == -1 )
843+
{
844+
// try to use expression
845+
expression.reset( new QgsExpression( mAttrName ) );
846+
if ( expression->hasParserError() || !expression->prepare( vlayer->pendingFields() ) )
847+
return values; // should have a means to report errors
848+
}
849+
850+
QgsFeature f;
851+
QStringList lst;
852+
if ( expression.isNull() )
853+
lst.append( mAttrName );
854+
else
855+
lst = expression->referencedColumns();
856+
857+
QgsFeatureIterator fit = vlayer->getFeatures( QgsFeatureRequest().setFlags( QgsFeatureRequest::NoGeometry ).setSubsetOfAttributes( lst, vlayer->pendingFields() ) );
858+
859+
// create list of non-null attribute values
860+
while ( fit.nextFeature( f ) )
861+
{
862+
QVariant v = expression.isNull() ? f.attribute( attrNum ) : expression->evaluate( f );
863+
if ( !v.isNull() )
864+
values.append( v.toDouble() );
865+
}
866+
return values;
867+
}
836868

837869
void QgsGraduatedSymbolRendererV2::updateClasses( QgsVectorLayer *vlayer, Mode mode, int nclasses )
838870
{
839871
// Custom classes are not recalculated
840872
setMode(mode);
841873
if( mode == Custom ) return;
842874

843-
844-
845875
if ( nclasses < 1 ) nclasses=1;
846876

847-
int attrNum = vlayer->fieldNameIndex( mAttrName );
877+
QList<double> values;
878+
bool valuesLoaded=false;
848879
double minimum;
849880
double maximum;
850881

851-
QScopedPointer<QgsExpression> expression;
882+
int attrNum = vlayer->fieldNameIndex( mAttrName );
852883

853884
if ( attrNum == -1 )
854885
{
855-
// try to use expression
856-
expression.reset( new QgsExpression( mAttrName ) );
857-
if ( expression->hasParserError() || !expression->prepare( vlayer->pendingFields() ) )
858-
return; // should have a means to report errors
859-
860-
QList<double> values;
861-
QgsFeatureIterator fit = vlayer->getFeatures();
862-
QgsFeature feature;
863-
while ( fit.nextFeature( feature ) )
864-
{
865-
values << expression->evaluate( feature ).toDouble();
866-
}
886+
values=getDataValues( vlayer );
867887
qSort( values );
868888
minimum = values.first();
869889
maximum = values.last();
890+
valuesLoaded=true;
870891
}
871892
else
872893
{
@@ -888,22 +909,11 @@ void QgsGraduatedSymbolRendererV2::updateClasses( QgsVectorLayer *vlayer, Mode m
888909
else if ( mode == Quantile || mode == Jenks || mode == StdDev )
889910
{
890911
// get values from layer
891-
QList<double> values;
892-
QgsFeature f;
893-
QStringList lst;
894-
if ( expression.isNull() )
895-
lst.append( mAttrName );
896-
else
897-
lst = expression->referencedColumns();
898912

899-
QgsFeatureIterator fit = vlayer->getFeatures( QgsFeatureRequest().setFlags( QgsFeatureRequest::NoGeometry ).setSubsetOfAttributes( lst, vlayer->pendingFields() ) );
900913

901-
// create list of non-null attribute values
902-
while ( fit.nextFeature( f ) )
914+
if( ! valuesLoaded )
903915
{
904-
QVariant v = expression.isNull() ? f.attribute( attrNum ) : expression->evaluate( f );
905-
if ( !v.isNull() )
906-
values.append( v.toDouble() );
916+
values=getDataValues( vlayer );
907917
}
908918

909919
// calculate the breaks
@@ -928,7 +938,7 @@ void QgsGraduatedSymbolRendererV2::updateClasses( QgsVectorLayer *vlayer, Mode m
928938

929939
double lower, upper = minimum;
930940
QString label;
931-
mRanges.clear();
941+
deleteAllClasses();
932942

933943
// "breaks" list contains all values at class breaks plus maximum as last break
934944

@@ -1211,8 +1221,11 @@ void QgsGraduatedSymbolRendererV2::setSourceColorRamp( QgsVectorColorRampV2* ram
12111221
void QgsGraduatedSymbolRendererV2::updateColorRamp( QgsVectorColorRampV2 *ramp, bool inverted )
12121222
{
12131223
int i = 0;
1214-
if( ramp ) this->setSourceColorRamp( ramp );
1215-
this->setInvertedColorRamp( inverted );
1224+
if( ramp )
1225+
{
1226+
this->setSourceColorRamp( ramp );
1227+
this->setInvertedColorRamp( inverted );
1228+
}
12161229

12171230
foreach ( QgsRendererRangeV2 range, mRanges )
12181231
{

src/core/symbology-ng/qgsgraduatedsymbolrendererv2.h

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -131,13 +131,37 @@ class CORE_EXPORT QgsGraduatedSymbolRendererV2 : public QgsFeatureRendererV2
131131

132132
Mode mode() const { return mMode; }
133133
void setMode( Mode mode ) { mMode = mode; }
134+
//! Recalculate classes for a layer
135+
//! @param vlayer The layer being rendered (from which data values are calculated)
136+
//! @param mode The calculation mode
137+
//! @param nclasses The number of classes to calculate (approximate for some modes)
138+
//! @note Added in 2.6
134139
void updateClasses( QgsVectorLayer *vlayer, Mode mode, int nclasses );
140+
//! Evaluates the data expression and returns the list of values from the layer
141+
//! @param vlayer The layer for which to evaluate the expression
142+
//! @note Added in 2.6
143+
QList<double> getDataValues( QgsVectorLayer *vlayer );
135144

145+
//! Return the units string used to generate default classification labels
146+
//! @note Added in 2.6
136147
QString units() const { return mUnits; }
148+
//! Set the units string used to generate default classification labels
149+
//! @param units The string appended to classification labels
150+
//! @param updateRanges If true then ranges ending with the old unit string are updated to the new.
151+
//! @note Added in 2.6
137152
void setUnits( QString units, bool updateRanges=true );
138153

154+
//! Return the number of decimal places used to generate labels
155+
//! @note Added in 2.6
139156
int decimalPlaces() const { return mDecimalPlaces; }
157+
//! Reset the number of decimal places used to generate labels
158+
//! @param decimalPlaces the number of decimal places
159+
//! @param updateRanges if true then ranges currently using the default label will be updated
160+
//! @note Added in 2.6
140161
void setDecimalPlaces( int decimalPlaces, bool updateRanges=true );
162+
//! Determine an appropriate number of decimal places based on the minimum class interval
163+
//! @param updateRanges if true then ranges currently using the default label will be updated
164+
//! @note Added in 2.6
141165
void calculateDecimalPlaces( bool updateRanges=true );
142166

143167
static QgsGraduatedSymbolRendererV2* createRenderer(
@@ -177,7 +201,7 @@ class CORE_EXPORT QgsGraduatedSymbolRendererV2 : public QgsFeatureRendererV2
177201
/** Update the color ramp used. Also updates all symbols colors.
178202
* Doesn't alter current breaks.
179203
*/
180-
void updateColorRamp( QgsVectorColorRampV2* ramp, bool inverted = false );
204+
void updateColorRamp( QgsVectorColorRampV2* ramp=0, bool inverted = false );
181205

182206
/** Update all the symbols but leave breaks and colors. */
183207
void updateSymbols( QgsSymbolV2* sym );
@@ -202,19 +226,19 @@ class CORE_EXPORT QgsGraduatedSymbolRendererV2 : public QgsFeatureRendererV2
202226
virtual bool legendSymbolItemsCheckable() const;
203227

204228
//! item in symbology was checked
205-
// @note added in 2.5
229+
//! @note added in 2.6
206230
virtual bool legendSymbolItemChecked( QString key );
207231

208232
//! item in symbology was checked
209-
// @note added in 2.5
233+
//! @note added in 2.6
210234
virtual void checkLegendSymbolItem( QString key, bool state = true );
211235

212236
//! If supported by the renderer, return classification attribute for the use in legend
213237
//! @note added in 2.6
214238
virtual QString legendClassificationAttribute() const { return classAttribute(); }
215239

216240
//! creates a QgsGraduatedSymbolRendererV2 from an existing renderer.
217-
//! @note added in 2.5
241+
//! @note added in 2.6
218242
//! @returns a new renderer if the conversion was possible, otherwise 0.
219243
static QgsGraduatedSymbolRendererV2* convertFromRenderer( const QgsFeatureRendererV2 *renderer );
220244

src/gui/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ symbology-ng/qgssymbollayerv2widget.cpp
1818
symbology-ng/qgsrendererv2widget.cpp
1919
symbology-ng/qgssinglesymbolrendererv2widget.cpp
2020
symbology-ng/qgscategorizedsymbolrendererv2widget.cpp
21+
symbology-ng/qgsgraduatedrendererclasseditor.cpp
2122
symbology-ng/qgsgraduatedsymbolrendererv2widget.cpp
2223
symbology-ng/qgsrulebasedrendererv2widget.cpp
2324
symbology-ng/qgsinvertedpolygonrendererwidget.cpp
@@ -245,6 +246,7 @@ symbology-ng/qgssymbollayerv2widget.h
245246
symbology-ng/qgssinglesymbolrendererv2widget.h
246247
symbology-ng/qgscategorizedsymbolrendererv2widget.h
247248
symbology-ng/qgsdatadefinedsymboldialog.h
249+
symbology-ng/qgsgraduatedrendererclasseditor.h
248250
symbology-ng/qgsgraduatedsymbolrendererv2widget.h
249251
symbology-ng/qgsrulebasedrendererv2widget.h
250252
symbology-ng/qgsinvertedpolygonrendererwidget.h

src/gui/qgsattributetypeloaddialog.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,4 +202,4 @@ void QgsAttributeTypeLoadDialog::accept()
202202
//store data to output variable
203203
loadDataToValueMap();
204204
QDialog::accept();
205-
}
205+
}

0 commit comments

Comments
 (0)