Skip to content

Commit 1a7dfa1

Browse files
committedSep 12, 2014
[FEATURE] display rule-based renderer legend in a pseudo-tree (in layer tree model/view)
1 parent 95f3550 commit 1a7dfa1

9 files changed

+50
-12
lines changed
 

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class QgsLegendSymbolItemV2
1515
public:
1616
QgsLegendSymbolItemV2();
1717
//! Construct item. Does not take ownership of symbol (makes internal clone)
18-
QgsLegendSymbolItemV2( QgsSymbolV2* symbol, const QString& label, const QString& ruleKey, bool checkable = false, int scaleMinDenom = -1, int scaleMaxDenom = -1 );
18+
QgsLegendSymbolItemV2( QgsSymbolV2* symbol, const QString& label, const QString& ruleKey, bool checkable = false, int scaleMinDenom = -1, int scaleMaxDenom = -1, int level = 0 );
1919
~QgsLegendSymbolItemV2();
2020
QgsLegendSymbolItemV2( const QgsLegendSymbolItemV2& other );
2121
//QgsLegendSymbolItemV2& operator=( const QgsLegendSymbolItemV2& other );
@@ -41,6 +41,9 @@ class QgsLegendSymbolItemV2
4141
//! Value <= 0 means the range is unbounded on this side
4242
int scaleMaxDenom() const;
4343

44+
//! Identation level that tells how deep the item is in a hierarchy of items. For flat lists level is 0
45+
int level() const;
46+
4447
};
4548

4649

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ class QgsRuleBasedRendererV2 : QgsFeatureRendererV2
6363
QgsSymbolV2List symbols();
6464
//! @note not available in python bindings
6565
// QgsLegendSymbolList legendSymbolItems();
66+
//! @note added in 2.6
67+
QgsLegendSymbolListV2 legendSymbolItemsV2( int currentLevel = -1 ) const;
6668
bool isFilterOK( QgsFeature& f ) const;
6769
bool isScaleOK( double scale ) const;
6870

