Skip to content

Commit ce1f657

Browse files
committedSep 2, 2015
rule based renderer: skip else rule for disabled items
1 parent 03d4f63 commit ce1f657

File tree

3 files changed

+53
-23
lines changed

3 files changed

+53
-23
lines changed
 

‎python/core/symbology-ng/qgsrulebasedrendererv2.sip

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,13 @@ class QgsRuleBasedRendererV2 : QgsFeatureRendererV2
5454
class Rule
5555
{
5656
public:
57+
enum RenderResult
58+
{
59+
Filtered = 0, //!< The rule does not apply
60+
Inactive, //!< The rule is inactive
61+
Rendered //!< Something was rendered
62+
};
63+
5764
//! Constructor takes ownership of the symbol
5865
Rule( QgsSymbolV2* symbol /Transfer/, int scaleMinDenom = 0, int scaleMaxDenom = 0, QString filterExp = QString(),
5966
QString label = QString(), QString description = QString(), bool elseRule = false );
@@ -114,7 +121,7 @@ class QgsRuleBasedRendererV2 : QgsFeatureRendererV2
114121
//! @note not available in python bindings
115122
// void setNormZLevels( const QMap<int, int>& zLevelsToNormLevels );
116123

117-
bool renderFeature( QgsRuleBasedRendererV2::FeatureToRender& featToRender, QgsRenderContext& context, QgsRuleBasedRendererV2::RenderQueue& renderQueue );
124+
QgsRuleBasedRendererV2::Rule::RenderResult renderFeature( QgsRuleBasedRendererV2::FeatureToRender& featToRender, QgsRenderContext& context, QgsRuleBasedRendererV2::RenderQueue& renderQueue );
118125

119126
//! only tell whether a feature will be rendered without actually rendering it
120127
bool willRenderFeature( QgsFeature& feat, QgsRenderContext* context = 0);

‎src/core/symbology-ng/qgsrulebasedrendererv2.cpp

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ QgsRuleBasedRendererV2::Rule::Rule( QgsSymbolV2* symbol, int scaleMinDenom, int
3939
, mScaleMinDenom( scaleMinDenom ), mScaleMaxDenom( scaleMaxDenom )
4040
, mFilterExp( filterExp ), mLabel( label ), mDescription( description )
4141
, mElseRule( elseRule )
42-
, mCheckState( true )
42+
, mIsActive( true )
4343
, mFilter( NULL )
4444
{
4545
mRuleKey = QUuid::createUuid().toString();
@@ -239,7 +239,7 @@ bool QgsRuleBasedRendererV2::Rule::isFilterOK( QgsFeature& f, QgsRenderContext*
239239
return true;
240240

241241
context->expressionContext().setFeature( f );
242-
QVariant res = mFilter->evaluate( context ? &context->expressionContext() : 0 );
242+
QVariant res = mFilter->evaluate( &context->expressionContext() );
243243
return res.toInt() != 0;
244244
}
245245

@@ -260,7 +260,7 @@ QgsRuleBasedRendererV2::Rule* QgsRuleBasedRendererV2::Rule::clone() const
260260
{
261261
QgsSymbolV2* sym = mSymbol ? mSymbol->clone() : NULL;
262262
Rule* newrule = new Rule( sym, mScaleMinDenom, mScaleMaxDenom, mFilterExp, mLabel, mDescription );
263-
newrule->setCheckState( mCheckState );
263+
newrule->setCheckState( mIsActive );
264264
// clone children
265265
foreach ( Rule* rule, mChildren )
266266
newrule->appendChild( rule->clone() );
@@ -287,7 +287,7 @@ QDomElement QgsRuleBasedRendererV2::Rule::save( QDomDocument& doc, QgsSymbolV2Ma
287287
ruleElem.setAttribute( "label", mLabel );
288288
if ( !mDescription.isEmpty() )
289289
ruleElem.setAttribute( "description", mDescription );
290-
if ( !mCheckState )
290+
if ( !mIsActive )
291291
ruleElem.setAttribute( "checkstate", 0 );
292292
ruleElem.setAttribute( "key", mRuleKey );
293293

@@ -401,7 +401,7 @@ bool QgsRuleBasedRendererV2::Rule::startRender( QgsRenderContext& context, const
401401
{
402402
mActiveChildren.clear();
403403

404-
if ( ! mCheckState )
404+
if ( ! mIsActive )
405405
return false;
406406

407407
// filter out rules which are not compatible with this scale
@@ -505,18 +505,18 @@ void QgsRuleBasedRendererV2::Rule::setNormZLevels( const QMap<int, int>& zLevels
505505
}
506506

507507

508-
bool QgsRuleBasedRendererV2::Rule::renderFeature( QgsRuleBasedRendererV2::FeatureToRender& featToRender, QgsRenderContext& context, QgsRuleBasedRendererV2::RenderQueue& renderQueue )
508+
QgsRuleBasedRendererV2::Rule::RenderResult QgsRuleBasedRendererV2::Rule::renderFeature( QgsRuleBasedRendererV2::FeatureToRender& featToRender, QgsRenderContext& context, QgsRuleBasedRendererV2::RenderQueue& renderQueue )
509509
{
510510
if ( !isFilterOK( featToRender.feat, &context ) )
511-
return false;
511+
return Filtered;
512512

513513
bool rendered = false;
514514

515515
// create job for this feature and this symbol, add to list of jobs
516-
if ( mSymbol )
516+
if ( mSymbol && mIsActive )
517517
{
518518
// add job to the queue: each symbol's zLevel must be added
519-
foreach ( int normZLevel, mSymbolNormZLevels )
519+
Q_FOREACH ( int normZLevel, mSymbolNormZLevels )
520520
{
521521
//QgsDebugMsg(QString("add job at level %1").arg(normZLevel));
522522
renderQueue[normZLevel].jobs.append( new RenderJob( featToRender, mSymbol ) );
@@ -527,16 +527,15 @@ bool QgsRuleBasedRendererV2::Rule::renderFeature( QgsRuleBasedRendererV2::Featur
527527
bool willrendersomething = false;
528528

529529
// process children
530-
for ( QList<Rule*>::iterator it = mActiveChildren.begin(); it != mActiveChildren.end(); ++it )
530+
Q_FOREACH ( Rule* rule, mChildren )
531531
{
532-
Rule* rule = *it;
533-
if ( rule->isElse() )
532+
// Don't process else rules yet
533+
if ( !rule->isElse() )
534534
{
535-
// Don't process else rules yet
536-
continue;
535+
RenderResult res = rule->renderFeature( featToRender, context, renderQueue );
536+
willrendersomething |= ( res == Rendered );
537+
rendered |= willrendersomething;
537538
}
538-
willrendersomething |= rule->renderFeature( featToRender, context, renderQueue );
539-
rendered |= willrendersomething;
540539
}
541540

542541
// If none of the rules passed then we jump into the else rules and process them.
@@ -547,8 +546,12 @@ bool QgsRuleBasedRendererV2::Rule::renderFeature( QgsRuleBasedRendererV2::Featur
547546
rendered |= rule->renderFeature( featToRender, context, renderQueue );
548547
}
549548
}
550-
551-
return rendered;
549+
if ( !mIsActive )
550+
return Inactive;
551+
else if ( rendered )
552+
return Rendered;
553+
else
554+
return Filtered;
552555
}
553556

554557
bool QgsRuleBasedRendererV2::Rule::willRenderFeature( QgsFeature& feat, QgsRenderContext *context )

‎src/core/symbology-ng/qgsrulebasedrendererv2.h

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,13 @@ class CORE_EXPORT QgsRuleBasedRendererV2 : public QgsFeatureRendererV2
8484
class CORE_EXPORT Rule
8585
{
8686
public:
87+
enum RenderResult
88+
{
89+
Filtered = 0, //!< The rule does not apply
90+
Inactive, //!< The rule is inactive
91+
Rendered //!< Something was rendered
92+
};
93+
8794
//! Constructor takes ownership of the symbol
8895
Rule( QgsSymbolV2* symbol, int scaleMinDenom = 0, int scaleMaxDenom = 0, QString filterExp = QString(),
8996
QString label = QString(), QString description = QString(), bool elseRule = false );
@@ -107,7 +114,14 @@ class CORE_EXPORT QgsRuleBasedRendererV2 : public QgsFeatureRendererV2
107114
QString filterExpression() const { return mFilterExp; }
108115
QString description() const { return mDescription; }
109116
//! @note added in 2.6
110-
bool checkState() const { return mCheckState; }
117+
//! @deprecated use active instead
118+
bool checkState() const { return mIsActive; }
119+
/**
120+
* Returns if this rule is active
121+
*
122+
* @return True if the rule is active
123+
*/
124+
bool active() const { return mIsActive; }
111125

112126
//! Unique rule identifier (for identification of rule within renderer)
113127
//! @note added in 2.6
@@ -124,7 +138,13 @@ class CORE_EXPORT QgsRuleBasedRendererV2 : public QgsFeatureRendererV2
124138
void setFilterExpression( QString filterExp ) { mFilterExp = filterExp; initFilter(); }
125139
void setDescription( QString description ) { mDescription = description; }
126140
//! @note added in 2.6
127-
void setCheckState( bool state ) { mCheckState = state; }
141+
//! @deprecated use setActive instead
142+
void setCheckState( bool state ) { mIsActive = state; }
143+
/**
144+
* Sets if this rule is active
145+
* @param state Determines if the rule should be activated or deactivated
146+
*/
147+
void setActive( bool state ) { mIsActive = state; }
128148

129149
//! clone this rule, return new instance
130150
Rule* clone() const;
@@ -144,7 +164,7 @@ class CORE_EXPORT QgsRuleBasedRendererV2 : public QgsFeatureRendererV2
144164
//! @note not available in python bindings
145165
void setNormZLevels( const QMap<int, int>& zLevelsToNormLevels );
146166

147-
bool renderFeature( FeatureToRender& featToRender, QgsRenderContext& context, RenderQueue& renderQueue );
167+
RenderResult renderFeature( FeatureToRender& featToRender, QgsRenderContext& context, RenderQueue& renderQueue );
148168

149169
//! only tell whether a feature will be rendered without actually rendering it
150170
bool willRenderFeature( QgsFeature& feat, QgsRenderContext* context = 0 );
@@ -195,7 +215,7 @@ class CORE_EXPORT QgsRuleBasedRendererV2 : public QgsFeatureRendererV2
195215
bool mElseRule;
196216
RuleList mChildren;
197217
RuleList mElseRules;
198-
bool mCheckState; // whether it is enabled or not
218+
bool mIsActive; // whether it is enabled or not
199219

200220
QString mRuleKey; // string used for unique identification of rule within renderer
201221

0 commit comments

Comments
 (0)
Failed to load comments.