Skip to content

Commit dfe32ba

Browse files
committed
Move updating of else rules list out of render feature
1 parent af04c79 commit dfe32ba

File tree

2 files changed

+66
-9
lines changed

2 files changed

+66
-9
lines changed

src/core/symbology-ng/qgsrulebasedrendererv2.cpp

Lines changed: 57 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,61 @@ void QgsRuleBasedRendererV2::Rule::initFilter()
6464
}
6565
}
6666

67+
void QgsRuleBasedRendererV2::Rule::appendChild( Rule* rule )
68+
{
69+
mChildren.append( rule );
70+
rule->mParent = this;
71+
updateElseRules();
72+
}
73+
74+
void QgsRuleBasedRendererV2::Rule::insertChild( int i, Rule* rule )
75+
{
76+
mChildren.insert( i, rule );
77+
rule->mParent = this;
78+
updateElseRules();
79+
}
80+
81+
void QgsRuleBasedRendererV2::Rule::removeChild( Rule* rule )
82+
{
83+
mChildren.removeAll( rule );
84+
delete rule;
85+
updateElseRules();
86+
}
87+
88+
void QgsRuleBasedRendererV2::Rule::removeChildAt( int i )
89+
{
90+
Rule* rule = mChildren[i];
91+
mChildren.removeAt( i );
92+
delete rule;
93+
updateElseRules();
94+
}
95+
96+
void QgsRuleBasedRendererV2::Rule::takeChild( Rule* rule )
97+
{
98+
mChildren.removeAll( rule );
99+
rule->mParent = NULL;
100+
updateElseRules();
101+
}
102+
103+
QgsRuleBasedRendererV2::Rule* QgsRuleBasedRendererV2::Rule::takeChildAt( int i )
104+
{
105+
Rule* rule = mChildren.takeAt( i );
106+
rule->mParent = NULL;
107+
return rule;
108+
updateElseRules();
109+
}
110+
111+
void QgsRuleBasedRendererV2::Rule::updateElseRules()
112+
{
113+
mElseRules.clear();
114+
foreach (Rule* rule, mChildren )
115+
{
116+
if ( rule->isElse() )
117+
mElseRules << rule;
118+
}
119+
}
120+
121+
67122
QString QgsRuleBasedRendererV2::Rule::dump( int offset ) const
68123
{
69124
QString off;
@@ -378,7 +433,6 @@ bool QgsRuleBasedRendererV2::Rule::renderFeature( QgsRuleBasedRendererV2::Featur
378433
rendered = true;
379434
}
380435

381-
QList<Rule*> elserules;
382436
bool willrendersomething = false;
383437

384438
// process children
@@ -387,7 +441,7 @@ bool QgsRuleBasedRendererV2::Rule::renderFeature( QgsRuleBasedRendererV2::Featur
387441
Rule* rule = *it;
388442
if ( rule->isElse())
389443
{
390-
elserules << rule;
444+
// Don't process else rules yet
391445
continue;
392446
}
393447
willrendersomething |= rule->renderFeature( featToRender, context, renderQueue );
@@ -397,7 +451,7 @@ bool QgsRuleBasedRendererV2::Rule::renderFeature( QgsRuleBasedRendererV2::Featur
397451
// If none of the rules passed then we jump into the else rules and process them.
398452
if ( !willrendersomething )
399453
{
400-
foreach(Rule* rule, elserules)
454+
foreach(Rule* rule, mElseRules)
401455
{
402456
rendered |= rule->renderFeature( featToRender, context, renderQueue );
403457
}

src/core/symbology-ng/qgsrulebasedrendererv2.h

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -152,17 +152,19 @@ class CORE_EXPORT QgsRuleBasedRendererV2 : public QgsFeatureRendererV2
152152
Rule* parent() { return mParent; }
153153

154154
//! add child rule, take ownership, sets this as parent
155-
void appendChild( Rule* rule ) { mChildren.append( rule ); rule->mParent = this; }
155+
void appendChild( Rule* rule );
156156
//! add child rule, take ownership, sets this as parent
157-
void insertChild( int i, Rule* rule ) { mChildren.insert( i, rule ); rule->mParent = this; }
157+
void insertChild( int i, Rule* rule );
158158
//! delete child rule
159-
void removeChild( Rule* rule ) { mChildren.removeAll( rule ); delete rule; }
159+
void removeChild( Rule* rule );
160160
//! delete child rule
161-
void removeChildAt( int i ) { Rule* rule = mChildren[i]; mChildren.removeAt( i ); delete rule; }
161+
void removeChildAt( int i );
162162
//! take child rule out, set parent as null
163-
void takeChild( Rule* rule ) { mChildren.removeAll( rule ); rule->mParent = NULL; }
163+
void takeChild( Rule* rule );
164164
//! take child rule out, set parent as null
165-
Rule* takeChildAt( int i ) { Rule* rule = mChildren.takeAt( i ); rule->mParent = NULL; return rule; }
165+
Rule* takeChildAt( int i );
166+
167+
void updateElseRules();
166168

167169
void setIsElse( bool iselse ) { mElseRule = iselse; }
168170
bool isElse() { return mElseRule; }
@@ -176,6 +178,7 @@ class CORE_EXPORT QgsRuleBasedRendererV2 : public QgsFeatureRendererV2
176178
QString mFilterExp, mLabel, mDescription;
177179
bool mElseRule;
178180
RuleList mChildren;
181+
RuleList mElseRules;
179182

180183
// temporary
181184
QgsExpression* mFilter;

0 commit comments

Comments
 (0)