Skip to content

Commit 5047571

Browse files
committed
Move recursive "collect layers" algorithm to QgsLayerTreeUtils + tests
1 parent ea17162 commit 5047571

File tree

5 files changed

+67
-19
lines changed

5 files changed

+67
-19
lines changed

python/core/auto_generated/layertree/qgslayertreeutils.sip.in

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,14 @@ Insert a QgsMapLayer just below another one
9696
:param layerToInsert: the new layer to insert just below the reference layer
9797

9898
:return: the new tree layer
99+
%End
100+
101+
static QSet<QgsMapLayer *> collectMapLayersRecursive( const QList<QgsLayerTreeNode *> &nodes );
102+
%Docstring
103+
Returns map layers from the given list of layer tree nodes. Also recursively visits
104+
child nodes of groups.
105+
106+
.. versionadded:: 3.4
99107
%End
100108
};
101109

src/core/layertree/qgslayertreeutils.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,3 +413,27 @@ QgsLayerTreeLayer *QgsLayerTreeUtils::insertLayerBelow( QgsLayerTreeGroup *group
413413
QgsLayerTreeGroup *parent = static_cast<QgsLayerTreeGroup *>( inTree->parent() ) ? static_cast<QgsLayerTreeGroup *>( inTree->parent() ) : group;
414414
return parent->insertLayer( idx, layerToInsert );
415415
}
416+
417+
static void _collectMapLayers( const QList<QgsLayerTreeNode *> &nodes, QSet<QgsMapLayer *> &layersSet )
418+
{
419+
for ( QgsLayerTreeNode *node : nodes )
420+
{
421+
if ( QgsLayerTree::isLayer( node ) )
422+
{
423+
QgsLayerTreeLayer *nodeLayer = QgsLayerTree::toLayer( node );
424+
if ( nodeLayer->layer() )
425+
layersSet << nodeLayer->layer();
426+
}
427+
else if ( QgsLayerTree::isGroup( node ) )
428+
{
429+
_collectMapLayers( QgsLayerTree::toGroup( node )->children(), layersSet );
430+
}
431+
}
432+
}
433+
434+
QSet<QgsMapLayer *> QgsLayerTreeUtils::collectMapLayersRecursive( const QList<QgsLayerTreeNode *> &nodes )
435+
{
436+
QSet<QgsMapLayer *> layersSet;
437+
_collectMapLayers( nodes, layersSet );
438+
return layersSet;
439+
}

src/core/layertree/qgslayertreeutils.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,13 @@ class CORE_EXPORT QgsLayerTreeUtils
8787
* \returns the new tree layer
8888
*/
8989
static QgsLayerTreeLayer *insertLayerBelow( QgsLayerTreeGroup *group, const QgsMapLayer *refLayer, QgsMapLayer *layerToInsert );
90+
91+
/**
92+
* Returns map layers from the given list of layer tree nodes. Also recursively visits
93+
* child nodes of groups.
94+
* \since QGIS 3.4
95+
*/
96+
static QSet<QgsMapLayer *> collectMapLayersRecursive( const QList<QgsLayerTreeNode *> &nodes );
9097
};
9198

9299
#endif // QGSLAYERTREEUTILS_H

src/gui/layertree/qgslayertreeview.cpp

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "qgslayertreeembeddedwidgetregistry.h"
2020
#include "qgslayertreemodel.h"
2121
#include "qgslayertreemodellegendnode.h"
22+
#include "qgslayertreeutils.h"
2223
#include "qgslayertreeviewdefaultactions.h"
2324
#include "qgsmaplayer.h"
2425
#include "qgsgui.h"
@@ -356,28 +357,10 @@ QList<QgsMapLayer *> QgsLayerTreeView::selectedLayers() const
356357
return list;
357358
}
358359

