Skip to content

Commit 5eccaf6

Browse files
committed
Project layer order returns all layers in order, not just visible ones
Otherwise map themes with different visible layers cannot be correctly ordered
1 parent 9faa628 commit 5eccaf6

File tree

6 files changed

+38
-9
lines changed

6 files changed

+38
-9
lines changed

doc/api_break.dox

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1261,6 +1261,7 @@ QgsLayerTreeMapCanvasBridge {#qgis_api_break_3_0_QgsLayerTreeMapCanvasBri
12611261
-----------------
12621262

12631263
- setAutoEnableCrsTransform() and autoEnableCrsTransform() were removed. CRS transformation is now always enabled.
1264+
- setCanvasLayers() now requires a third map layer list argument for storage of all layers in the layer tree order.
12641265

12651266

12661267
QgsLayerTreeModel {#qgis_api_break_3_0_QgsLayerTreeMode}

python/gui/layertree/qgslayertreemapcanvasbridge.sip

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ class QgsLayerTreeMapCanvasBridge : QObject
6464

6565
void defaultLayerOrder( QgsLayerTreeNode* node, QStringList& order ) const;
6666

67-
//! Fill canvasLayers and overviewLayers lists from node and its descendants
68-
void setCanvasLayers( QgsLayerTreeNode* node, QList<QgsMapLayer*> &canvasLayers, QList<QgsMapLayer*>& overviewLayers );
67+
void setCanvasLayers( QgsLayerTreeNode *node, QList<QgsMapLayer *> &canvasLayers, QList<QgsMapLayer *> &overviewLayers,
68+
QList<QgsMapLayer *> &allLayers );
6969

7070
void deferredSetCanvasLayers();
7171

src/gui/layertree/qgslayertreemapcanvasbridge.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ void QgsLayerTreeMapCanvasBridge::setCustomLayerOrder( const QStringList &order
117117

118118
void QgsLayerTreeMapCanvasBridge::setCanvasLayers()
119119
{
120-
QList<QgsMapLayer *> canvasLayers, overviewLayers;
120+
QList<QgsMapLayer *> canvasLayers, overviewLayers, allLayerOrder;
121121

122122
if ( mHasCustomLayerOrder )
123123
{
@@ -126,6 +126,7 @@ void QgsLayerTreeMapCanvasBridge::setCanvasLayers()
126126
QgsLayerTreeLayer *nodeLayer = mRoot->findLayer( layerId );
127127
if ( nodeLayer )
128128
{
129+
allLayerOrder << nodeLayer->layer();
129130
if ( nodeLayer->isVisible() )
130131
canvasLayers << nodeLayer->layer();
131132
if ( nodeLayer->customProperty( QStringLiteral( "overview" ), 0 ).toInt() )
@@ -134,13 +135,13 @@ void QgsLayerTreeMapCanvasBridge::setCanvasLayers()
134135
}
135136
}
136137
else
137-
setCanvasLayers( mRoot, canvasLayers, overviewLayers );
138+
setCanvasLayers( mRoot, canvasLayers, overviewLayers, allLayerOrder );
138139

139140
QList<QgsLayerTreeLayer *> layerNodes = mRoot->findLayers();
140141
int currentLayerCount = layerNodes.count();
141142
bool firstLayers = mAutoSetupOnFirstLayer && mLastLayerCount == 0 && currentLayerCount != 0;
142143

143-
QgsProject::instance()->setLayerOrder( canvasLayers );
144+
QgsProject::instance()->setLayerOrder( allLayerOrder );
144145
mCanvas->setLayers( canvasLayers );
145146
if ( mOverviewCanvas )
146147
mOverviewCanvas->setLayers( overviewLayers );
@@ -229,19 +230,20 @@ void QgsLayerTreeMapCanvasBridge::writeProject( QDomDocument &doc )
229230
doc.documentElement().appendChild( elem );
230231
}
231232

232-
void QgsLayerTreeMapCanvasBridge::setCanvasLayers( QgsLayerTreeNode *node, QList<QgsMapLayer *> &canvasLayers, QList<QgsMapLayer *> &overviewLayers )
233+
void QgsLayerTreeMapCanvasBridge::setCanvasLayers( QgsLayerTreeNode *node, QList<QgsMapLayer *> &canvasLayers, QList<QgsMapLayer *> &overviewLayers, QList<QgsMapLayer *> &allLayers )
233234
{
234235
if ( QgsLayerTree::isLayer( node ) )
235236
{
236237
QgsLayerTreeLayer *nodeLayer = QgsLayerTree::toLayer( node );
238+
allLayers << nodeLayer->layer();
237239
if ( nodeLayer->isVisible() )
238240
canvasLayers << nodeLayer->layer();
239241
if ( nodeLayer->customProperty( QStringLiteral( "overview" ), 0 ).toInt() )
240242
overviewLayers << nodeLayer->layer();
241243
}
242244

243245
Q_FOREACH ( QgsLayerTreeNode *child, node->children() )
244-
setCanvasLayers( child, canvasLayers, overviewLayers );
246+
setCanvasLayers( child, canvasLayers, overviewLayers, allLayers );
245247
}
246248

247249
void QgsLayerTreeMapCanvasBridge::deferredSetCanvasLayers()

src/gui/layertree/qgslayertreemapcanvasbridge.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,8 @@ class GUI_EXPORT QgsLayerTreeMapCanvasBridge : public QObject
9999
void defaultLayerOrder( QgsLayerTreeNode *node, QStringList &order ) const;
100100

101101
//! Fill canvasLayers and overviewLayers lists from node and its descendants
102-
void setCanvasLayers( QgsLayerTreeNode *node, QList<QgsMapLayer *> &canvasLayers, QList<QgsMapLayer *> &overviewLayers );
102+
void setCanvasLayers( QgsLayerTreeNode *node, QList<QgsMapLayer *> &canvasLayers, QList<QgsMapLayer *> &overviewLayers,
103+
QList<QgsMapLayer *> &allLayers );
103104

104105
void deferredSetCanvasLayers();
105106

tests/src/python/test_qgsmapthemecollection.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
from qgis.core import (QgsMapThemeCollection,
1818
QgsProject,
1919
QgsVectorLayer)
20+
from qgis.gui import (QgsLayerTreeMapCanvasBridge,
21+
QgsMapCanvas)
2022
from qgis.testing import start_app, unittest
2123
from qgis.PyQt.QtTest import QSignalSpy
2224

@@ -99,7 +101,7 @@ def testThemeChanged(self):
99101

100102
def testMasterLayerOrder(self):
101103
""" test master layer order"""
102-
prj = QgsProject()
104+
prj = QgsProject.instance()
103105
layer = QgsVectorLayer("Point?field=fldtxt:string",
104106
"layer1", "memory")
105107
layer2 = QgsVectorLayer("Point?field=fldtxt:string",
@@ -149,6 +151,23 @@ def testMasterLayerOrder(self):
149151
self.assertEqual(prj.mapThemeCollection().mapThemeVisibleLayerIds('theme2'), [layer2.id(), layer3.id(), layer.id()])
150152
self.assertEqual(prj.mapThemeCollection().mapThemeVisibleLayerIds('theme3'), [layer2.id(), layer.id()])
151153

154+
# check that layers include those hidden in the layer tree
155+
canvas = QgsMapCanvas()
156+
bridge = QgsLayerTreeMapCanvasBridge(prj.layerTreeRoot(), canvas)
157+
root = prj.layerTreeRoot()
158+
layer_node = root.findLayer(layer2.id())
159+
layer_node.setItemVisibilityChecked(False)
160+
app.processEvents()
161+
self.assertEqual(prj.mapThemeCollection().masterLayerOrder(), [layer, layer2, layer3])
162+
163+
self.assertEqual(prj.mapThemeCollection().mapThemeVisibleLayers('theme1'), [layer, layer3])
164+
self.assertEqual(prj.mapThemeCollection().mapThemeVisibleLayers('theme2'), [layer, layer2, layer3])
165+
self.assertEqual(prj.mapThemeCollection().mapThemeVisibleLayers('theme3'), [layer, layer2])
166+
self.assertEqual(prj.mapThemeCollection().mapThemeVisibleLayerIds('theme1'), [layer.id(), layer3.id()])
167+
self.assertEqual(prj.mapThemeCollection().mapThemeVisibleLayerIds('theme2'),
168+
[layer.id(), layer2.id(), layer3.id()])
169+
self.assertEqual(prj.mapThemeCollection().mapThemeVisibleLayerIds('theme3'), [layer.id(), layer2.id()])
170+
152171

153172
if __name__ == '__main__':
154173
unittest.main()

tests/src/python/test_qgsproject.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,12 @@ def testLayerOrderUpdatedThroughBridge(self):
262262
# make sure project respects this
263263
self.assertEqual([l.id() for l in prj.layerOrder()], [layer2.id(), layer.id(), layer3.id()])
264264

265+
# make sure project order includes ALL layers, not just visible ones
266+
layer_node = root.findLayer(layer.id())
267+
layer_node.setItemVisibilityChecked(False)
268+
app.processEvents()
269+
self.assertEqual([l.id() for l in prj.layerOrder()], [layer2.id(), layer.id(), layer3.id()])
270+
265271

266272
if __name__ == '__main__':
267273
unittest.main()

0 commit comments

Comments
 (0)