Skip to content

Commit 0b5c2ae

Browse files
committed
Recursive fix
1 parent dd6f98f commit 0b5c2ae

File tree

4 files changed

+20
-27
lines changed

4 files changed

+20
-27
lines changed

python/core/symbology/qgsrulebasedrenderer.sip.in

+1-1
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,7 @@ Returns which legend keys match the feature
324324
.. versionadded:: 2.14
325325
%End
326326

327-
QgsRuleBasedRenderer::RuleList rulesForFeature( QgsFeature &feat, QgsRenderContext *context = 0, bool withElse = true, bool onlyActive = true );
327+
QgsRuleBasedRenderer::RuleList rulesForFeature( QgsFeature &feat, QgsRenderContext *context = 0, bool onlyActive = true );
328328
%Docstring
329329
tell which rules will be used to render the feature
330330
%End

src/core/symbology/qgsrulebasedrenderer.cpp

+15-24
Original file line numberDiff line numberDiff line change
@@ -541,13 +541,24 @@ bool QgsRuleBasedRenderer::Rule::willRenderFeature( QgsFeature &feat, QgsRenderC
541541
{
542542
if ( !isFilterOK( feat, context ) )
543543
return false;
544+
544545
if ( mSymbol )
545546
return true;
546547

547548
Q_FOREACH ( Rule *rule, mActiveChildren )
548549
{
549-
if ( rule->willRenderFeature( feat, context ) )
550+
if ( rule->isElse() )
551+
{
552+
RuleList lst = rulesForFeature( feat, context, false );
553+
lst.removeOne( rule );
554+
555+
if ( lst.empty() )
556+
return true;
557+
}
558+
else if ( !rule->isElse( ) && rule->willRenderFeature( feat, context ) )
559+
{
550560
return true;
561+
}
551562
}
552563
return false;
553564
}
@@ -581,7 +592,7 @@ QSet<QString> QgsRuleBasedRenderer::Rule::legendKeysForFeature( QgsFeature &feat
581592
return lst;
582593
}
583594

584-
QgsRuleBasedRenderer::RuleList QgsRuleBasedRenderer::Rule::rulesForFeature( QgsFeature &feat, QgsRenderContext *context, bool withElse, bool onlyActive )
595+
QgsRuleBasedRenderer::RuleList QgsRuleBasedRenderer::Rule::rulesForFeature( QgsFeature &feat, QgsRenderContext *context, bool onlyActive )
585596
{
586597
RuleList lst;
587598
if ( !isFilterOK( feat, context ) )
@@ -596,10 +607,7 @@ QgsRuleBasedRenderer::RuleList QgsRuleBasedRenderer::Rule::rulesForFeature( QgsF
596607

597608
Q_FOREACH ( Rule *rule, listChildren )
598609
{
599-
if ( rule->isElse() && !withElse )
600-
continue;
601-
602-
lst += rule->rulesForFeature( feat, context, withElse, onlyActive );
610+
lst += rule->rulesForFeature( feat, context, onlyActive );
603611
}
604612
return lst;
605613
}
@@ -1148,24 +1156,7 @@ QString QgsRuleBasedRenderer::dump() const
11481156

11491157
bool QgsRuleBasedRenderer::willRenderFeature( QgsFeature &feat, QgsRenderContext &context )
11501158
{
1151-
for ( Rule *rule : mRootRule->children() )
1152-
{
1153-
if ( ! rule->active() )
1154-
continue;
1155-
1156-
// a feature already rendered by another rule shouldn't be considered in a
1157-
// 'else' statement for rendering
1158-
if ( rule->isElse() && mRootRule->rulesForFeature( feat, &context, false, false ).empty() )
1159-
{
1160-
return true;
1161-
}
1162-
else if ( !rule->isElse( ) && rule->willRenderFeature( feat, &context ) )
1163-
{
1164-
return true;
1165-
}
1166-
}
1167-
1168-
return false;
1159+
return mRootRule->willRenderFeature( feat, &context );
11691160
}
11701161

11711162
QgsSymbolList QgsRuleBasedRenderer::symbolsForFeature( QgsFeature &feat, QgsRenderContext &context )

src/core/symbology/qgsrulebasedrenderer.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ class CORE_EXPORT QgsRuleBasedRenderer : public QgsFeatureRenderer
343343
QSet< QString > legendKeysForFeature( QgsFeature &feat, QgsRenderContext *context = nullptr );
344344

345345
//! tell which rules will be used to render the feature
346-
QgsRuleBasedRenderer::RuleList rulesForFeature( QgsFeature &feat, QgsRenderContext *context = nullptr, bool withElse = true, bool onlyActive = true );
346+
QgsRuleBasedRenderer::RuleList rulesForFeature( QgsFeature &feat, QgsRenderContext *context = nullptr, bool onlyActive = true );
347347

348348
/**
349349
* Stop a rendering process. Used to clean up the internal state of this rule

tests/src/python/test_qgsrulebasedrenderer.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -115,12 +115,14 @@ def testWillRenderFeature(self):
115115
renderer.rootRule().children()[2].setActive(True)
116116

117117
renderer.startRender(ctx, vl.fields()) # build mActiveChlidren
118-
119118
rendered = renderer.willRenderFeature(ft, ctx)
119+
renderer.stopRender(ctx)
120120
renderer.rootRule().children()[0].setActive(True)
121121
assert rendered == False
122122

123+
renderer.startRender(ctx, vl.fields()) # build mActiveChlidren
123124
rendered = renderer.willRenderFeature(ft, ctx)
125+
renderer.stopRender(ctx)
124126
assert rendered == True
125127

126128
def testRefineWithCategories(self):

0 commit comments

Comments
 (0)