Skip to content

Commit 3d539c8

Browse files
committedJan 22, 2015
[FEATURE] Show rule-based renderer's legend in a tree hierarchy
The functionality can be used in other renderers too, the only requirement is that legend nodes need to specify their parent rule key via data(). Note that ayer tree model must have ShowLegendAsTree flag enabled, otherwise the model will keep showing lists instead of trees.
1 parent 012c347 commit 3d539c8

11 files changed

+174
-26
lines changed
 

‎python/core/layertree/qgslayertreemodel.sip

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ class QgsLayerTreeModel : QAbstractItemModel
5353
// display flags
5454
ShowLegend, //!< Add legend nodes for layer nodes
5555
ShowSymbology, //!< deprecated - use ShowLegend
56+
ShowLegendAsTree, //!< For legends that support it, will show them in a tree instead of a list (needs also ShowLegend). Added in 2.8
5657

5758
// behavioral flags
5859
AllowNodeReorder, //!< Allow reordering with drag'n'drop

‎python/core/layertree/qgslayertreemodellegendnode.sip

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ class QgsLayerTreeModelLegendNode : QObject
2020
enum LegendNodeRoles
2121
{
2222
RuleKeyRole, //!< rule key of the node (QString)
23-
SymbolV2LegacyRuleKeyRole //!< for QgsSymbolV2LegendNode only - legacy rule key (void ptr, to be cast to QgsSymbolV2 ptr)
23+
SymbolV2LegacyRuleKeyRole, //!< for QgsSymbolV2LegendNode only - legacy rule key (void ptr, to be cast to QgsSymbolV2 ptr)
24+
ParentRuleKeyRole //!< rule key of the parent legend node - for legends with tree hierarchy (QString). Added in 2.8
2425
};
2526

2627
/** Return pointer to the parent layer node */

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ 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, int level = 0 );
18+
//! @note parentRuleKey added in 2.8
19+
QgsLegendSymbolItemV2( QgsSymbolV2* symbol, const QString& label, const QString& ruleKey, bool checkable = false, int scaleMinDenom = -1, int scaleMaxDenom = -1, int level = 0, const QString& parentRuleKey = QString() );
1920
~QgsLegendSymbolItemV2();
2021
QgsLegendSymbolItemV2( const QgsLegendSymbolItemV2& other );
2122
//QgsLegendSymbolItemV2& operator=( const QgsLegendSymbolItemV2& other );
@@ -44,6 +45,9 @@ class QgsLegendSymbolItemV2
4445
//! Identation level that tells how deep the item is in a hierarchy of items. For flat lists level is 0
4546
int level() const;
4647

48+
//! Key of the parent legend node. For legends with tree hierarchy
49+
//! @note added in 2.8
50+
QString parentRuleKey() const;
4751
};
4852

4953

‎src/app/qgisapp.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2322,6 +2322,7 @@ void QgisApp::initLayerTreeView()
23222322
model->setFlag( QgsLayerTreeModel::AllowNodeReorder );
23232323
model->setFlag( QgsLayerTreeModel::AllowNodeRename );
23242324
model->setFlag( QgsLayerTreeModel::AllowNodeChangeVisibility );
2325+
model->setFlag( QgsLayerTreeModel::ShowLegendAsTree );
23252326
model->setAutoCollapseLegendNodes( 10 );
23262327

23272328
mLayerTreeView->setModel( model );

‎src/core/layertree/qgslayertreemodel.cpp

Lines changed: 124 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -114,19 +114,25 @@ QModelIndex QgsLayerTreeModel::parent( const QModelIndex &child ) const
114114
if ( !child.isValid() )
115115
return QModelIndex();
116116

117-
QgsLayerTreeNode *parentNode = 0;
118-
QgsLayerTreeNode *n = index2node( child );
119-
if ( !n )
117+
if ( QgsLayerTreeNode *n = index2node( child ) )
118+
{
119+
return indexOfParentLayerTreeNode( n->parent() ); // must not be null
120+
}
121+
else if ( QgsLayerTreeModelLegendNode* legendNode = index2legendNode( child ) )
120122
{
121-
QgsLayerTreeModelLegendNode* sym = index2legendNode( child );
122-
Q_ASSERT( sym );
123-
parentNode = sym->layerNode();
123+
return legendParent( legendNode );
124124
}
125125
else
126126
{
127-
parentNode = n->parent(); // must not be null
127+
Q_ASSERT( false ); // no other node types!
128+
return QModelIndex();
128129
}
129130

