diff --git a/src/core/symbology-ng/qgscategorizedsymbolrendererv2.cpp b/src/core/symbology-ng/qgscategorizedsymbolrendererv2.cpp index d2bfb5e68838..5c9b77f93b6f 100644 --- a/src/core/symbology-ng/qgscategorizedsymbolrendererv2.cpp +++ b/src/core/symbology-ng/qgscategorizedsymbolrendererv2.cpp @@ -139,7 +139,10 @@ QgsSymbolV2* QgsCategorizedSymbolRendererV2::symbolForFeature( QgsFeature& featu // find the right symbol for the category QgsSymbolV2* symbol = symbolForValue( *ita ); if ( symbol == NULL ) - return NULL; + { + // if no symbol found use default one + return symbolForValue( QVariant( "" ) ); + } if ( mRotationFieldIdx == -1 && mSizeScaleFieldIdx == -1 ) return symbol; // no data-defined rotation/scaling - just return the symbol diff --git a/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.cpp b/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.cpp index 99c5b6bc53c1..cbee9658c678 100644 --- a/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.cpp +++ b/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.cpp @@ -227,9 +227,15 @@ static void _createCategories( QgsCategoryList& cats, QList& values, Q int num = values.count(); + bool hasNull = false; + for ( int i = 0; i < num; i++ ) { QVariant value = values[i]; + if ( value.toString().isNull() ) + { + hasNull = true; + } double x = i / ( double ) num; QgsSymbolV2* newSymbol = symbol->clone(); newSymbol->setColor( ramp->color( x ) ); @@ -237,6 +243,13 @@ static void _createCategories( QgsCategoryList& cats, QList& values, Q cats.append( QgsRendererCategoryV2( value, newSymbol, value.toString() ) ); } + // add null (default) value if not exists + if ( !hasNull ) + { + QgsSymbolV2* newSymbol = symbol->clone(); + newSymbol->setColor( ramp->color( 1 ) ); + cats.append( QgsRendererCategoryV2( QVariant( "" ), newSymbol, QString() ) ); + } } void QgsCategorizedSymbolRendererV2Widget::addCategories() @@ -264,6 +277,8 @@ void QgsCategorizedSymbolRendererV2Widget::addCategories() QgsCategoryList cats; _createCategories( cats, unique_vals, mCategorizedSymbol, ramp ); + bool deleteExisting = false; + if ( !mOldClassificationAttribute.isEmpty() && attrName != mOldClassificationAttribute && mRenderer->categories().count() > 0 ) @@ -275,28 +290,33 @@ void QgsCategorizedSymbolRendererV2Widget::addCategories() .arg( mOldClassificationAttribute ).arg( attrName ), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel ); if ( res == QMessageBox::Cancel ) + { return; + } + + deleteExisting = ( res == QMessageBox::Yes ); + } - bool deleteExisting = ( res == QMessageBox::Yes ); - if ( !deleteExisting ) + if ( !deleteExisting ) + { + QgsCategoryList prevCats = mRenderer->categories(); + for ( int i = 0; i < cats.size(); ++i ) { - QgsCategoryList prevCats = mRenderer->categories(); - for ( int i = 0; i < cats.size(); ++i ) + bool contains = false; + QVariant value = cats.at( i ).value(); + for ( int j = 0; j < prevCats.size() && !contains; ++j ) { - bool contains = false; - QVariant value = cats.at( i ).value(); - for ( int j = 0; j < prevCats.size() && !contains; ++j ) + if ( prevCats.at( j ).value() == value ) { - if ( prevCats.at( j ).value() == value ) - contains = true; + contains = true; + break; } - - if ( !contains ) - prevCats.append( cats.at( i ) ); } - cats = prevCats; - } + if ( !contains ) + prevCats.append( cats.at( i ) ); + } + cats = prevCats; } mOldClassificationAttribute = attrName;