359-
static void _collectMapLayers( const QList<QgsLayerTreeNode *> &nodes, QSet<QgsMapLayer *> &layersSet )
360-
{
361-
for ( QgsLayerTreeNode *node : nodes )
362-
{
363-
if ( QgsLayerTree::isLayer( node ) )
364-
{
365-
QgsLayerTreeLayer *nodeLayer = QgsLayerTree::toLayer( node );
366-
if ( nodeLayer->layer() )
367-
layersSet << nodeLayer->layer();
368-
}
369-
else if ( QgsLayerTree::isGroup( node ) )
370-
{
371-
_collectMapLayers( QgsLayerTree::toGroup( node )->children(), layersSet );
372-
}
373-
}
374-
}
375-
376360
QList<QgsMapLayer *> QgsLayerTreeView::selectedLayersRecursive() const
377361
{
378-
QSet<QgsMapLayer *> layersSet;
379362
const QList<QgsLayerTreeNode *> nodes = layerTreeModel()->indexes2nodes( selectionModel()->selectedIndexes(), false );
380-
_collectMapLayers( nodes, layersSet );
363+
QSet<QgsMapLayer *> layersSet = QgsLayerTreeUtils::collectMapLayersRecursive( nodes );
381364
return layersSet.toList();
382365
}
383366

tests/src/core/testqgslayertree.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include <qgsrulebasedrenderer.h>
2727
#include <qgslayertreemodel.h>
2828
#include <qgslayertreemodellegendnode.h>
29+
#include <qgslayertreeutils.h>
2930

3031
class TestQgsLayerTree : public QObject
3132
{
@@ -50,6 +51,7 @@ class TestQgsLayerTree : public QObject
5051
void testFindLayer();
5152
void testLayerDeleted();
5253
void testFindGroups();
54+
void testUtilsCollectMapLayers();
5355

5456
private:
5557

@@ -661,6 +663,30 @@ void TestQgsLayerTree::testFindGroups()
661663
QVERIFY( groups.contains( group3 ) );
662664
}
663665

666+
void TestQgsLayerTree::testUtilsCollectMapLayers()
667+
{
668+
QgsVectorLayer *vl1 = new QgsVectorLayer( QStringLiteral( "Point?field=col1:integer" ), QStringLiteral( "vl1" ), QStringLiteral( "memory" ) );
669+
QgsVectorLayer *vl2 = new QgsVectorLayer( QStringLiteral( "Point?field=col1:integer" ), QStringLiteral( "vl1" ), QStringLiteral( "memory" ) );
670+
671+
QgsProject project;
672+
project.addMapLayer( vl1 );
673+
project.addMapLayer( vl2 );
674+
675+
QgsLayerTree root;
676+
QgsLayerTreeLayer *nodeVl1 = root.addLayer( vl1 );
677+
QgsLayerTreeGroup *nodeGrp = root.addGroup( "grp" );
678+
QgsLayerTreeLayer *nodeVl2 = nodeGrp->addLayer( vl2 );
679+
Q_UNUSED( nodeVl2 );
680+
681+
QSet<QgsMapLayer *> set1 = QgsLayerTreeUtils::collectMapLayersRecursive( QList<QgsLayerTreeNode *>() << &root );
682+
QSet<QgsMapLayer *> set2 = QgsLayerTreeUtils::collectMapLayersRecursive( QList<QgsLayerTreeNode *>() << nodeVl1 );
683+
QSet<QgsMapLayer *> set3 = QgsLayerTreeUtils::collectMapLayersRecursive( QList<QgsLayerTreeNode *>() << nodeGrp );
684+
685+
QCOMPARE( set1, QSet<QgsMapLayer *>() << vl1 << vl2 );
686+
QCOMPARE( set2, QSet<QgsMapLayer *>() << vl1 );
687+
QCOMPARE( set3, QSet<QgsMapLayer *>() << vl2 );
688+
}
689+
664690

665691
QGSTEST_MAIN( TestQgsLayerTree )
666692
#include "testqgslayertree.moc"

0 commit comments

Comments
 (0)