Skip to content

Commit 068493d

Browse files
committed
don't overwrite existing classes when reclassify in graduated symbol
renderer. Also always add default value and use it for all unclassified values (fixes #2709)
1 parent cf41e6c commit 068493d

File tree

2 files changed

+38
-15
lines changed

2 files changed

+38
-15
lines changed

src/core/symbology-ng/qgscategorizedsymbolrendererv2.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,10 @@ QgsSymbolV2* QgsCategorizedSymbolRendererV2::symbolForFeature( QgsFeature& featu
139139
// find the right symbol for the category
140140
QgsSymbolV2* symbol = symbolForValue( *ita );
141141
if ( symbol == NULL )
142-
return NULL;
142+
{
143+
// if no symbol found use default one
144+
return symbolForValue( QVariant( "" ) );
145+
}
143146

144147
if ( mRotationFieldIdx == -1 && mSizeScaleFieldIdx == -1 )
145148
return symbol; // no data-defined rotation/scaling - just return the symbol

src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.cpp

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -227,16 +227,29 @@ static void _createCategories( QgsCategoryList& cats, QList<QVariant>& values, Q
227227

228228
int num = values.count();
229229

230+
bool hasNull = false;
231+
230232
for ( int i = 0; i < num; i++ )
231233
{
232234
QVariant value = values[i];
235+
if ( value.toString().isNull() )
236+
{
237+
hasNull = true;
238+
}
233239
double x = i / ( double ) num;
234240
QgsSymbolV2* newSymbol = symbol->clone();
235241
newSymbol->setColor( ramp->color( x ) );
236242

237243
cats.append( QgsRendererCategoryV2( value, newSymbol, value.toString() ) );
238244
}
239245

246+
// add null (default) value if not exists
247+
if ( !hasNull )
248+
{
249+
QgsSymbolV2* newSymbol = symbol->clone();
250+
newSymbol->setColor( ramp->color( 1 ) );
251+
cats.append( QgsRendererCategoryV2( QVariant( "" ), newSymbol, QString() ) );
252+
}
240253
}
241254

242255
void QgsCategorizedSymbolRendererV2Widget::addCategories()
@@ -264,6 +277,8 @@ void QgsCategorizedSymbolRendererV2Widget::addCategories()
264277
QgsCategoryList cats;
265278
_createCategories( cats, unique_vals, mCategorizedSymbol, ramp );
266279

280+
bool deleteExisting = false;
281+
267282
if ( !mOldClassificationAttribute.isEmpty() &&
268283
attrName != mOldClassificationAttribute &&
269284
mRenderer->categories().count() > 0 )
@@ -275,28 +290,33 @@ void QgsCategorizedSymbolRendererV2Widget::addCategories()
275290
.arg( mOldClassificationAttribute ).arg( attrName ),
276291
QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel );
277292
if ( res == QMessageBox::Cancel )
293+
{
278294
return;
295+
}
296+
297+
deleteExisting = ( res == QMessageBox::Yes );
298+
}
279299

280-
bool deleteExisting = ( res == QMessageBox::Yes );
281-
if ( !deleteExisting )
300+
if ( !deleteExisting )
301+
{
302+
QgsCategoryList prevCats = mRenderer->categories();
303+
for ( int i = 0; i < cats.size(); ++i )
282304
{
283-
QgsCategoryList prevCats = mRenderer->categories();
284-
for ( int i = 0; i < cats.size(); ++i )
305+
bool contains = false;
306+
QVariant value = cats.at( i ).value();
307+
for ( int j = 0; j < prevCats.size() && !contains; ++j )
285308
{
286-
bool contains = false;
287-
QVariant value = cats.at( i ).value();
288-
for ( int j = 0; j < prevCats.size() && !contains; ++j )
309+
if ( prevCats.at( j ).value() == value )
289310
{
290-
if ( prevCats.at( j ).value() == value )
291-
contains = true;
311+
contains = true;
312+
break;
292313
}
293-
294-
if ( !contains )
295-
prevCats.append( cats.at( i ) );
296314
}
297-
cats = prevCats;
298-
}
299315

316+
if ( !contains )
317+
prevCats.append( cats.at( i ) );
318+
}
319+
cats = prevCats;
300320
}
301321

302322
mOldClassificationAttribute = attrName;

0 commit comments

Comments
 (0)