Skip to content

Commit fe27b01

Browse files
authoredApr 17, 2018
Merge pull request #6807 from m-kuhn/ruleBasedNestedElse
Fix identify tool with rule renderer and nested else
2 parents 90c6540 + 8f8a9ac commit fe27b01

File tree

2 files changed

+48
-5
lines changed

2 files changed

+48
-5
lines changed
 

‎src/core/symbology/qgsrulebasedrenderer.cpp

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -549,15 +549,22 @@ bool QgsRuleBasedRenderer::Rule::willRenderFeature( QgsFeature &feat, QgsRenderC
549549
{
550550
if ( rule->isElse() )
551551
{
552-
RuleList lst = rulesForFeature( feat, context, false );
553-
lst.removeOne( rule );
552+
if ( rule->children().isEmpty() )
553+
{
554+
RuleList lst = rulesForFeature( feat, context, false );
555+
lst.removeOne( rule );
554556

555-
if ( lst.empty() )
557+
if ( lst.empty() )
558+
{
559+
return true;
560+
}
561+
}
562+
else
556563
{
557-
return true;
564+
return rule->willRenderFeature( feat, context );
558565
}
559566
}
560-
else if ( !rule->isElse( ) && rule->willRenderFeature( feat, context ) )
567+
else if ( rule->willRenderFeature( feat, context ) )
561568
{
562569
return true;
563570
}

‎tests/src/python/test_qgsrulebasedrenderer.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,42 @@ def testWillRenderFeature(self):
125125
renderer.stopRender(ctx)
126126
assert rendered == True
127127

128+
def testWillRenderFeatureNestedElse(self):
129+
vl = self.mapsettings.layers()[0]
130+
ft = vl.getFeature(0) # 'id' = 1
131+
132+
ctx = QgsRenderContext.fromMapSettings(self.mapsettings)
133+
ctx.expressionContext().setFeature(ft)
134+
135+
# Create rulebased style
136+
sym1 = QgsFillSymbol.createSimple({'color': '#fdbf6f', 'outline_color': 'black'})
137+
sym2 = QgsFillSymbol.createSimple({'color': '#71bd6c', 'outline_color': 'black'})
138+
sym3 = QgsFillSymbol.createSimple({'color': '#1f78b4', 'outline_color': 'black'})
139+
140+
self.rx1 = QgsRuleBasedRenderer.Rule(sym1, 0, 0, '"id" = 1')
141+
self.rx2 = QgsRuleBasedRenderer.Rule(sym2, 0, 0, '"id" = 2')
142+
self.rx3 = QgsRuleBasedRenderer.Rule(sym3, 0, 0, 'ELSE')
143+
144+
self.rx3.appendChild(self.rx1)
145+
146+
rootrule = QgsRuleBasedRenderer.Rule(None)
147+
rootrule.appendChild(self.rx2)
148+
rootrule.appendChild(self.rx3)
149+
150+
vl.setRenderer(QgsRuleBasedRenderer(rootrule))
151+
renderer = vl.renderer()
152+
153+
# Reunder with else rule and all activated
154+
renderer.startRender(ctx, vl.fields())
155+
self.assertTrue(renderer.willRenderFeature(ft, ctx))
156+
renderer.stopRender(ctx)
157+
158+
# Reunder with else rule where else is deactivated
159+
renderer.rootRule().children()[1].setActive(False)
160+
renderer.startRender(ctx, vl.fields())
161+
self.assertFalse(renderer.willRenderFeature(ft, ctx))
162+
renderer.stopRender(ctx)
163+
128164
def testFeatureCount(self):
129165
vl = self.mapsettings.layers()[0]
130166
ft = vl.getFeature(2) # 'id' = 3 => ELSE

0 commit comments

Comments
 (0)
Please sign in to comment.