‎src/core/layertree/qgslayertreemodel.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ QgsLayerTreeModel::QgsLayerTreeModel( QgsLayerTreeGroup* rootNode, QObject *pare
3535
, mRootNode( rootNode )
3636
, mFlags( ShowLegend | AllowLegendChangeState )
3737
, mAutoCollapseLegendNodesCount( -1 )
38+
, mLegendFilterByScale( 0 )
3839
{
3940
connectToRootNode();
4041

‎src/core/layertree/qgslayertreemodellegendnode.cpp

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -155,9 +155,32 @@ QVariant QgsSymbolV2LegendNode::data( int role ) const
155155
else if ( role == Qt::DecorationRole )
156156
{
157157
QSize iconSize( 16, 16 ); // TODO: configurable
158-
if ( mIcon.isNull() && mItem.symbol() )
159-
mIcon = QgsSymbolLayerV2Utils::symbolPreviewPixmap( mItem.symbol(), iconSize );
160-
return mIcon;
158+
const int indentSize = 20;
159+
if ( mPixmap.isNull() )
160+
{
161+
QPixmap pix;
162+
if ( mItem.symbol() )
163+
pix = QgsSymbolLayerV2Utils::symbolPreviewPixmap( mItem.symbol(), iconSize );
164+
else
165+
{
166+
pix = QPixmap( iconSize );
167+
pix.fill( Qt::transparent );
168+
}
169+
170+
if ( mItem.level() == 0 )
171+
mPixmap = pix;
172+
else
173+
{
174+
// ident the symbol icon to make it look like a tree structure
175+
QPixmap pix2( pix.width() + mItem.level() * indentSize, pix.height() );
176+
pix2.fill( Qt::transparent );
177+
QPainter p( &pix2 );
178+
p.drawPixmap( mItem.level() * indentSize, 0, pix );
179+
p.end();
180+
mPixmap = pix2;
181+
}
182+
}
183+
return mPixmap;
161184
}
162185
else if ( role == Qt::CheckStateRole )
163186
{

‎src/core/layertree/qgslayertreemodellegendnode.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ class CORE_EXPORT QgsSymbolV2LegendNode : public QgsLayerTreeModelLegendNode
150150

151151
private:
152152
QgsLegendSymbolItemV2 mItem;
153-
mutable QIcon mIcon; // cached symbol preview
153+
mutable QPixmap mPixmap; // cached symbol preview
154154
QString mLabel;
155155
};
156156

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,19 @@ QgsLegendSymbolItemV2::QgsLegendSymbolItemV2()
2323
, mOriginalSymbolPointer( 0 )
2424
, mScaleMinDenom( -1 )
2525
, mScaleMaxDenom( -1 )
26+
, mLevel( 0 )
2627
{
2728
}
2829

29-
QgsLegendSymbolItemV2::QgsLegendSymbolItemV2( QgsSymbolV2* symbol, const QString& label, const QString& ruleKey, bool checkable, int scaleMinDenom, int scaleMaxDenom )
30+
QgsLegendSymbolItemV2::QgsLegendSymbolItemV2( QgsSymbolV2* symbol, const QString& label, const QString& ruleKey, bool checkable, int scaleMinDenom, int scaleMaxDenom, int level )
3031
: mSymbol( symbol ? symbol->clone() : 0 )
3132
, mLabel( label )
3233
, mKey( ruleKey )
3334
, mCheckable( checkable )
3435
, mOriginalSymbolPointer( symbol )
3536
, mScaleMinDenom( scaleMinDenom )
3637
, mScaleMaxDenom( scaleMaxDenom )
38+
, mLevel( level )
3739
{
3840
}
3941

@@ -61,6 +63,7 @@ QgsLegendSymbolItemV2& QgsLegendSymbolItemV2::operator=( const QgsLegendSymbolIt
6163
mOriginalSymbolPointer = other.mOriginalSymbolPointer;
6264
mScaleMinDenom = other.mScaleMinDenom;
6365
mScaleMaxDenom = other.mScaleMaxDenom;
66+
mLevel = other.mLevel;
6467

6568
return *this;
6669
}

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class CORE_EXPORT QgsLegendSymbolItemV2
3232
public:
3333
QgsLegendSymbolItemV2();
3434
//! Construct item. Does not take ownership of symbol (makes internal clone)
35-
QgsLegendSymbolItemV2( QgsSymbolV2* symbol, const QString& label, const QString& ruleKey, bool checkable = false, int scaleMinDenom = -1, int scaleMaxDenom = -1 );
35+
QgsLegendSymbolItemV2( QgsSymbolV2* symbol, const QString& label, const QString& ruleKey, bool checkable = false, int scaleMinDenom = -1, int scaleMaxDenom = -1, int level = 0 );
3636
~QgsLegendSymbolItemV2();
3737
QgsLegendSymbolItemV2( const QgsLegendSymbolItemV2& other );
3838
QgsLegendSymbolItemV2& operator=( const QgsLegendSymbolItemV2& other );
@@ -58,6 +58,9 @@ class CORE_EXPORT QgsLegendSymbolItemV2
5858
//! Value <= 0 means the range is unbounded on this side
5959
int scaleMaxDenom() const { return mScaleMaxDenom; }
6060

61+
//! Identation level that tells how deep the item is in a hierarchy of items. For flat lists level is 0
62+
int level() const { return mLevel; }
63+
6164
protected:
6265
//! Set symbol of the item. Takes ownership of symbol.
6366
void setSymbol( QgsSymbolV2* s );
@@ -78,6 +81,9 @@ class CORE_EXPORT QgsLegendSymbolItemV2
7881

7982
int mScaleMinDenom;
8083
int mScaleMaxDenom;
84+
85+
//! Identation level that tells how deep the item is in a hierarchy of items. For flat lists level is 0
86+
int mLevel;
8187
};
8288

8389

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -211,18 +211,18 @@ QgsLegendSymbolList QgsRuleBasedRendererV2::Rule::legendSymbolItems( double scal
211211
return lst;
212212
}
213213

214-
QgsLegendSymbolListV2 QgsRuleBasedRendererV2::Rule::legendSymbolItemsV2() const
214+
QgsLegendSymbolListV2 QgsRuleBasedRendererV2::Rule::legendSymbolItemsV2( int currentLevel ) const
215215
{
216216
QgsLegendSymbolListV2 lst;
217-
if ( mSymbol )
217+
if ( currentLevel != -1 ) // root rule should not be shown
218218
{
219-
lst << QgsLegendSymbolItemV2( mSymbol, mLabel, mRuleKey, true, mScaleMinDenom, mScaleMaxDenom );
219+
lst << QgsLegendSymbolItemV2( mSymbol, mLabel, mRuleKey, true, mScaleMinDenom, mScaleMaxDenom, currentLevel );
220220
}
221221

222222
for ( RuleList::const_iterator it = mChildren.constBegin(); it != mChildren.constEnd(); ++it )
223223
{
224224
Rule* rule = *it;
225-
lst << rule->legendSymbolItemsV2();
225+
lst << rule->legendSymbolItemsV2( currentLevel + 1 );
226226
}
227227
return lst;
228228
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ class CORE_EXPORT QgsRuleBasedRendererV2 : public QgsFeatureRendererV2
9595
//! @note not available in python bindings
9696
QgsLegendSymbolList legendSymbolItems( double scaleDenominator = -1, QString rule = "" );
9797
//! @note added in 2.6
98-
QgsLegendSymbolListV2 legendSymbolItemsV2() const;
98+
QgsLegendSymbolListV2 legendSymbolItemsV2( int currentLevel = -1 ) const;
9999
bool isFilterOK( QgsFeature& f ) const;
100100
bool isScaleOK( double scale ) const;
101101

0 commit comments

Comments
 (0)
Please sign in to comment.