diff --git a/doc/api_break.dox b/doc/api_break.dox index 4125b1db685..2fcadbf4759 100644 --- a/doc/api_break.dox +++ b/doc/api_break.dox @@ -1261,6 +1261,7 @@ QgsLayerTreeMapCanvasBridge {#qgis_api_break_3_0_QgsLayerTreeMapCanvasBri ----------------- - setAutoEnableCrsTransform() and autoEnableCrsTransform() were removed. CRS transformation is now always enabled. +- setCanvasLayers() now requires a third map layer list argument for storage of all layers in the layer tree order. QgsLayerTreeModel {#qgis_api_break_3_0_QgsLayerTreeMode} diff --git a/python/gui/layertree/qgslayertreemapcanvasbridge.sip b/python/gui/layertree/qgslayertreemapcanvasbridge.sip index 3bda7314001..c0e95ec5b85 100644 --- a/python/gui/layertree/qgslayertreemapcanvasbridge.sip +++ b/python/gui/layertree/qgslayertreemapcanvasbridge.sip @@ -64,8 +64,8 @@ class QgsLayerTreeMapCanvasBridge : QObject void defaultLayerOrder( QgsLayerTreeNode* node, QStringList& order ) const; - //! Fill canvasLayers and overviewLayers lists from node and its descendants - void setCanvasLayers( QgsLayerTreeNode* node, QList &canvasLayers, QList& overviewLayers ); + void setCanvasLayers( QgsLayerTreeNode *node, QList &canvasLayers, QList &overviewLayers, + QList &allLayers ); void deferredSetCanvasLayers(); diff --git a/src/gui/layertree/qgslayertreemapcanvasbridge.cpp b/src/gui/layertree/qgslayertreemapcanvasbridge.cpp index 57a26bb42ea..ad22efce5f6 100644 --- a/src/gui/layertree/qgslayertreemapcanvasbridge.cpp +++ b/src/gui/layertree/qgslayertreemapcanvasbridge.cpp @@ -117,7 +117,7 @@ void QgsLayerTreeMapCanvasBridge::setCustomLayerOrder( const QStringList &order void QgsLayerTreeMapCanvasBridge::setCanvasLayers() { - QList canvasLayers, overviewLayers; + QList canvasLayers, overviewLayers, allLayerOrder; if ( mHasCustomLayerOrder ) { @@ -126,6 +126,7 @@ void QgsLayerTreeMapCanvasBridge::setCanvasLayers() QgsLayerTreeLayer *nodeLayer = mRoot->findLayer( layerId ); if ( nodeLayer ) { + allLayerOrder << nodeLayer->layer(); if ( nodeLayer->isVisible() ) canvasLayers << nodeLayer->layer(); if ( nodeLayer->customProperty( QStringLiteral( "overview" ), 0 ).toInt() ) @@ -134,13 +135,13 @@ void QgsLayerTreeMapCanvasBridge::setCanvasLayers() } } else - setCanvasLayers( mRoot, canvasLayers, overviewLayers ); + setCanvasLayers( mRoot, canvasLayers, overviewLayers, allLayerOrder ); QList layerNodes = mRoot->findLayers(); int currentLayerCount = layerNodes.count(); bool firstLayers = mAutoSetupOnFirstLayer && mLastLayerCount == 0 && currentLayerCount != 0; - QgsProject::instance()->setLayerOrder( canvasLayers ); + QgsProject::instance()->setLayerOrder( allLayerOrder ); mCanvas->setLayers( canvasLayers ); if ( mOverviewCanvas ) mOverviewCanvas->setLayers( overviewLayers ); @@ -229,11 +230,12 @@ void QgsLayerTreeMapCanvasBridge::writeProject( QDomDocument &doc ) doc.documentElement().appendChild( elem ); } -void QgsLayerTreeMapCanvasBridge::setCanvasLayers( QgsLayerTreeNode *node, QList &canvasLayers, QList &overviewLayers ) +void QgsLayerTreeMapCanvasBridge::setCanvasLayers( QgsLayerTreeNode *node, QList &canvasLayers, QList &overviewLayers, QList &allLayers ) { if ( QgsLayerTree::isLayer( node ) ) { QgsLayerTreeLayer *nodeLayer = QgsLayerTree::toLayer( node ); + allLayers << nodeLayer->layer(); if ( nodeLayer->isVisible() ) canvasLayers << nodeLayer->layer(); if ( nodeLayer->customProperty( QStringLiteral( "overview" ), 0 ).toInt() ) @@ -241,7 +243,7 @@ void QgsLayerTreeMapCanvasBridge::setCanvasLayers( QgsLayerTreeNode *node, QList } Q_FOREACH ( QgsLayerTreeNode *child, node->children() ) - setCanvasLayers( child, canvasLayers, overviewLayers ); + setCanvasLayers( child, canvasLayers, overviewLayers, allLayers ); } void QgsLayerTreeMapCanvasBridge::deferredSetCanvasLayers() diff --git a/src/gui/layertree/qgslayertreemapcanvasbridge.h b/src/gui/layertree/qgslayertreemapcanvasbridge.h index ec36e1287bd..ebb2c0078a0 100644 --- a/src/gui/layertree/qgslayertreemapcanvasbridge.h +++ b/src/gui/layertree/qgslayertreemapcanvasbridge.h @@ -99,7 +99,8 @@ class GUI_EXPORT QgsLayerTreeMapCanvasBridge : public QObject void defaultLayerOrder( QgsLayerTreeNode *node, QStringList &order ) const; //! Fill canvasLayers and overviewLayers lists from node and its descendants - void setCanvasLayers( QgsLayerTreeNode *node, QList &canvasLayers, QList &overviewLayers ); + void setCanvasLayers( QgsLayerTreeNode *node, QList &canvasLayers, QList &overviewLayers, + QList &allLayers ); void deferredSetCanvasLayers(); diff --git a/tests/src/python/test_qgsmapthemecollection.py b/tests/src/python/test_qgsmapthemecollection.py index 37360655291..a657f1e05d4 100644 --- a/tests/src/python/test_qgsmapthemecollection.py +++ b/tests/src/python/test_qgsmapthemecollection.py @@ -17,6 +17,8 @@ import qgis # NOQA from qgis.core import (QgsMapThemeCollection, QgsProject, QgsVectorLayer) +from qgis.gui import (QgsLayerTreeMapCanvasBridge, + QgsMapCanvas) from qgis.testing import start_app, unittest from qgis.PyQt.QtTest import QSignalSpy @@ -99,7 +101,7 @@ class TestQgsMapThemeCollection(unittest.TestCase): def testMasterLayerOrder(self): """ test master layer order""" - prj = QgsProject() + prj = QgsProject.instance() layer = QgsVectorLayer("Point?field=fldtxt:string", "layer1", "memory") layer2 = QgsVectorLayer("Point?field=fldtxt:string", @@ -149,6 +151,23 @@ class TestQgsMapThemeCollection(unittest.TestCase): self.assertEqual(prj.mapThemeCollection().mapThemeVisibleLayerIds('theme2'), [layer2.id(), layer3.id(), layer.id()]) self.assertEqual(prj.mapThemeCollection().mapThemeVisibleLayerIds('theme3'), [layer2.id(), layer.id()]) + # check that layers include those hidden in the layer tree + canvas = QgsMapCanvas() + bridge = QgsLayerTreeMapCanvasBridge(prj.layerTreeRoot(), canvas) + root = prj.layerTreeRoot() + layer_node = root.findLayer(layer2.id()) + layer_node.setItemVisibilityChecked(False) + app.processEvents() + self.assertEqual(prj.mapThemeCollection().masterLayerOrder(), [layer, layer2, layer3]) + + self.assertEqual(prj.mapThemeCollection().mapThemeVisibleLayers('theme1'), [layer, layer3]) + self.assertEqual(prj.mapThemeCollection().mapThemeVisibleLayers('theme2'), [layer, layer2, layer3]) + self.assertEqual(prj.mapThemeCollection().mapThemeVisibleLayers('theme3'), [layer, layer2]) + self.assertEqual(prj.mapThemeCollection().mapThemeVisibleLayerIds('theme1'), [layer.id(), layer3.id()]) + self.assertEqual(prj.mapThemeCollection().mapThemeVisibleLayerIds('theme2'), + [layer.id(), layer2.id(), layer3.id()]) + self.assertEqual(prj.mapThemeCollection().mapThemeVisibleLayerIds('theme3'), [layer.id(), layer2.id()]) + if __name__ == '__main__': unittest.main() diff --git a/tests/src/python/test_qgsproject.py b/tests/src/python/test_qgsproject.py index 1bde94b514b..17a486ab2d0 100644 --- a/tests/src/python/test_qgsproject.py +++ b/tests/src/python/test_qgsproject.py @@ -262,6 +262,12 @@ class TestQgsProject(unittest.TestCase): # make sure project respects this self.assertEqual([l.id() for l in prj.layerOrder()], [layer2.id(), layer.id(), layer3.id()]) + # make sure project order includes ALL layers, not just visible ones + layer_node = root.findLayer(layer.id()) + layer_node.setItemVisibilityChecked(False) + app.processEvents() + self.assertEqual([l.id() for l in prj.layerOrder()], [layer2.id(), layer.id(), layer3.id()]) + if __name__ == '__main__': unittest.main()