131+
}
132+
133+
134+
QModelIndex QgsLayerTreeModel::indexOfParentLayerTreeNode( QgsLayerTreeNode* parentNode ) const
135+
{
130136
Q_ASSERT( parentNode );
131137

132138
QgsLayerTreeNode* grandParentNode = parentNode->parent();
@@ -1036,7 +1042,10 @@ QList<QgsLayerTreeModelLegendNode*> QgsLayerTreeModel::filterLegendNodes( const
10361042
void QgsLayerTreeModel::legendCleanup()
10371043
{
10381044
foreach ( const LayerLegendData& data, mLegend )
1045+
{
10391046
qDeleteAll( data.originalNodes );
1047+
delete data.tree;
1048+
}
10401049
mLegend.clear();
10411050
}
10421051

@@ -1046,6 +1055,7 @@ void QgsLayerTreeModel::removeLegendFromLayer( QgsLayerTreeLayer* nodeLayer )
10461055
if ( mLegend.contains( nodeLayer ) )
10471056
{
10481057
qDeleteAll( mLegend[nodeLayer].originalNodes );
1058+
delete mLegend[nodeLayer].tree;
10491059
mLegend.remove( nodeLayer );
10501060
}
10511061
}
@@ -1077,13 +1087,60 @@ void QgsLayerTreeModel::addLegendToLayer( QgsLayerTreeLayer* nodeL )
10771087
connect( n, SIGNAL( dataChanged() ), this, SLOT( legendNodeDataChanged() ) );
10781088
}
10791089

1080-
mLegend[nodeL].originalNodes = lstNew;
1081-
mLegend[nodeL].activeNodes = filteredLstNew;
1090+
LayerLegendData& data = mLegend[nodeL];
1091+
data.originalNodes = lstNew;
1092+
data.activeNodes = filteredLstNew;
1093+
1094+
data.tree = 0;
1095+
1096+
// maybe the legend nodes form a tree - try to create a tree structure from the list
1097+
if ( testFlag( ShowLegendAsTree ) )
1098+
tryBuildLegendTree( data );
10821099

10831100
if ( ! isEmbedded ) endInsertRows();
10841101
}
10851102

10861103

