Skip to content

Commit 98eda35

Browse files
committedMar 13, 2017
Auto-set GUI for custom layer order when API call to QgsProject::setLayerOrder
is made
1 parent 2c3c1f7 commit 98eda35

File tree

4 files changed

+115
-0
lines changed

4 files changed

+115
-0
lines changed
 

‎src/gui/layertree/qgslayertreemapcanvasbridge.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ QgsLayerTreeMapCanvasBridge::QgsLayerTreeMapCanvasBridge( QgsLayerTreeGroup *roo
3737
connect( root, &QgsLayerTreeGroup::customPropertyChanged, this, &QgsLayerTreeMapCanvasBridge::nodeCustomPropertyChanged );
3838
connect( root, &QgsLayerTreeGroup::removedChildren, this, &QgsLayerTreeMapCanvasBridge::nodeRemovedChildren );
3939
connect( root, &QgsLayerTreeNode::visibilityChanged, this, &QgsLayerTreeMapCanvasBridge::nodeVisibilityChanged );
40+
connect( QgsProject::instance(), &QgsProject::layerOrderChanged, this, &QgsLayerTreeMapCanvasBridge::projectLayerOrderChanged );
4041

4142
setCanvasLayers();
4243
}
@@ -141,7 +142,9 @@ void QgsLayerTreeMapCanvasBridge::setCanvasLayers()
141142
int currentLayerCount = layerNodes.count();
142143
bool firstLayers = mAutoSetupOnFirstLayer && mLastLayerCount == 0 && currentLayerCount != 0;
143144

145+
mUpdatingProjectLayerOrder = true;
144146
QgsProject::instance()->setLayerOrder( allLayerOrder );
147+
mUpdatingProjectLayerOrder = false;
145148
mCanvas->setLayers( canvasLayers );
146149
if ( mOverviewCanvas )
147150
mOverviewCanvas->setLayers( overviewLayers );
@@ -318,3 +321,18 @@ void QgsLayerTreeMapCanvasBridge::nodeCustomPropertyChanged( QgsLayerTreeNode *n
318321
deferredSetCanvasLayers();
319322
}
320323

324+
void QgsLayerTreeMapCanvasBridge::projectLayerOrderChanged()
325+
{
326+
if ( mUpdatingProjectLayerOrder )
327+
return;
328+
329+
setHasCustomLayerOrder( true );
330+
QStringList ids;
331+
Q_FOREACH( QgsMapLayer* layer, QgsProject::instance()->layerOrder() )
332+
{
333+
if ( layer )
334+
ids << layer->id();
335+
}
336+
setCustomLayerOrder( ids );
337+
}
338+

‎src/gui/layertree/qgslayertreemapcanvasbridge.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,10 @@ class GUI_EXPORT QgsLayerTreeMapCanvasBridge : public QObject
110110
void nodeVisibilityChanged();
111111
void nodeCustomPropertyChanged( QgsLayerTreeNode *node, const QString &key );
112112

113+
private slots:
114+
115+
void projectLayerOrderChanged();
116+
113117
protected:
114118
QgsLayerTreeGroup *mRoot = nullptr;
115119
QgsMapCanvas *mCanvas = nullptr;
@@ -124,6 +128,8 @@ class GUI_EXPORT QgsLayerTreeMapCanvasBridge : public QObject
124128

125129
bool mHasFirstLayer;
126130
bool mLastLayerCount;
131+
bool mUpdatingProjectLayerOrder = false;
132+
127133
QgsCoordinateReferenceSystem mFirstCRS;
128134
};
129135

