29
29
30
30
31
31
32
- QgsRuleBasedRendererV2::Rule::Rule ( QgsSymbolV2* symbol, int scaleMinDenom, int scaleMaxDenom, QString filterExp, QString label, QString description )
32
+ QgsRuleBasedRendererV2::Rule::Rule (QgsSymbolV2* symbol, int scaleMinDenom, int scaleMaxDenom, QString filterExp, QString label, QString description , bool elseRule )
33
33
: mParent( NULL ), mSymbol( symbol ),
34
34
mScaleMinDenom( scaleMinDenom ), mScaleMaxDenom( scaleMaxDenom ),
35
35
mFilterExp( filterExp ), mLabel( label ), mDescription( description ),
36
- mFilter( NULL )
36
+ mFilter( NULL ), mElseRule( elseRule )
37
37
{
38
38
initFilter ();
39
39
}
@@ -48,7 +48,12 @@ QgsRuleBasedRendererV2::Rule::~Rule()
48
48
49
49
void QgsRuleBasedRendererV2::Rule::initFilter ()
50
50
{
51
- if ( !mFilterExp .isEmpty () )
51
+ if ( mElseRule || mFilterExp .compare (" ELSE" , Qt::CaseInsensitive) == 0 )
52
+ {
53
+ mElseRule = true ;
54
+ mFilter = NULL ;
55
+ }
56
+ else if ( !mFilterExp .isEmpty () )
52
57
{
53
58
delete mFilter ;
54
59
mFilter = new QgsExpression ( mFilterExp );
@@ -132,7 +137,7 @@ QgsLegendSymbolList QgsRuleBasedRendererV2::Rule::legendSymbolItems()
132
137
133
138
bool QgsRuleBasedRendererV2::Rule::isFilterOK ( QgsFeature& f ) const
134
139
{
135
- if ( ! mFilter )
140
+ if ( ! mFilter || mElseRule )
136
141
return true ;
137
142
138
143
QVariant res = mFilter ->evaluate ( &f );
@@ -373,12 +378,31 @@ bool QgsRuleBasedRendererV2::Rule::renderFeature( QgsRuleBasedRendererV2::Featur
373
378
rendered = true ;
374
379
}
375
380
381
+ QList<Rule*> elserules;
382
+ bool willrendersomething = false ;
383
+
376
384
// process children
377
385
for ( QList<Rule*>::iterator it = mActiveChildren .begin (); it != mActiveChildren .end (); ++it )
378
386
{
379
387
Rule* rule = *it;
380
- rendered |= rule->renderFeature ( featToRender, context, renderQueue );
388
+ if ( rule->isElse ())
389
+ {
390
+ elserules << rule;
391
+ continue ;
392
+ }
393
+ willrendersomething |= rule->renderFeature ( featToRender, context, renderQueue );
394
+ rendered |= willrendersomething;
381
395
}
396
+
397
+ // If none of the rules passed then we jump into the else rules and process them.
398
+ if ( !willrendersomething )
399
+ {
400
+ foreach (Rule* rule, elserules)
401
+ {
402
+ rendered |= rule->renderFeature ( featToRender, context, renderQueue );
403
+ }
404
+ }
405
+
382
406
return rendered;
383
407
}
384
408
0 commit comments