Skip to content

Commit 452abb2

Browse files
committed
Add method to QgsMapThemeCollection to retrieve ordered list of
visible layers for the project
1 parent a8816e5 commit 452abb2

File tree

4 files changed

+56
-0
lines changed

4 files changed

+56
-0
lines changed

python/core/qgsmapthemecollection.sip

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ class QgsMapThemeCollection : QObject
117117
QgsProject *project();
118118
void setProject( QgsProject *project );
119119
QList< QgsMapLayer * > masterLayerOrder() const;
120+
QList< QgsMapLayer * > masterVisibleLayers() const;
120121

121122
signals:
122123

src/core/qgsmapthemecollection.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,21 @@ QList<QgsMapLayer *> QgsMapThemeCollection::masterLayerOrder() const
183183
return mProject->layerOrder();
184184
}
185185

186+
QList<QgsMapLayer *> QgsMapThemeCollection::masterVisibleLayers() const
187+
{
188+
QList< QgsMapLayer * > visible;
189+
Q_FOREACH ( QgsMapLayer *layer, masterLayerOrder() )
190+
{
191+
QgsLayerTreeLayer *nodeLayer = mProject->layerTreeRoot()->findLayer( layer );
192+
if ( nodeLayer )
193+
{
194+
if ( nodeLayer->isVisible() )
195+
visible << layer;
196+
}
197+
}
198+
return visible;
199+
}
200+
186201

187202
bool QgsMapThemeCollection::hasMapTheme( const QString &name ) const
188203
{

src/core/qgsmapthemecollection.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,9 +246,19 @@ class CORE_EXPORT QgsMapThemeCollection : public QObject
246246
* Returns the master layer order (this will always match the project's QgsProject::layerOrder() ).
247247
* All map themes will maintain the same layer order as the master layer order.
248248
* @note added in QGIS 3.0
249+
* @see masterVisibleLayers()
249250
*/
250251
QList< QgsMapLayer * > masterLayerOrder() const;
251252

253+
/**
254+
* Returns the master list of visible layers. The order of returned layers will always match those
255+
* of masterLayerOrder(), but the returned layers are filtered to only include those visible
256+
* in the project's layer tree.
257+
* @note added in QGIS 3.0
258+
* @see masterLayerOrder()
259+
*/
260+
QList< QgsMapLayer * > masterVisibleLayers() const;
261+
252262
signals:
253263

254264
/**

tests/src/python/test_qgsmapthemecollection.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ def testThemeChanged(self):
102102
def testMasterLayerOrder(self):
103103
""" test master layer order"""
104104
prj = QgsProject.instance()
105+
prj.clear()
105106
layer = QgsVectorLayer("Point?field=fldtxt:string",
106107
"layer1", "memory")
107108
layer2 = QgsVectorLayer("Point?field=fldtxt:string",
@@ -174,6 +175,35 @@ def testMasterLayerOrder(self):
174175
self.assertEqual(prj.mapThemeCollection().mapThemeVisibleLayers('theme2'), [layer3, layer2, layer])
175176
self.assertEqual(prj.mapThemeCollection().mapThemeVisibleLayers('theme3'), [layer2, layer])
176177

178+
def testMasterVisibleLayers(self):
179+
""" test master visible layers"""
180+
prj = QgsProject.instance()
181+
prj.clear()
182+
layer = QgsVectorLayer("Point?field=fldtxt:string",
183+
"layer1", "memory")
184+
layer2 = QgsVectorLayer("Point?field=fldtxt:string",
185+
"layer2", "memory")
186+
layer3 = QgsVectorLayer("Point?field=fldtxt:string",
187+
"layer3", "memory")
188+
prj.addMapLayers([layer, layer2, layer3])
189+
190+
# general setup...
191+
prj.setLayerOrder([layer2, layer])
192+
self.assertEqual(prj.mapThemeCollection().masterVisibleLayers(), [layer2, layer])
193+
prj.setLayerOrder([layer3, layer, layer2])
194+
self.assertEqual(prj.mapThemeCollection().masterVisibleLayers(), [layer3, layer, layer2])
195+
196+
#hide some layers
197+
root = prj.layerTreeRoot()
198+
layer_node = root.findLayer(layer2)
199+
layer_node.setItemVisibilityChecked(False)
200+
self.assertEqual(prj.mapThemeCollection().masterVisibleLayers(), [layer3, layer])
201+
layer_node.setItemVisibilityChecked(True)
202+
self.assertEqual(prj.mapThemeCollection().masterVisibleLayers(), [layer3, layer, layer2])
203+
layer_node.setItemVisibilityChecked(False)
204+
prj.setLayerOrder([layer, layer2, layer3])
205+
self.assertEqual(prj.mapThemeCollection().masterVisibleLayers(), [layer, layer3])
206+
177207

178208
if __name__ == '__main__':
179209
unittest.main()

0 commit comments

Comments
 (0)