mirror of
https://github.com/qgis/QGIS.git
synced 2025-11-22 00:14:55 -05:00
Refactoring ready for manual update dialog. Also improves labelling of StdDev classifications and better determination of decimal places to use
This commit is contained in:
parent
91358aaa15
commit
2f706bc47a
@ -107,12 +107,14 @@ class QgsGraduatedSymbolRendererV2 : QgsFeatureRendererV2
|
|||||||
|
|
||||||
Mode mode() const;
|
Mode mode() const;
|
||||||
void setMode( Mode mode );
|
void setMode( Mode mode );
|
||||||
|
void updateClasses( QgsVectorLayer *vlayer, Mode mode, int nclasses );
|
||||||
|
|
||||||
QString units();
|
QString units();
|
||||||
void setUnits( QString units, bool updateRanges=true );
|
void setUnits( QString units, bool updateRanges=true );
|
||||||
|
|
||||||
int decimalPlaces() const;
|
int decimalPlaces() const;
|
||||||
void setDecimalPlaces( int decimalPlaces, bool updateRanges=true );
|
void setDecimalPlaces( int decimalPlaces, bool updateRanges=true );
|
||||||
|
void calculateDecimalPlaces( bool updateRanges=true );
|
||||||
|
|
||||||
static QgsGraduatedSymbolRendererV2* createRenderer(
|
static QgsGraduatedSymbolRendererV2* createRenderer(
|
||||||
QgsVectorLayer* vlayer,
|
QgsVectorLayer* vlayer,
|
||||||
|
|||||||
@ -40,7 +40,9 @@ class QgsGraduatedSymbolRendererV2Widget : QgsRendererV2Widget
|
|||||||
void rowsMoved();
|
void rowsMoved();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void updateUiFromRenderer();
|
void updateUiFromRenderer( bool updateCount=true );
|
||||||
|
void connectUpdateHandlers();
|
||||||
|
void disconnectUpdateHandlers();
|
||||||
|
|
||||||
void updateGraduatedSymbolIcon();
|
void updateGraduatedSymbolIcon();
|
||||||
|
|
||||||
|
|||||||
@ -630,7 +630,7 @@ static QList<double> _calcPrettyBreaks( double minimum, double maximum, int clas
|
|||||||
} // _calcPrettyBreaks
|
} // _calcPrettyBreaks
|
||||||
|
|
||||||
|
|
||||||
static QList<double> _calcStdDevBreaks( QList<double> values, int classes, QList<int> &labels )
|
static QList<double> _calcStdDevBreaks( QList<double> values, int classes, QList<double> &labels )
|
||||||
{
|
{
|
||||||
|
|
||||||
// C++ implementation of the standard deviation class interval algorithm
|
// C++ implementation of the standard deviation class interval algorithm
|
||||||
@ -669,7 +669,7 @@ static QList<double> _calcStdDevBreaks( QList<double> values, int classes, QList
|
|||||||
QList<double> breaks = _calcPrettyBreaks(( minimum - mean ) / stdDev, ( maximum - mean ) / stdDev, classes );
|
QList<double> breaks = _calcPrettyBreaks(( minimum - mean ) / stdDev, ( maximum - mean ) / stdDev, classes );
|
||||||
for ( int i = 0; i < breaks.count(); i++ )
|
for ( int i = 0; i < breaks.count(); i++ )
|
||||||
{
|
{
|
||||||
labels.append(( int ) breaks[i] );
|
labels.append( breaks[i] );
|
||||||
breaks[i] = ( breaks[i] * stdDev ) + mean;
|
breaks[i] = ( breaks[i] * stdDev ) + mean;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -820,10 +820,31 @@ QgsGraduatedSymbolRendererV2* QgsGraduatedSymbolRendererV2::createRenderer(
|
|||||||
QString units,
|
QString units,
|
||||||
int decimalPlaces )
|
int decimalPlaces )
|
||||||
{
|
{
|
||||||
if ( classes < 1 )
|
QgsRangeList ranges;
|
||||||
return NULL;
|
QgsGraduatedSymbolRendererV2* r = new QgsGraduatedSymbolRendererV2( attrName, ranges );
|
||||||
|
r->setSourceSymbol( symbol->clone() );
|
||||||
|
r->setSourceColorRamp( ramp->clone() );
|
||||||
|
r->setInvertedColorRamp( inverted );
|
||||||
|
r->setMode( mode );
|
||||||
|
r->setUnits( units );
|
||||||
|
r->updateClasses(vlayer,mode,classes);
|
||||||
|
r->setDecimalPlaces( decimalPlaces );
|
||||||
|
|
||||||
int attrNum = vlayer->fieldNameIndex( attrName );
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void QgsGraduatedSymbolRendererV2::updateClasses( QgsVectorLayer *vlayer, Mode mode, int nclasses )
|
||||||
|
{
|
||||||
|
// Custom classes are not recalculated
|
||||||
|
setMode(mode);
|
||||||
|
if( mode == Custom ) return;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if ( nclasses < 1 ) nclasses=1;
|
||||||
|
|
||||||
|
int attrNum = vlayer->fieldNameIndex( mAttrName );
|
||||||
double minimum;
|
double minimum;
|
||||||
double maximum;
|
double maximum;
|
||||||
|
|
||||||
@ -832,9 +853,9 @@ QgsGraduatedSymbolRendererV2* QgsGraduatedSymbolRendererV2::createRenderer(
|
|||||||
if ( attrNum == -1 )
|
if ( attrNum == -1 )
|
||||||
{
|
{
|
||||||
// try to use expression
|
// try to use expression
|
||||||
expression.reset( new QgsExpression( attrName ) );
|
expression.reset( new QgsExpression( mAttrName ) );
|
||||||
if ( expression->hasParserError() || !expression->prepare( vlayer->pendingFields() ) )
|
if ( expression->hasParserError() || !expression->prepare( vlayer->pendingFields() ) )
|
||||||
return 0; // should have a means to report errors
|
return; // should have a means to report errors
|
||||||
|
|
||||||
QList<double> values;
|
QList<double> values;
|
||||||
QgsFeatureIterator fit = vlayer->getFeatures();
|
QgsFeatureIterator fit = vlayer->getFeatures();
|
||||||
@ -855,14 +876,14 @@ QgsGraduatedSymbolRendererV2* QgsGraduatedSymbolRendererV2::createRenderer(
|
|||||||
|
|
||||||
QgsDebugMsg( QString( "min %1 // max %2" ).arg( minimum ).arg( maximum ) );
|
QgsDebugMsg( QString( "min %1 // max %2" ).arg( minimum ).arg( maximum ) );
|
||||||
QList<double> breaks;
|
QList<double> breaks;
|
||||||
QList<int> labels;
|
QList<double> labels;
|
||||||
if ( mode == EqualInterval )
|
if ( mode == EqualInterval )
|
||||||
{
|
{
|
||||||
breaks = _calcEqualIntervalBreaks( minimum, maximum, classes );
|
breaks = _calcEqualIntervalBreaks( minimum, maximum, nclasses );
|
||||||
}
|
}
|
||||||
else if ( mode == Pretty )
|
else if ( mode == Pretty )
|
||||||
{
|
{
|
||||||
breaks = _calcPrettyBreaks( minimum, maximum, classes );
|
breaks = _calcPrettyBreaks( minimum, maximum, nclasses );
|
||||||
}
|
}
|
||||||
else if ( mode == Quantile || mode == Jenks || mode == StdDev )
|
else if ( mode == Quantile || mode == Jenks || mode == StdDev )
|
||||||
{
|
{
|
||||||
@ -871,7 +892,7 @@ QgsGraduatedSymbolRendererV2* QgsGraduatedSymbolRendererV2::createRenderer(
|
|||||||
QgsFeature f;
|
QgsFeature f;
|
||||||
QStringList lst;
|
QStringList lst;
|
||||||
if ( expression.isNull() )
|
if ( expression.isNull() )
|
||||||
lst.append( attrName );
|
lst.append( mAttrName );
|
||||||
else
|
else
|
||||||
lst = expression->referencedColumns();
|
lst = expression->referencedColumns();
|
||||||
|
|
||||||
@ -888,15 +909,15 @@ QgsGraduatedSymbolRendererV2* QgsGraduatedSymbolRendererV2::createRenderer(
|
|||||||
// calculate the breaks
|
// calculate the breaks
|
||||||
if ( mode == Quantile )
|
if ( mode == Quantile )
|
||||||
{
|
{
|
||||||
breaks = _calcQuantileBreaks( values, classes );
|
breaks = _calcQuantileBreaks( values, nclasses );
|
||||||
}
|
}
|
||||||
else if ( mode == Jenks )
|
else if ( mode == Jenks )
|
||||||
{
|
{
|
||||||
breaks = _calcJenksBreaks( values, classes, minimum, maximum );
|
breaks = _calcJenksBreaks( values, nclasses, minimum, maximum );
|
||||||
}
|
}
|
||||||
else if ( mode == StdDev )
|
else if ( mode == StdDev )
|
||||||
{
|
{
|
||||||
breaks = _calcStdDevBreaks( values, classes, labels );
|
breaks = _calcStdDevBreaks( values, nclasses, labels );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -904,19 +925,13 @@ QgsGraduatedSymbolRendererV2* QgsGraduatedSymbolRendererV2::createRenderer(
|
|||||||
Q_ASSERT( false );
|
Q_ASSERT( false );
|
||||||
}
|
}
|
||||||
|
|
||||||
QgsRangeList ranges;
|
|
||||||
double lower, upper = minimum;
|
double lower, upper = minimum;
|
||||||
QString label;
|
QString label;
|
||||||
|
mRanges.clear();
|
||||||
QgsGraduatedSymbolRendererV2* r = new QgsGraduatedSymbolRendererV2( attrName, ranges );
|
|
||||||
r->setSourceSymbol( symbol->clone() );
|
|
||||||
r->setSourceColorRamp( ramp->clone() );
|
|
||||||
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
|
// "breaks" list contains all values at class breaks plus maximum as last break
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for ( QList<double>::iterator it = breaks.begin(); it != breaks.end(); ++it, ++i )
|
for ( QList<double>::iterator it = breaks.begin(); it != breaks.end(); ++it, ++i )
|
||||||
{
|
{
|
||||||
@ -924,12 +939,7 @@ QgsGraduatedSymbolRendererV2* QgsGraduatedSymbolRendererV2::createRenderer(
|
|||||||
upper = *it;
|
upper = *it;
|
||||||
|
|
||||||
// Symbol based on range
|
// Symbol based on range
|
||||||
QgsSymbolV2* newSymbol = symbol->clone();
|
QgsSymbolV2* newSymbol = mSourceSymbol->clone();
|
||||||
double colorValue;
|
|
||||||
if ( inverted ) colorValue = ( breaks.count() > 1 ? ( double )( breaks.count() - i - 1 ) / ( breaks.count() - 1 ) : 0 );
|
|
||||||
else colorValue = ( breaks.count() > 1 ? ( double ) i / ( breaks.count() - 1 ) : 0 );
|
|
||||||
newSymbol->setColor( ramp->color( colorValue ) ); // color from (0 / cl-1) to (cl-1 / cl-1)
|
|
||||||
|
|
||||||
QgsRendererRangeV2 range = QgsRendererRangeV2( lower, upper, newSymbol, "" );
|
QgsRendererRangeV2 range = QgsRendererRangeV2( lower, upper, newSymbol, "" );
|
||||||
|
|
||||||
// Label - either StdDev label or default label for a range
|
// Label - either StdDev label or default label for a range
|
||||||
@ -937,27 +947,27 @@ QgsGraduatedSymbolRendererV2* QgsGraduatedSymbolRendererV2::createRenderer(
|
|||||||
{
|
{
|
||||||
if ( i == 0 )
|
if ( i == 0 )
|
||||||
{
|
{
|
||||||
label = "< " + QString::number( labels[i], 'i', 0 ) + " Std Dev";
|
label = "< " + QString::number( labels[i], 'f', 2 ) + " Std Dev";
|
||||||
}
|
}
|
||||||
else if ( i == labels.count() - 1 )
|
else if ( i == labels.count() - 1 )
|
||||||
{
|
{
|
||||||
label = ">= " + QString::number( labels[i-1], 'i', 0 ) + " Std Dev";
|
label = ">= " + QString::number( labels[i-1], 'f', 2 ) + " Std Dev";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
label = QString::number( labels[i-1], 'i', 0 ) + " Std Dev" + " - " + QString::number( labels[i], 'i', 0 ) + " Std Dev";
|
label = QString::number( labels[i-1], 'f', 2 ) + " Std Dev" + " - " + QString::number( labels[i], 'f', 2 ) + " Std Dev";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
label=r->defaultRangeLabel(range);
|
label=defaultRangeLabel(range);
|
||||||
}
|
}
|
||||||
range.setLabel(label);
|
range.setLabel(label);
|
||||||
|
|
||||||
r->addClass( range );
|
addClass( range );
|
||||||
}
|
}
|
||||||
|
updateColorRamp(0,mInvertedColorRamp);
|
||||||
|
|
||||||
return r;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1201,18 +1211,20 @@ void QgsGraduatedSymbolRendererV2::setSourceColorRamp( QgsVectorColorRampV2* ram
|
|||||||
void QgsGraduatedSymbolRendererV2::updateColorRamp( QgsVectorColorRampV2 *ramp, bool inverted )
|
void QgsGraduatedSymbolRendererV2::updateColorRamp( QgsVectorColorRampV2 *ramp, bool inverted )
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
if( ramp ) this->setSourceColorRamp( ramp );
|
||||||
|
this->setInvertedColorRamp( inverted );
|
||||||
|
|
||||||
foreach ( QgsRendererRangeV2 range, mRanges )
|
foreach ( QgsRendererRangeV2 range, mRanges )
|
||||||
{
|
{
|
||||||
QgsSymbolV2* symbol = range.symbol()->clone();
|
QgsSymbolV2* symbol = range.symbol()->clone();
|
||||||
double colorValue;
|
double colorValue;
|
||||||
if ( inverted ) colorValue = ( mRanges.count() > 1 ? ( double )( mRanges.count() - i - 1 ) / ( mRanges.count() - 1 ) : 0 );
|
if ( inverted ) colorValue = ( mRanges.count() > 1 ? ( double )( mRanges.count() - i - 1 ) / ( mRanges.count() - 1 ) : 0 );
|
||||||
else colorValue = ( mRanges.count() > 1 ? ( double ) i / ( mRanges.count() - 1 ) : 0 );
|
else colorValue = ( mRanges.count() > 1 ? ( double ) i / ( mRanges.count() - 1 ) : 0 );
|
||||||
symbol->setColor( ramp->color( colorValue ) );
|
symbol->setColor( mSourceColorRamp->color( colorValue ) );
|
||||||
updateRangeSymbol( i, symbol );
|
updateRangeSymbol( i, symbol );
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
this->setSourceColorRamp( ramp );
|
|
||||||
this->setInvertedColorRamp( inverted );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void QgsGraduatedSymbolRendererV2::updateSymbols( QgsSymbolV2 *sym )
|
void QgsGraduatedSymbolRendererV2::updateSymbols( QgsSymbolV2 *sym )
|
||||||
@ -1343,6 +1355,32 @@ void QgsGraduatedSymbolRendererV2::setDecimalPlaces( int decimalPlaces, bool upd
|
|||||||
mDecimalPlaces=decimalPlaces;
|
mDecimalPlaces=decimalPlaces;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QgsGraduatedSymbolRendererV2::calculateDecimalPlaces( bool updateRanges )
|
||||||
|
{
|
||||||
|
// Find the minimum size of a class
|
||||||
|
double minClassRange=0.0;
|
||||||
|
for ( QgsRangeList::iterator it = mRanges.begin(); it != mRanges.end(); ++it )
|
||||||
|
{
|
||||||
|
double range = it->upperValue()-it->lowerValue();
|
||||||
|
if( range <= 0.0 ) continue;
|
||||||
|
if( minClassRange == 0.0 || range < minClassRange ) minClassRange=range;
|
||||||
|
}
|
||||||
|
if( minClassRange <= 0.0 ) return;
|
||||||
|
|
||||||
|
// Now set the number of decimal places to ensure no more than 20% error in
|
||||||
|
// representing this range (up to 10% at upper and lower end)
|
||||||
|
|
||||||
|
int ndp=10;
|
||||||
|
double nextDpMinRange=0.0000000099;
|
||||||
|
while( ndp > 0 && nextDpMinRange < minClassRange )
|
||||||
|
{
|
||||||
|
ndp--;
|
||||||
|
nextDpMinRange *= 10.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
setDecimalPlaces(ndp,updateRanges);
|
||||||
|
}
|
||||||
|
|
||||||
void QgsGraduatedSymbolRendererV2::moveClass( int from, int to )
|
void QgsGraduatedSymbolRendererV2::moveClass( int from, int to )
|
||||||
{
|
{
|
||||||
if ( from < 0 || from >= mRanges.size() || to < 0 || to >= mRanges.size() ) return;
|
if ( from < 0 || from >= mRanges.size() || to < 0 || to >= mRanges.size() ) return;
|
||||||
|
|||||||
@ -131,12 +131,14 @@ class CORE_EXPORT QgsGraduatedSymbolRendererV2 : public QgsFeatureRendererV2
|
|||||||
|
|
||||||
Mode mode() const { return mMode; }
|
Mode mode() const { return mMode; }
|
||||||
void setMode( Mode mode ) { mMode = mode; }
|
void setMode( Mode mode ) { mMode = mode; }
|
||||||
|
void updateClasses( QgsVectorLayer *vlayer, Mode mode, int nclasses );
|
||||||
|
|
||||||
QString units() const { return mUnits; }
|
QString units() const { return mUnits; }
|
||||||
void setUnits( QString units, bool updateRanges=true );
|
void setUnits( QString units, bool updateRanges=true );
|
||||||
|
|
||||||
int decimalPlaces() const { return mDecimalPlaces; }
|
int decimalPlaces() const { return mDecimalPlaces; }
|
||||||
void setDecimalPlaces( int decimalPlaces, bool updateRanges=true );
|
void setDecimalPlaces( int decimalPlaces, bool updateRanges=true );
|
||||||
|
void calculateDecimalPlaces( bool updateRanges=true );
|
||||||
|
|
||||||
static QgsGraduatedSymbolRendererV2* createRenderer(
|
static QgsGraduatedSymbolRendererV2* createRenderer(
|
||||||
QgsVectorLayer* vlayer,
|
QgsVectorLayer* vlayer,
|
||||||
|
|||||||
@ -401,12 +401,6 @@ QgsGraduatedSymbolRendererV2Widget::QgsGraduatedSymbolRendererV2Widget( QgsVecto
|
|||||||
cboGraduatedColorRamp->setCurrentIndex( index );
|
cboGraduatedColorRamp->setCurrentIndex( index );
|
||||||
}
|
}
|
||||||
|
|
||||||
mModel = new QgsGraduatedSymbolRendererV2Model( this );
|
|
||||||
mModel->setRenderer( mRenderer );
|
|
||||||
viewGraduated->setModel( mModel );
|
|
||||||
viewGraduated->resizeColumnToContents( 0 );
|
|
||||||
viewGraduated->resizeColumnToContents( 1 );
|
|
||||||
viewGraduated->resizeColumnToContents( 2 );
|
|
||||||
|
|
||||||
viewGraduated->setStyle( new QgsGraduatedSymbolRendererV2ViewStyle( viewGraduated->style() ) );
|
viewGraduated->setStyle( new QgsGraduatedSymbolRendererV2ViewStyle( viewGraduated->style() ) );
|
||||||
|
|
||||||
@ -426,16 +420,11 @@ QgsGraduatedSymbolRendererV2Widget::QgsGraduatedSymbolRendererV2Widget( QgsVecto
|
|||||||
connect( btnGraduatedAdd, SIGNAL( clicked() ), this, SLOT( addClass() ) );
|
connect( btnGraduatedAdd, SIGNAL( clicked() ), this, SLOT( addClass() ) );
|
||||||
connect( cbxLinkBoundaries, SIGNAL( toggled( bool ) ), this, SLOT( toggleBoundariesLink( bool ) ) );
|
connect( cbxLinkBoundaries, SIGNAL( toggled( bool ) ), this, SLOT( toggleBoundariesLink( bool ) ) );
|
||||||
|
|
||||||
|
connectUpdateHandlers();
|
||||||
|
|
||||||
// initialize from previously set renderer
|
// initialize from previously set renderer
|
||||||
updateUiFromRenderer();
|
updateUiFromRenderer();
|
||||||
|
|
||||||
connect( spinGraduatedClasses, SIGNAL( valueChanged( int ) ) , this, SLOT( classifyGraduated() ) );
|
|
||||||
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
|
// menus for data-defined rotation/size
|
||||||
QMenu* advMenu = new QMenu;
|
QMenu* advMenu = new QMenu;
|
||||||
|
|
||||||
@ -460,22 +449,48 @@ QgsFeatureRendererV2* QgsGraduatedSymbolRendererV2Widget::renderer()
|
|||||||
return mRenderer;
|
return mRenderer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Connect/disconnect event handlers which trigger updating renderer
|
||||||
|
|
||||||
void QgsGraduatedSymbolRendererV2Widget::updateUiFromRenderer()
|
void QgsGraduatedSymbolRendererV2Widget::connectUpdateHandlers()
|
||||||
{
|
{
|
||||||
|
connect( spinGraduatedClasses, SIGNAL( valueChanged( int ) ) , this, SLOT( classifyGraduated() ) );
|
||||||
|
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)));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Connect/disconnect event handlers which trigger updating renderer
|
||||||
|
|
||||||
|
void QgsGraduatedSymbolRendererV2Widget::disconnectUpdateHandlers()
|
||||||
|
{
|
||||||
|
disconnect( spinGraduatedClasses, SIGNAL( valueChanged( int ) ) , this, SLOT( classifyGraduated() ) );
|
||||||
|
disconnect( cboGraduatedMode, SIGNAL( currentIndexChanged( int ) ) , this, SLOT( classifyGraduated() ) );
|
||||||
|
disconnect( cboGraduatedColorRamp, SIGNAL( currentIndexChanged( int ) ) , this, SLOT( reapplyColorRamp() ) );
|
||||||
|
disconnect( cbxInvertedColorRamp, SIGNAL( toggled( bool ) ) , this, SLOT( reapplyColorRamp() ) );
|
||||||
|
disconnect( spinDecimalPlaces, SIGNAL(valueChanged(int)), this, SLOT(decimalPlacesChanged()));
|
||||||
|
disconnect( txtUnits, SIGNAL( textChanged(QString)), this, SLOT(unitsChanged(QString)));
|
||||||
|
}
|
||||||
|
|
||||||
|
void QgsGraduatedSymbolRendererV2Widget::updateUiFromRenderer( bool updateCount )
|
||||||
|
{
|
||||||
|
disconnectUpdateHandlers();
|
||||||
|
|
||||||
updateGraduatedSymbolIcon();
|
updateGraduatedSymbolIcon();
|
||||||
|
|
||||||
// update UI from the graduated renderer (update combo boxes, view)
|
// update UI from the graduated renderer (update combo boxes, view)
|
||||||
if ( mRenderer->mode() < cboGraduatedMode->count() )
|
if ( mRenderer->mode() < cboGraduatedMode->count() )
|
||||||
cboGraduatedMode->setCurrentIndex( mRenderer->mode() );
|
cboGraduatedMode->setCurrentIndex( mRenderer->mode() );
|
||||||
if ( mRenderer->ranges().count() )
|
|
||||||
|
// Only update class count if different - otherwise typing value gets very messy
|
||||||
|
int nclasses=mRenderer->ranges().count();
|
||||||
|
if ( nclasses && updateCount )
|
||||||
spinGraduatedClasses->setValue( mRenderer->ranges().count() );
|
spinGraduatedClasses->setValue( mRenderer->ranges().count() );
|
||||||
|
|
||||||
// set column
|
// set column
|
||||||
disconnect( mExpressionWidget, SIGNAL( fieldChanged( QString ) ), this, SLOT( graduatedColumnChanged( QString ) ) );
|
|
||||||
QString attrName = mRenderer->classAttribute();
|
QString attrName = mRenderer->classAttribute();
|
||||||
mExpressionWidget->setField( attrName );
|
mExpressionWidget->setField( attrName );
|
||||||
connect( mExpressionWidget, SIGNAL( fieldChanged( QString ) ), this, SLOT( graduatedColumnChanged( QString ) ) );
|
|
||||||
|
|
||||||
// set source symbol
|
// set source symbol
|
||||||
if ( mRenderer->sourceSymbol() )
|
if ( mRenderer->sourceSymbol() )
|
||||||
@ -494,6 +509,15 @@ void QgsGraduatedSymbolRendererV2Widget::updateUiFromRenderer()
|
|||||||
|
|
||||||
spinDecimalPlaces->setValue( mRenderer->decimalPlaces());
|
spinDecimalPlaces->setValue( mRenderer->decimalPlaces());
|
||||||
txtUnits->setText( mRenderer->units() );
|
txtUnits->setText( mRenderer->units() );
|
||||||
|
|
||||||
|
mModel = new QgsGraduatedSymbolRendererV2Model( this );
|
||||||
|
mModel->setRenderer( mRenderer );
|
||||||
|
viewGraduated->setModel( mModel );
|
||||||
|
viewGraduated->resizeColumnToContents( 0 );
|
||||||
|
viewGraduated->resizeColumnToContents( 1 );
|
||||||
|
viewGraduated->resizeColumnToContents( 2 );
|
||||||
|
|
||||||
|
connectUpdateHandlers();
|
||||||
}
|
}
|
||||||
|
|
||||||
void QgsGraduatedSymbolRendererV2Widget::graduatedColumnChanged( QString field )
|
void QgsGraduatedSymbolRendererV2Widget::graduatedColumnChanged( QString field )
|
||||||
@ -505,7 +529,7 @@ void QgsGraduatedSymbolRendererV2Widget::classifyGraduated()
|
|||||||
{
|
{
|
||||||
QString attrName = mExpressionWidget->currentField();
|
QString attrName = mExpressionWidget->currentField();
|
||||||
|
|
||||||
int classes = spinGraduatedClasses->value();
|
int nclasses = spinGraduatedClasses->value();
|
||||||
|
|
||||||
QgsVectorColorRampV2* ramp = cboGraduatedColorRamp->currentColorRamp();
|
QgsVectorColorRampV2* ramp = cboGraduatedColorRamp->currentColorRamp();
|
||||||
|
|
||||||
@ -527,6 +551,8 @@ void QgsGraduatedSymbolRendererV2Widget::classifyGraduated()
|
|||||||
mode = QgsGraduatedSymbolRendererV2::StdDev;
|
mode = QgsGraduatedSymbolRendererV2::StdDev;
|
||||||
else if ( cboGraduatedMode->currentIndex() == 4 )
|
else if ( cboGraduatedMode->currentIndex() == 4 )
|
||||||
mode = QgsGraduatedSymbolRendererV2::Pretty;
|
mode = QgsGraduatedSymbolRendererV2::Pretty;
|
||||||
|
else if ( cboGraduatedMode->currentIndex() == 5)
|
||||||
|
mode = QgsGraduatedSymbolRendererV2::Custom;
|
||||||
else // default should be quantile for now
|
else // default should be quantile for now
|
||||||
mode = QgsGraduatedSymbolRendererV2::Quantile;
|
mode = QgsGraduatedSymbolRendererV2::Quantile;
|
||||||
|
|
||||||
@ -541,26 +567,24 @@ void QgsGraduatedSymbolRendererV2Widget::classifyGraduated()
|
|||||||
|
|
||||||
// create and set new renderer
|
// create and set new renderer
|
||||||
QApplication::setOverrideCursor( Qt::WaitCursor );
|
QApplication::setOverrideCursor( Qt::WaitCursor );
|
||||||
QgsGraduatedSymbolRendererV2* r = QgsGraduatedSymbolRendererV2::createRenderer(
|
mRenderer->setClassAttribute(attrName);
|
||||||
mLayer, attrName, classes, mode, mGraduatedSymbol, ramp,
|
mRenderer->setMode(mode);
|
||||||
cbxInvertedColorRamp->isChecked(), txtUnits->text(), spinDecimalPlaces->value() );
|
bool updateUiCount=true;
|
||||||
|
if( mode == QgsGraduatedSymbolRendererV2::Custom )
|
||||||
|
{
|
||||||
|
// Need to insert code for manually setting ranges
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mRenderer->updateClasses(mLayer,mode,nclasses);
|
||||||
|
// PrettyBreaks and StdDev calculation don't generate exact
|
||||||
|
// number of classes - leave user interface unchanged for these
|
||||||
|
updateUiCount=false;
|
||||||
|
}
|
||||||
|
mRenderer->calculateDecimalPlaces();
|
||||||
|
|
||||||
QApplication::restoreOverrideCursor();
|
QApplication::restoreOverrideCursor();
|
||||||
if ( !r )
|
updateUiFromRenderer( updateUiCount );
|
||||||
{
|
|
||||||
QMessageBox::critical( this, tr( "Error" ), tr( "Renderer creation has failed." ) );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
r->setSizeScaleField( mRenderer->sizeScaleField() );
|
|
||||||
r->setRotationField( mRenderer->rotationField() );
|
|
||||||
r->setScaleMethod( mRenderer->scaleMethod() );
|
|
||||||
|
|
||||||
if ( mModel )
|
|
||||||
{
|
|
||||||
mModel->setRenderer( r );
|
|
||||||
}
|
|
||||||
delete mRenderer;
|
|
||||||
mRenderer = r;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void QgsGraduatedSymbolRendererV2Widget::reapplyColorRamp()
|
void QgsGraduatedSymbolRendererV2Widget::reapplyColorRamp()
|
||||||
|
|||||||
@ -110,7 +110,9 @@ class GUI_EXPORT QgsGraduatedSymbolRendererV2Widget : public QgsRendererV2Widget
|
|||||||
void rowsMoved();
|
void rowsMoved();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void updateUiFromRenderer();
|
void updateUiFromRenderer( bool updateCount=true );
|
||||||
|
void connectUpdateHandlers();
|
||||||
|
void disconnectUpdateHandlers();
|
||||||
|
|
||||||
void updateGraduatedSymbolIcon();
|
void updateGraduatedSymbolIcon();
|
||||||
|
|
||||||
|
|||||||
@ -69,6 +69,11 @@
|
|||||||
<string>Pretty Breaks</string>
|
<string>Pretty Breaks</string>
|
||||||
</property>
|
</property>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Manual Breaks</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="0">
|
<item row="5" column="0">
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user