Skip to content

Commit 48410c4

Browse files
committed
Ensure that non-spatial layers are never set as canvas layers
(cherry-picked from 8e4b8a)
1 parent 7b7f915 commit 48410c4

File tree

2 files changed

+47
-5
lines changed

2 files changed

+47
-5
lines changed

src/gui/layertree/qgslayertreemapcanvasbridge.cpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ void QgsLayerTreeMapCanvasBridge::setCanvasLayers()
4949
QgsLayerTreeLayer *nodeLayer = mRoot->findLayer( layer->id() );
5050
if ( nodeLayer )
5151
{
52+
if ( !nodeLayer->layer()->isSpatial() )
53+
continue;
54+
5255
allLayerOrder << nodeLayer->layer();
5356
if ( nodeLayer->isVisible() )
5457
canvasLayers << nodeLayer->layer();
@@ -106,11 +109,14 @@ void QgsLayerTreeMapCanvasBridge::setCanvasLayers( QgsLayerTreeNode *node, QList
106109
if ( QgsLayerTree::isLayer( node ) )
107110
{
108111
QgsLayerTreeLayer *nodeLayer = QgsLayerTree::toLayer( node );
109-
allLayers << nodeLayer->layer();
110-
if ( nodeLayer->isVisible() )
111-
canvasLayers << nodeLayer->layer();
112-
if ( nodeLayer->customProperty( QStringLiteral( "overview" ), 0 ).toInt() )
113-
overviewLayers << nodeLayer->layer();
112+
if ( nodeLayer->layer()->isSpatial() )
113+
{
114+
allLayers << nodeLayer->layer();
115+
if ( nodeLayer->isVisible() )
116+
canvasLayers << nodeLayer->layer();
117+
if ( nodeLayer->customProperty( QStringLiteral( "overview" ), 0 ).toInt() )
118+
overviewLayers << nodeLayer->layer();
119+
}
114120
}
115121

116122
Q_FOREACH ( QgsLayerTreeNode *child, node->children() )

tests/src/python/test_qgslayertreemapcanvasbridge.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ def testLayerOrderUpdatedThroughBridge(self):
4848
"layer2", "memory")
4949
layer3 = QgsVectorLayer("Point?field=fldtxt:string",
5050
"layer3", "memory")
51+
5152
prj.addMapLayers([layer, layer2, layer3])
5253

5354
canvas = QgsMapCanvas()
@@ -131,6 +132,41 @@ def testCustomLayerOrderUpdatedFromProject(self):
131132
self.assertEqual([l for l in prj.layerTreeRoot().layerOrder()], [layer2, layer, layer3])
132133
self.assertFalse(prj.layerTreeRoot().hasCustomLayerOrder())
133134

135+
def testNonSpatialLayer(self):
136+
""" test that non spatial layers are not passed to canvas """
137+
138+
prj = QgsProject.instance()
139+
prj.clear()
140+
layer = QgsVectorLayer("Point?field=fldtxt:string",
141+
"layer1", "memory")
142+
layer2 = QgsVectorLayer("Point?field=fldtxt:string",
143+
"layer2", "memory")
144+
layer3 = QgsVectorLayer("Point?field=fldtxt:string",
145+
"layer3", "memory")
146+
non_spatial = QgsVectorLayer("None?field=fldtxt:string",
147+
"non_spatial", "memory")
148+
149+
prj.addMapLayers([layer, layer2, layer3, non_spatial])
150+
151+
canvas = QgsMapCanvas()
152+
bridge = QgsLayerTreeMapCanvasBridge(prj.layerTreeRoot(), canvas)
153+
154+
#custom layer order
155+
prj.layerTreeRoot().setHasCustomLayerOrder(True)
156+
prj.layerTreeRoot().setCustomLayerOrder([layer3, layer, layer2])
157+
app.processEvents()
158+
self.assertEqual(canvas.mapSettings().layers(), [layer3, layer, layer2])
159+
160+
# with non-spatial (should not be possible through ui, but is through api)
161+
prj.layerTreeRoot().setCustomLayerOrder([layer3, layer, layer2, non_spatial])
162+
app.processEvents()
163+
#self.assertEqual(canvas.mapSettings().layers(),[layer3,layer,layer2])
164+
165+
# no custom layer order
166+
prj.layerTreeRoot().setHasCustomLayerOrder(False)
167+
app.processEvents()
168+
self.assertEqual(canvas.mapSettings().layers(), [layer, layer2, layer3])
169+
134170

135171
if __name__ == '__main__':
136172
unittest.main()

0 commit comments

Comments
 (0)