Skip to content

Commit 02ed712

Browse files
committed
Add ELSE to rule based renderer
1 parent ebc1573 commit 02ed712

File tree

3 files changed

+52
-7
lines changed

3 files changed

+52
-7
lines changed

src/core/symbology-ng/qgsrulebasedrendererv2.cpp

+29-5
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@
2929

3030

3131

32-
QgsRuleBasedRendererV2::Rule::Rule( QgsSymbolV2* symbol, int scaleMinDenom, int scaleMaxDenom, QString filterExp, QString label, QString description )
32+
QgsRuleBasedRendererV2::Rule::Rule(QgsSymbolV2* symbol, int scaleMinDenom, int scaleMaxDenom, QString filterExp, QString label, QString description , bool elseRule)
3333
: mParent( NULL ), mSymbol( symbol ),
3434
mScaleMinDenom( scaleMinDenom ), mScaleMaxDenom( scaleMaxDenom ),
3535
mFilterExp( filterExp ), mLabel( label ), mDescription( description ),
36-
mFilter( NULL )
36+
mFilter( NULL ), mElseRule( elseRule )
3737
{
3838
initFilter();
3939
}
@@ -48,7 +48,12 @@ QgsRuleBasedRendererV2::Rule::~Rule()
4848

4949
void QgsRuleBasedRendererV2::Rule::initFilter()
5050
{
51-
if ( !mFilterExp.isEmpty() )
51+
if ( mElseRule || mFilterExp.compare("ELSE", Qt::CaseInsensitive) == 0 )
52+
{
53+
mElseRule = true;
54+
mFilter = NULL;
55+
}
56+
else if ( !mFilterExp.isEmpty() )
5257
{
5358
delete mFilter;
5459
mFilter = new QgsExpression( mFilterExp );
@@ -132,7 +137,7 @@ QgsLegendSymbolList QgsRuleBasedRendererV2::Rule::legendSymbolItems()
132137

133138
bool QgsRuleBasedRendererV2::Rule::isFilterOK( QgsFeature& f ) const
134139
{
135-
if ( ! mFilter )
140+
if ( ! mFilter || mElseRule )
136141
return true;
137142

138143
QVariant res = mFilter->evaluate( &f );
@@ -373,12 +378,31 @@ bool QgsRuleBasedRendererV2::Rule::renderFeature( QgsRuleBasedRendererV2::Featur
373378
rendered = true;
374379
}
375380

381+
QList<Rule*> elserules;
382+
bool willrendersomething = false;
383+
376384
// process children
377385
for ( QList<Rule*>::iterator it = mActiveChildren.begin(); it != mActiveChildren.end(); ++it )
378386
{
379387
Rule* rule = *it;
380-
rendered |= rule->renderFeature( featToRender, context, renderQueue );
388+
if ( rule->isElse())
389+
{
390+
elserules << rule;
391+
continue;
392+
}
393+
willrendersomething |= rule->renderFeature( featToRender, context, renderQueue );
394+
rendered |= willrendersomething;
381395
}
396+
397+
// If none of the rules passed then we jump into the else rules and process them.
398+
if ( !willrendersomething )
399+
{
400+
foreach(Rule* rule, elserules)
401+
{
402+
rendered |= rule->renderFeature( featToRender, context, renderQueue );
403+
}
404+
}
405+
382406
return rendered;
383407
}
384408

src/core/symbology-ng/qgsrulebasedrendererv2.h

+4-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ class CORE_EXPORT QgsRuleBasedRendererV2 : public QgsFeatureRendererV2
8686
public:
8787
//! Constructor takes ownership of the symbol
8888
Rule( QgsSymbolV2* symbol, int scaleMinDenom = 0, int scaleMaxDenom = 0, QString filterExp = QString(),
89-
QString label = QString(), QString description = QString() );
89+
QString label = QString(), QString description = QString(), bool elseRule = false );
9090
//Rule( const Rule& other );
9191
~Rule();
9292
QString dump( int offset = 0 ) const;
@@ -164,6 +164,9 @@ class CORE_EXPORT QgsRuleBasedRendererV2 : public QgsFeatureRendererV2
164164
//! take child rule out, set parent as null
165165
Rule* takeChildAt( int i ) { Rule* rule = mChildren.takeAt( i ); rule->mParent = NULL; return rule; }
166166

167+
void setIsElse( bool iselse ) { mElseRule = iselse; }
168+
bool isElse() { return mElseRule; }
169+
167170
protected:
168171
void initFilter();
169172

src/gui/symbology-ng/qgsrulebasedrendererv2widget.cpp

+19-1
Original file line numberDiff line numberDiff line change
@@ -636,7 +636,15 @@ QVariant QgsRuleBasedRendererV2Model::data( const QModelIndex &index, int role )
636636
switch ( index.column() )
637637
{
638638
case 0: return rule->label();
639-
case 1: return rule->filterExpression().isEmpty() ? tr( "(no filter)" ) : rule->filterExpression();
639+
case 1:
640+
if ( rule->isElse() )
641+
{
642+
return "ELSE";
643+
}
644+
else
645+
{
646+
return rule->filterExpression().isEmpty() ? tr( "(no filter)" ) : rule->filterExpression();
647+
}
640648
case 2: return rule->dependsOnScale() ? _formatScale( rule->scaleMinDenom() ) : QVariant();
641649
case 3: return rule->dependsOnScale() ? _formatScale( rule->scaleMaxDenom() ) : QVariant();
642650
case 4:
@@ -683,6 +691,16 @@ QVariant QgsRuleBasedRendererV2Model::data( const QModelIndex &index, int role )
683691
{
684692
return ( index.column() == 2 || index.column() == 3 ) ? Qt::AlignRight : Qt::AlignLeft;
685693
}
694+
else if (role == Qt::FontRole && index.column() == 1)
695+
{
696+
if ( rule->isElse() )
697+
{
698+
QFont italicFont;
699+
italicFont.setItalic(true);
700+
return italicFont;
701+
}
702+
return QVariant();
703+
}
686704
else if ( role == Qt::EditRole )
687705
{
688706
switch ( index.column() )

0 commit comments

Comments
 (0)