Skip to content

Commit 83e139a

Browse files
committed
Add method for retrieving legend nodes by layer ID and legend rule key
1 parent 197ee6c commit 83e139a

File tree

4 files changed

+81
-0
lines changed

4 files changed

+81
-0
lines changed

python/core/layertree/qgslayertreemodel.sip

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,15 @@ class QgsLayerTreeModel : QAbstractItemModel
9797
//! @note added in 2.6
9898
QList<QgsLayerTreeModelLegendNode*> layerLegendNodes( QgsLayerTreeLayer* nodeLayer );
9999

100+
/** Searches through the layer tree to find a legend node with a matching layer ID
101+
* and rule key.
102+
* @param layerId map layer ID
103+
* @param ruleKey legend node rule key
104+
* @returns QgsLayerTreeModelLegendNode if found
105+
* @note added in QGIS 2.14
106+
*/
107+
QgsLayerTreeModelLegendNode* findLegendNode( const QString& layerId, const QString& ruleKey ) const;
108+
100109
//! Return pointer to the root node of the layer tree. Always a non-null pointer.
101110
QgsLayerTreeGroup* rootGroup() const;
102111
//! Reset the model and use a new root group node

src/core/layertree/qgslayertreemodel.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1333,6 +1333,26 @@ QList<QgsLayerTreeModelLegendNode*> QgsLayerTreeModel::layerLegendNodes( QgsLaye
13331333
return mLegend.value( nodeLayer ).activeNodes;
13341334
}
13351335

1336+
QgsLayerTreeModelLegendNode* QgsLayerTreeModel::findLegendNode( const QString& layerId, const QString& ruleKey ) const
1337+
{
1338+
Q_FOREACH ( QgsLayerTreeLayer* layer, mLegend.keys() )
1339+
{
1340+
if ( layer->layerId() == layerId )
1341+
{
1342+
Q_FOREACH ( QgsLayerTreeModelLegendNode* legendNode, mLegend.value( layer ).activeNodes )
1343+
{
1344+
if ( legendNode->data( QgsLayerTreeModelLegendNode::RuleKeyRole ).toString() == ruleKey )
1345+
{
1346+
//found it!
1347+
return legendNode;
1348+
}
1349+
}
1350+
}
1351+
}
1352+
1353+
return 0;
1354+
}
1355+
13361356
void QgsLayerTreeModel::legendInvalidateMapBasedData()
13371357
{
13381358
if ( !testFlag( DeferredLegendInvalidation ) )

src/core/layertree/qgslayertreemodel.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,15 @@ class CORE_EXPORT QgsLayerTreeModel : public QAbstractItemModel
121121
//! @note added in 2.6
122122
QList<QgsLayerTreeModelLegendNode*> layerLegendNodes( QgsLayerTreeLayer* nodeLayer );
123123

124+
/** Searches through the layer tree to find a legend node with a matching layer ID
125+
* and rule key.
126+
* @param layerId map layer ID
127+
* @param ruleKey legend node rule key
128+
* @returns QgsLayerTreeModelLegendNode if found
129+
* @note added in QGIS 2.14
130+
*/
131+
QgsLayerTreeModelLegendNode* findLegendNode( const QString& layerId, const QString& ruleKey ) const;
132+
124133
//! Return pointer to the root node of the layer tree. Always a non-null pointer.
125134
QgsLayerTreeGroup* rootGroup() const;
126135
//! Reset the model and use a new root group node

tests/src/core/testqgslayertree.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ class TestQgsLayerTree : public QObject
3838
void testCheckStateMutuallyExclusive();
3939
void testCheckStateMutuallyExclusiveEdgeCases();
4040
void testShowHideAllSymbolNodes();
41+
void testFindLegendNode();
4142

4243
private:
4344

@@ -268,6 +269,48 @@ void TestQgsLayerTree::testShowHideAllSymbolNodes()
268269
QgsMapLayerRegistry::instance()->removeMapLayers( QList<QgsMapLayer*>() << vl );
269270
}
270271

272+
void TestQgsLayerTree::testFindLegendNode()
273+
{
274+
//new memory layer
275+
QgsVectorLayer* vl = new QgsVectorLayer( "Point?field=col1:integer", "vl", "memory" );
276+
QVERIFY( vl->isValid() );
277+
278+
QgsMapLayerRegistry::instance()->addMapLayers( QList<QgsMapLayer*>() << vl );
279+
280+
//create a categorized renderer for layer
281+
QgsCategorizedSymbolRendererV2* renderer = new QgsCategorizedSymbolRendererV2();
282+
renderer->setClassAttribute( "col1" );
283+
renderer->setSourceSymbol( QgsSymbolV2::defaultSymbol( QGis::Point ) );
284+
renderer->addCategory( QgsRendererCategoryV2( "a", QgsSymbolV2::defaultSymbol( QGis::Point ), "a" ) );
285+
renderer->addCategory( QgsRendererCategoryV2( "b", QgsSymbolV2::defaultSymbol( QGis::Point ), "b" ) );
286+
renderer->addCategory( QgsRendererCategoryV2( "c", QgsSymbolV2::defaultSymbol( QGis::Point ), "c" ) );
287+
vl->setRendererV2( renderer );
288+
289+
//create legend with symbology nodes for categorized renderer
290+
QgsLayerTreeGroup* root = new QgsLayerTreeGroup();
291+
QgsLayerTreeModel* m = new QgsLayerTreeModel( root, 0 );
292+
QVERIFY( !m->findLegendNode( QString( "id" ), QString( "rule" ) ) );
293+
QgsLayerTreeLayer* n = new QgsLayerTreeLayer( vl );
294+
root->addChildNode( n );
295+
m->refreshLayerLegend( n );
296+
QVERIFY( !m->findLegendNode( QString( "id" ), QString( "rule" ) ) );
297+
QVERIFY( !m->findLegendNode( QString( "vl" ), QString( "rule" ) ) );
298+
299+
QgsLegendSymbolListV2 symbolList = renderer->legendSymbolItemsV2();
300+
Q_FOREACH ( const QgsLegendSymbolItemV2& symbol, symbolList )
301+
{
302+
QgsLayerTreeModelLegendNode* found = m->findLegendNode( vl->id(), symbol.ruleKey() );
303+
QVERIFY( found );
304+
QCOMPARE( found->layerNode()->layerId(), vl->id() );
305+
QCOMPARE( found->data( Qt::DisplayRole ).toString(), symbol.label() );
306+
}
307+
308+
//cleanup
309+
delete m;
310+
delete root;
311+
QgsMapLayerRegistry::instance()->removeMapLayers( QList<QgsMapLayer*>() << vl );
312+
}
313+
271314

272315
QTEST_MAIN( TestQgsLayerTree )
273316
#include "testqgslayertree.moc"

0 commit comments

Comments
 (0)