‎tests/src/python/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ ADD_PYTHON_TEST(PyQgsGeometryValidator test_qgsgeometryvalidator.py)
6363
ADD_PYTHON_TEST(PyQgsGraduatedSymbolRenderer test_qgsgraduatedsymbolrenderer.py)
6464
ADD_PYTHON_TEST(PyQgsInterval test_qgsinterval.py)
6565
ADD_PYTHON_TEST(PyQgsJSONUtils test_qgsjsonutils.py)
66+
ADD_PYTHON_TEST(PyQgsLayerTreeMapCanvasBridge test_qgslayertreemapcanvasbridge.py)
6667
ADD_PYTHON_TEST(PyQgsLineSymbolLayers test_qgslinesymbollayers.py)
6768
ADD_PYTHON_TEST(PyQgsMapCanvas test_qgsmapcanvas.py)
6869
ADD_PYTHON_TEST(PyQgsMapCanvasAnnotationItem test_qgsmapcanvasannotationitem.py)
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
# -*- coding: utf-8 -*-
2+
"""QGIS Unit tests for QgsLayerTreeMapCanvasBridge.
3+
4+
.. note:: This program is free software; you can redistribute it and/or modify
5+
it under the terms of the GNU General Public License as published by
6+
the Free Software Foundation; either version 2 of the License, or
7+
(at your option) any later version.
8+
"""
9+
__author__ = 'Nyall Dawson'
10+
__date__ = '8/03/2017'
11+
__copyright__ = 'Copyright 2017, The QGIS Project'
12+
# This will get replaced with a git SHA1 when you do a git archive
13+
__revision__ = '$Format:%H$'
14+
15+
import os
16+
17+
import qgis # NOQA
18+
19+
from qgis.core import (QgsProject,
20+
QgsApplication,
21+
QgsUnitTypes,
22+
QgsCoordinateReferenceSystem,
23+
QgsVectorLayer)
24+
from qgis.gui import (QgsLayerTreeMapCanvasBridge,
25+
QgsMapCanvas,
26+
QgsCustomLayerOrderWidget)
27+
from qgis.testing import start_app, unittest
28+
from utilities import (unitTestDataPath)
29+
30+
app = start_app()
31+
TEST_DATA_DIR = unitTestDataPath()
32+
33+
34+
class TestQgsLayerTreeMapCanvasBridge(unittest.TestCase):
35+
36+
def __init__(self, methodName):
37+
"""Run once on class initialization."""
38+
unittest.TestCase.__init__(self, methodName)
39+
40+
def testCustomLayerOrderUpdatedFromProject(self):
41+
""" test that setting project layer order is reflected in custom layer order panel """
42+
43+
prj = QgsProject.instance()
44+
layer = QgsVectorLayer("Point?field=fldtxt:string",
45+
"layer1", "memory")
46+
layer2 = QgsVectorLayer("Point?field=fldtxt:string",
47+
"layer2", "memory")
48+
layer3 = QgsVectorLayer("Point?field=fldtxt:string",
49+
"layer3", "memory")
50+
prj.addMapLayers([layer, layer2, layer3])
51+
52+
canvas = QgsMapCanvas()
53+
bridge = QgsLayerTreeMapCanvasBridge(prj.layerTreeRoot(), canvas)
54+
custom_order_widget = QgsCustomLayerOrderWidget(bridge)
55+
56+
#custom layer order
57+
bridge.setHasCustomLayerOrder(True)
58+
bridge.setCustomLayerOrder([layer3.id(), layer.id(), layer2.id()])
59+
app.processEvents()
60+
self.assertEqual([l.id() for l in prj.layerOrder()], [layer3.id(), layer.id(), layer2.id()])
61+
62+
# no custom layer order
63+
bridge.setHasCustomLayerOrder(False)
64+
app.processEvents()
65+
self.assertEqual([l.id() for l in prj.layerOrder()], [layer.id(), layer2.id(), layer3.id()])
66+
67+
# mess around with the project layer order
68+
prj.setLayerOrder([layer3, layer, layer2])
69+
app.processEvents()
70+
# make sure bridge respects this new order
71+
self.assertTrue(bridge.hasCustomLayerOrder())
72+
self.assertEqual(bridge.customLayerOrder(), [layer3.id(), layer.id(), layer2.id()])
73+
74+
# try reordering through bridge
75+
bridge.setHasCustomLayerOrder(False)
76+
app.processEvents()
77+
self.assertEqual([l.id() for l in prj.layerOrder()], [layer.id(), layer2.id(), layer3.id()])
78+
root = prj.layerTreeRoot()
79+
layer_node = root.findLayer(layer2.id())
80+
cloned_node = layer_node.clone()
81+
parent = layer_node.parent()
82+
parent.insertChildNode(0, cloned_node)
83+
parent.removeChildNode(layer_node)
84+
app.processEvents()
85+
# make sure project respects this
86+
self.assertEqual([l.id() for l in prj.layerOrder()], [layer2.id(), layer.id(), layer3.id()])
87+
self.assertFalse(bridge.hasCustomLayerOrder())
88+
89+
if __name__ == '__main__':
90+
unittest.main()

0 commit comments

Comments
 (0)
Please sign in to comment.