Skip to content

Commit d6331a6

Browse files
committed
[bugfix] Fixes willRenderFeature method for QgsRuledBasedRenderer
1 parent 7b8603c commit d6331a6

File tree

2 files changed

+30
-6
lines changed

2 files changed

+30
-6
lines changed

src/core/symbology/qgsrulebasedrenderer.cpp

+28-4
Original file line numberDiff line numberDiff line change
@@ -581,7 +581,7 @@ QSet<QString> QgsRuleBasedRenderer::Rule::legendKeysForFeature( QgsFeature &feat
581581
return lst;
582582
}
583583

584-
QgsRuleBasedRenderer::RuleList QgsRuleBasedRenderer::Rule::rulesForFeature( QgsFeature &feat, QgsRenderContext *context )
584+
QgsRuleBasedRenderer::RuleList QgsRuleBasedRenderer::Rule::rulesForFeature( QgsFeature &feat, QgsRenderContext *context, bool withElse, bool onlyActive )
585585
{
586586
RuleList lst;
587587
if ( !isFilterOK( feat, context ) )
@@ -590,9 +590,16 @@ QgsRuleBasedRenderer::RuleList QgsRuleBasedRenderer::Rule::rulesForFeature( QgsF
590590
if ( mSymbol )
591591
lst.append( this );
592592

593-
Q_FOREACH ( Rule *rule, mActiveChildren )
593+
RuleList listChildren = children();
594+
if ( onlyActive )
595+
listChildren = mActiveChildren;
596+
597+
Q_FOREACH ( Rule *rule, listChildren )
594598
{
595-
lst += rule->rulesForFeature( feat, context );
599+
if ( rule->isElse() && !withElse )
600+
continue;
601+
602+
lst += rule->rulesForFeature( feat, context, withElse, onlyActive );
596603
}
597604
return lst;
598605
}
@@ -1141,7 +1148,24 @@ QString QgsRuleBasedRenderer::dump() const
11411148

11421149
bool QgsRuleBasedRenderer::willRenderFeature( QgsFeature &feat, QgsRenderContext &context )
11431150
{
1144-
return mRootRule->willRenderFeature( feat, &context );
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;
11451169
}
11461170

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

src/core/symbology/qgsrulebasedrenderer.h

+2-2
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 );
346+
QgsRuleBasedRenderer::RuleList rulesForFeature( QgsFeature &feat, QgsRenderContext *context = nullptr, bool withElse = true, bool onlyActive = true );
347347

348348
/**
349349
* Stop a rendering process. Used to clean up the internal state of this rule
@@ -419,7 +419,7 @@ class CORE_EXPORT QgsRuleBasedRenderer : public QgsFeatureRenderer
419419
*
420420
* \returns True if this rule is an else rule
421421
*/
422-
bool isElse() { return mElseRule; }
422+
bool isElse() const { return mElseRule; }
423423

424424
protected:
425425
void initFilter();

0 commit comments

Comments
 (0)