Skip to content

Commit

Permalink
Merge pull request #6807 from m-kuhn/ruleBasedNestedElse
Browse files Browse the repository at this point in the history
Fix identify tool with rule renderer and nested else
  • Loading branch information
m-kuhn committed Apr 17, 2018
2 parents 90c6540 + 8f8a9ac commit fe27b01
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 5 deletions.
17 changes: 12 additions & 5 deletions src/core/symbology/qgsrulebasedrenderer.cpp
Expand Up @@ -549,15 +549,22 @@ bool QgsRuleBasedRenderer::Rule::willRenderFeature( QgsFeature &feat, QgsRenderC
{
if ( rule->isElse() )
{
RuleList lst = rulesForFeature( feat, context, false );
lst.removeOne( rule );
if ( rule->children().isEmpty() )
{
RuleList lst = rulesForFeature( feat, context, false );
lst.removeOne( rule );

if ( lst.empty() )
if ( lst.empty() )
{
return true;
}
}
else
{
return true;
return rule->willRenderFeature( feat, context );
}
}
else if ( !rule->isElse( ) && rule->willRenderFeature( feat, context ) )
else if ( rule->willRenderFeature( feat, context ) )
{
return true;
}
Expand Down
36 changes: 36 additions & 0 deletions tests/src/python/test_qgsrulebasedrenderer.py
Expand Up @@ -125,6 +125,42 @@ def testWillRenderFeature(self):
renderer.stopRender(ctx)
assert rendered == True

def testWillRenderFeatureNestedElse(self):
vl = self.mapsettings.layers()[0]
ft = vl.getFeature(0) # 'id' = 1

ctx = QgsRenderContext.fromMapSettings(self.mapsettings)
ctx.expressionContext().setFeature(ft)

# Create rulebased style
sym1 = QgsFillSymbol.createSimple({'color': '#fdbf6f', 'outline_color': 'black'})
sym2 = QgsFillSymbol.createSimple({'color': '#71bd6c', 'outline_color': 'black'})
sym3 = QgsFillSymbol.createSimple({'color': '#1f78b4', 'outline_color': 'black'})

self.rx1 = QgsRuleBasedRenderer.Rule(sym1, 0, 0, '"id" = 1')
self.rx2 = QgsRuleBasedRenderer.Rule(sym2, 0, 0, '"id" = 2')
self.rx3 = QgsRuleBasedRenderer.Rule(sym3, 0, 0, 'ELSE')

self.rx3.appendChild(self.rx1)

rootrule = QgsRuleBasedRenderer.Rule(None)
rootrule.appendChild(self.rx2)
rootrule.appendChild(self.rx3)

vl.setRenderer(QgsRuleBasedRenderer(rootrule))
renderer = vl.renderer()

# Reunder with else rule and all activated
renderer.startRender(ctx, vl.fields())
self.assertTrue(renderer.willRenderFeature(ft, ctx))
renderer.stopRender(ctx)

# Reunder with else rule where else is deactivated
renderer.rootRule().children()[1].setActive(False)
renderer.startRender(ctx, vl.fields())
self.assertFalse(renderer.willRenderFeature(ft, ctx))
renderer.stopRender(ctx)

def testFeatureCount(self):
vl = self.mapsettings.layers()[0]
ft = vl.getFeature(2) # 'id' = 3 => ELSE
Expand Down

0 comments on commit fe27b01

Please sign in to comment.