1104+
void QgsLayerTreeModel::tryBuildLegendTree( LayerLegendData& data )
1105+
{
1106+
// first check whether there are any legend nodes that are not top-level
1107+
bool hasParentKeys = false;
1108+
foreach ( QgsLayerTreeModelLegendNode* n, data.activeNodes )
1109+
{
1110+
if ( !n->data( QgsLayerTreeModelLegendNode::ParentRuleKeyRole ).toString().isEmpty() )
1111+
{
1112+
hasParentKeys = true;
1113+
break;
1114+
}
1115+
}
1116+
if ( !hasParentKeys )
1117+
return; // all legend nodes are top-level => stick with list representation
1118+
1119+
// make mapping from rules to nodes and do some sanity checks
1120+
QHash<QString, QgsLayerTreeModelLegendNode*> rule2node;
1121+
rule2node[QString()] = 0;
1122+
foreach ( QgsLayerTreeModelLegendNode* n, data.activeNodes )
1123+
{
1124+
QString ruleKey = n->data( QgsLayerTreeModelLegendNode::RuleKeyRole ).toString();
1125+
if ( ruleKey.isEmpty() ) // in tree all nodes must have key
1126+
return;
1127+
if ( rule2node.contains( ruleKey ) ) // and they must be unique
1128+
return;
1129+
rule2node[ruleKey] = n;
1130+
}
1131+
1132+
// create the tree structure
1133+
data.tree = new LayerLegendTree;
1134+
foreach ( QgsLayerTreeModelLegendNode* n, data.activeNodes )
1135+
{
1136+
QString parentRuleKey = n->data( QgsLayerTreeModelLegendNode::ParentRuleKeyRole ).toString();
1137+
QgsLayerTreeModelLegendNode* parent = rule2node.value( parentRuleKey, 0 );
1138+
data.tree->parents[n] = parent;
1139+
data.tree->children[parent] << n;
1140+
}
1141+
}
1142+
1143+
10871144
QgsLayerTreeModelLegendNode* QgsLayerTreeModel::index2legendNode( const QModelIndex& index )
10881145
{
10891146
return qobject_cast<QgsLayerTreeModelLegendNode*>( reinterpret_cast<QObject*>( index.internalPointer() ) );
@@ -1092,9 +1149,26 @@ QgsLayerTreeModelLegendNode* QgsLayerTreeModel::index2legendNode( const QModelIn
10921149

10931150
QModelIndex QgsLayerTreeModel::legendNode2index( QgsLayerTreeModelLegendNode* legendNode )
10941151
{
1152+
const LayerLegendData& data = mLegend[legendNode->layerNode()];
1153+
if ( data.tree )
1154+
{
1155+
if ( QgsLayerTreeModelLegendNode* parentLegendNode = data.tree->parents[legendNode] )
1156+
{
1157+
QModelIndex parentIndex = legendNode2index( parentLegendNode );
1158+
int row = data.tree->children[parentLegendNode].indexOf( legendNode );
1159+
return index( row, 0, parentIndex );
1160+
}
1161+
else
1162+
{
1163+
QModelIndex parentIndex = node2index( legendNode->layerNode() );
1164+
int row = data.tree->children[0].indexOf( legendNode );
1165+
return index( row, 0, parentIndex );
1166+
}
1167+
}
1168+
10951169
QModelIndex parentIndex = node2index( legendNode->layerNode() );
10961170
Q_ASSERT( parentIndex.isValid() );
1097-
int row = mLegend[legendNode->layerNode()].activeNodes.indexOf( legendNode );
1171+
int row = data.activeNodes.indexOf( legendNode );
10981172
if ( row < 0 ) // legend node may be filtered (exists within the list of original nodes, but not in active nodes)
10991173
return QModelIndex();
11001174
return index( row, 0, parentIndex );
@@ -1103,7 +1177,10 @@ QModelIndex QgsLayerTreeModel::legendNode2index( QgsLayerTreeModelLegendNode* le
11031177

11041178
int QgsLayerTreeModel::legendNodeRowCount( QgsLayerTreeModelLegendNode* node ) const
11051179
{
1106-
Q_UNUSED( node );
1180+
const LayerLegendData& data = mLegend[node->layerNode()];
1181+
if ( data.tree )
1182+
return data.tree->children[node].count();
1183+
11071184
return 0; // they are leaves
11081185
}
11091186

@@ -1113,26 +1190,55 @@ int QgsLayerTreeModel::legendRootRowCount( QgsLayerTreeLayer* nL ) const
11131190
if ( legendEmbeddedInParent( nL ) )
11141191
return 0;
11151192

1116-
return mLegend[nL].activeNodes.count();
1193+
const LayerLegendData& data = mLegend[nL];
1194+
if ( data.tree )
1195+
return data.tree->children[0].count();
1196+
1197+
return data.activeNodes.count();
11171198
}
11181199

11191200

11201201
QModelIndex QgsLayerTreeModel::legendRootIndex( int row, int column, QgsLayerTreeLayer* nL ) const
11211202
{
11221203
Q_ASSERT( mLegend.contains( nL ) );
1123-
return createIndex( row, column, static_cast<QObject*>( mLegend[nL].activeNodes.at( row ) ) );
1204+
const LayerLegendData& data = mLegend[nL];
1205+
if ( data.tree )
1206+
return createIndex( row, column, static_cast<QObject*>( data.tree->children[0].at( row ) ) );
1207+
1208+
return createIndex( row, column, static_cast<QObject*>( data.activeNodes.at( row ) ) );
11241209
}
11251210

11261211

11271212
QModelIndex QgsLayerTreeModel::legendNodeIndex( int row, int column, QgsLayerTreeModelLegendNode* node ) const
11281213
{
1129-
Q_UNUSED( row );
1130-
Q_UNUSED( column );
1131-
Q_UNUSED( node );
1214+
const LayerLegendData& data = mLegend[node->layerNode()];
1215+
if ( data.tree )
1216+
return createIndex( row, column, static_cast<QObject*>( data.tree->children[node].at( row ) ) );
1217+
11321218
return QModelIndex(); // have no children
11331219
}
11341220

11351221

1222+
QModelIndex QgsLayerTreeModel::legendParent( QgsLayerTreeModelLegendNode* legendNode ) const
1223+
{
1224+
QgsLayerTreeLayer* layerNode = legendNode->layerNode();
1225+
const LayerLegendData& data = mLegend[layerNode];
1226+
if ( data.tree )
1227+
{
1228+
if ( QgsLayerTreeModelLegendNode* parentNode = data.tree->parents[legendNode] )
1229+
{
1230+
QgsLayerTreeModelLegendNode* grandParentNode = data.tree->parents[parentNode]; // may be null (not a problem)
1231+
int row = data.tree->children[grandParentNode].indexOf( parentNode );
1232+
return createIndex( row, 0, static_cast<QObject*>( parentNode ) );
1233+
}
1234+
else
1235+
return indexOfParentLayerTreeNode( layerNode );
1236+
}
1237+
1238+
return indexOfParentLayerTreeNode( layerNode );
1239+
}
1240+
1241+
11361242
QVariant QgsLayerTreeModel::legendNodeData( QgsLayerTreeModelLegendNode* node, int role ) const
11371243
{
11381244
if ( role == Qt::CheckStateRole && !testFlag( AllowLegendChangeState ) )
@@ -1153,13 +1259,13 @@ Qt::ItemFlags QgsLayerTreeModel::legendNodeFlags( QgsLayerTreeModelLegendNode* n
11531259
bool QgsLayerTreeModel::legendEmbeddedInParent( QgsLayerTreeLayer* nodeLayer ) const
11541260
{
11551261
const LayerLegendData& data = mLegend[nodeLayer];
1156-
return data.activeNodes.count() == 1 && data.activeNodes[0]->isEmbeddedInParent();
1262+
return data.activeNodes.count() == 1 && data.activeNodes[0]->isEmbeddedInParent();
11571263
}
11581264

11591265

11601266
QIcon QgsLayerTreeModel::legendIconEmbeddedInParent( QgsLayerTreeLayer* nodeLayer ) const
11611267
{
1162-
return QIcon( qvariant_cast<QPixmap>( mLegend[nodeLayer].activeNodes[0]->data( Qt::DecorationRole ) ) );
1268+
return QIcon( qvariant_cast<QPixmap>( mLegend[nodeLayer].activeNodes[0]->data( Qt::DecorationRole ) ) );
11631269
}
11641270

11651271

‎src/core/layertree/qgslayertreemodel.h

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ class CORE_EXPORT QgsLayerTreeModel : public QAbstractItemModel
7575
ShowLegend = 0x0001, //!< Add legend nodes for layer nodes
7676
ShowSymbology = 0x0001, //!< deprecated - use ShowLegend
7777
ShowRasterPreviewIcon = 0x0002, //!< Will use real preview of raster layer as icon (may be slow)
78+
ShowLegendAsTree = 0x0004, //!< For legends that support it, will show them in a tree instead of a list (needs also ShowLegend). Added in 2.8
7879

7980
// behavioral flags
8081
AllowNodeReorder = 0x1000, //!< Allow reordering with drag'n'drop
@@ -216,10 +217,13 @@ class CORE_EXPORT QgsLayerTreeModel : public QAbstractItemModel
216217
//! Filter nodes from QgsMapLayerLegend according to the current filtering rules
217218
QList<QgsLayerTreeModelLegendNode*> filterLegendNodes( const QList<QgsLayerTreeModelLegendNode*>& nodes );
218219

220+
QModelIndex indexOfParentLayerTreeNode( QgsLayerTreeNode* parentNode ) const;
221+
219222
int legendRootRowCount( QgsLayerTreeLayer* nL ) const;
220223
int legendNodeRowCount( QgsLayerTreeModelLegendNode* node ) const;
221224
QModelIndex legendRootIndex( int row, int column, QgsLayerTreeLayer* nL ) const;
222225
QModelIndex legendNodeIndex( int row, int column, QgsLayerTreeModelLegendNode* node ) const;
226+
QModelIndex legendParent( QgsLayerTreeModelLegendNode* legendNode ) const;
223227
QVariant legendNodeData( QgsLayerTreeModelLegendNode* node, int role ) const;
224228
Qt::ItemFlags legendNodeFlags( QgsLayerTreeModelLegendNode* node ) const;
225229
bool legendEmbeddedInParent( QgsLayerTreeLayer* nodeLayer ) const;
@@ -237,6 +241,20 @@ class CORE_EXPORT QgsLayerTreeModel : public QAbstractItemModel
237241
//! Minimal number of nodes when legend should be automatically collapsed. -1 = disabled
238242
int mAutoCollapseLegendNodesCount;
239243

244+
//! Structure that stores tree representation of map layer's legend.
245+
//! This structure is used only when the following requirements are met:
246+
//! 1. tree legend representation is enabled in model (ShowLegendAsTree flag)
247+
//! 2. some legend nodes have non-null parent rule key (accessible via data(ParentRuleKeyRole) method)
248+
//! The tree structure (parents and children of each node) is extracted by analyzing nodes' parent rules.
249+
struct LayerLegendTree
250+
{
251+
//! Pointer to parent for each active node. Top-level nodes have null parent. Pointers are not owned.
252+
QMap<QgsLayerTreeModelLegendNode*, QgsLayerTreeModelLegendNode*> parents;
253+
//! List of children for each active node. Top-level nodes are under null pointer key. Pointers are not owned.
254+
QMap<QgsLayerTreeModelLegendNode*, QList<QgsLayerTreeModelLegendNode*> > children;
255+
};
256+
257+
//! Structure that stores all data associated with one map layer
240258
struct LayerLegendData
241259
{
242260
//! Active legend nodes. May have been filtered.
@@ -245,9 +263,12 @@ class CORE_EXPORT QgsLayerTreeModel : public QAbstractItemModel
245263
//! Data structure for storage of legend nodes.
246264
//! These are nodes as received from QgsMapLayerLegend
247265
QList<QgsLayerTreeModelLegendNode*> originalNodes;
248-
//LayerLegendTreeNode* treeRoot; // if null using ordinary
266+
//! Optional pointer to a tree structure - see LayerLegendTree for details
267+
LayerLegendTree* tree;
249268
};
250269

270+
void tryBuildLegendTree( LayerLegendData& data );
271+
251272
//! Per layer data about layer's legend nodes
252273
QMap<QgsLayerTreeLayer*, LayerLegendData> mLegend;
253274

‎src/core/layertree/qgslayertreemodellegendnode.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ QVariant QgsSymbolV2LegendNode::data( int role ) const
195195
pix.fill( Qt::transparent );
196196
}
197197

198-
if ( mItem.level() == 0 )
198+
if ( mItem.level() == 0 || ( model() && model()->testFlag( QgsLayerTreeModel::ShowLegendAsTree ) ) )
199199
mPixmap = pix;
200200
else
201201
{
@@ -229,6 +229,10 @@ QVariant QgsSymbolV2LegendNode::data( int role ) const
229229
{
230230
return QVariant::fromValue<void*>( mItem.legacyRuleKey() );
231231
}
232+
else if ( role == ParentRuleKeyRole )
233+
{
234+
return mItem.parentRuleKey();
235+
}
232236

233237
return QVariant();
234238
}

‎src/core/layertree/qgslayertreemodellegendnode.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ class CORE_EXPORT QgsLayerTreeModelLegendNode : public QObject
4848
enum LegendNodeRoles
4949
{
5050
RuleKeyRole = Qt::UserRole, //!< rule key of the node (QString)
51-
SymbolV2LegacyRuleKeyRole //!< for QgsSymbolV2LegendNode only - legacy rule key (void ptr, to be cast to QgsSymbolV2 ptr)
51+
SymbolV2LegacyRuleKeyRole, //!< for QgsSymbolV2LegendNode only - legacy rule key (void ptr, to be cast to QgsSymbolV2 ptr)
52+
ParentRuleKeyRole //!< rule key of the parent legend node - for legends with tree hierarchy (QString). Added in 2.8
5253
};
5354

5455
/** Return pointer to the parent layer node */

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ QgsLegendSymbolItemV2::QgsLegendSymbolItemV2()
2727
{
2828
}
2929

30-
QgsLegendSymbolItemV2::QgsLegendSymbolItemV2( QgsSymbolV2* symbol, const QString& label, const QString& ruleKey, bool checkable, int scaleMinDenom, int scaleMaxDenom, int level )
30+
QgsLegendSymbolItemV2::QgsLegendSymbolItemV2( QgsSymbolV2* symbol, const QString& label, const QString& ruleKey, bool checkable, int scaleMinDenom, int scaleMaxDenom, int level, const QString& parentRuleKey )
3131
: mSymbol( symbol ? symbol->clone() : 0 )
3232
, mLabel( label )
3333
, mKey( ruleKey )
@@ -36,6 +36,7 @@ QgsLegendSymbolItemV2::QgsLegendSymbolItemV2( QgsSymbolV2* symbol, const QString
3636
, mScaleMinDenom( scaleMinDenom )
3737
, mScaleMaxDenom( scaleMaxDenom )
3838
, mLevel( level )
39+
, mParentKey( parentRuleKey )
3940
{
4041
}
4142

@@ -64,6 +65,7 @@ QgsLegendSymbolItemV2& QgsLegendSymbolItemV2::operator=( const QgsLegendSymbolIt
6465
mScaleMinDenom = other.mScaleMinDenom;
6566
mScaleMaxDenom = other.mScaleMaxDenom;
6667
mLevel = other.mLevel;
68+
mParentKey = other.mParentKey;
6769

6870
return *this;
6971
}

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ 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, int level = 0 );
35+
//! @note parentRuleKey added in 2.8
36+
QgsLegendSymbolItemV2( QgsSymbolV2* symbol, const QString& label, const QString& ruleKey, bool checkable = false, int scaleMinDenom = -1, int scaleMaxDenom = -1, int level = 0, const QString& parentRuleKey = QString() );
3637
~QgsLegendSymbolItemV2();
3738
QgsLegendSymbolItemV2( const QgsLegendSymbolItemV2& other );
3839
QgsLegendSymbolItemV2& operator=( const QgsLegendSymbolItemV2& other );
@@ -61,6 +62,10 @@ class CORE_EXPORT QgsLegendSymbolItemV2
6162
//! Identation level that tells how deep the item is in a hierarchy of items. For flat lists level is 0
6263
int level() const { return mLevel; }
6364

65+
//! Key of the parent legend node. For legends with tree hierarchy
66+
//! @note added in 2.8
67+
QString parentRuleKey() const { return mParentKey; }
68+
6469
protected:
6570
//! Set symbol of the item. Takes ownership of symbol.
6671
void setSymbol( QgsSymbolV2* s );
@@ -84,6 +89,8 @@ class CORE_EXPORT QgsLegendSymbolItemV2
8489

8590
//! Identation level that tells how deep the item is in a hierarchy of items. For flat lists level is 0
8691
int mLevel;
92+
//! Key of the parent legend node. For legends with tree hierarchy
93+
QString mParentKey;
8794
};
8895

8996

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ QgsLegendSymbolListV2 QgsRuleBasedRendererV2::Rule::legendSymbolItemsV2( int cur
219219
QgsLegendSymbolListV2 lst;
220220
if ( currentLevel != -1 ) // root rule should not be shown
221221
{
222-
lst << QgsLegendSymbolItemV2( mSymbol, mLabel, mRuleKey, true, mScaleMinDenom, mScaleMaxDenom, currentLevel );
222+
lst << QgsLegendSymbolItemV2( mSymbol, mLabel, mRuleKey, true, mScaleMinDenom, mScaleMaxDenom, currentLevel, mParent ? mParent->mRuleKey : QString() );
223223
}
224224

225225
for ( RuleList::const_iterator it = mChildren.constBegin(); it != mChildren.constEnd(); ++it )

0 commit comments

Comments
 (0)
Please sign in to comment.