Skip to content

Commit 222977f

Browse files
committed
Add unit tests for loading projects with custom layer order
Refs #18620
1 parent 1942854 commit 222977f

File tree

3 files changed

+715
-0
lines changed

3 files changed

+715
-0
lines changed

tests/src/python/test_qgsproject.py

+30
Original file line numberDiff line numberDiff line change
@@ -1003,6 +1003,36 @@ def testDirtyBlocker(self):
10031003
self.assertEqual(len(dirty_spy), 7)
10041004
self.assertEqual(dirty_spy[-1], [True])
10051005

1006+
def testCustomLayerOrderFrom2xProject(self):
1007+
prj = QgsProject.instance()
1008+
prj.read(os.path.join(TEST_DATA_DIR, 'layer_rendering_order_issue_qgis3.qgs'))
1009+
1010+
layer_x = prj.mapLayers()['x20180406151213536']
1011+
layer_y = prj.mapLayers()['y20180406151217017']
1012+
1013+
# check layer order
1014+
tree = prj.layerTreeRoot()
1015+
self.assertEqual(tree.children()[0].layer(), layer_x)
1016+
self.assertEqual(tree.children()[1].layer(), layer_y)
1017+
self.assertTrue(tree.hasCustomLayerOrder())
1018+
self.assertEqual(tree.customLayerOrder(), [layer_y, layer_x])
1019+
self.assertEqual(tree.layerOrder(), [layer_y, layer_x])
1020+
1021+
def testCustomLayerOrderFrom3xProject(self):
1022+
prj = QgsProject.instance()
1023+
prj.read(os.path.join(TEST_DATA_DIR, 'layer_rendering_order_qgis3_project.qgs'))
1024+
1025+
layer_x = prj.mapLayers()['x20180406151213536']
1026+
layer_y = prj.mapLayers()['y20180406151217017']
1027+
1028+
# check layer order
1029+
tree = prj.layerTreeRoot()
1030+
self.assertEqual(tree.children()[0].layer(), layer_x)
1031+
self.assertEqual(tree.children()[1].layer(), layer_y)
1032+
self.assertTrue(tree.hasCustomLayerOrder())
1033+
self.assertEqual(tree.customLayerOrder(), [layer_y, layer_x])
1034+
self.assertEqual(tree.layerOrder(), [layer_y, layer_x])
1035+
10061036

10071037
if __name__ == '__main__':
10081038
unittest.main()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,308 @@
1+
<!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'>
2+
<qgis projectname="" version="2.18.17">
3+
<title></title>
4+
<autotransaction active="0"/>
5+
<evaluateDefaultValues active="0"/>
6+
<layer-tree-group expanded="1" checked="Qt::Checked" name="">
7+
<customproperties/>
8+
<layer-tree-layer expanded="1" providerKey="memory" checked="Qt::Checked" id="x20180406151213536" source="point?crs=EPSG:4326&amp;memoryid={053397c2-059b-4308-ad76-5d8c309444fa}" name="x">
9+
<customproperties/>
10+
</layer-tree-layer>
11+
<layer-tree-layer expanded="1" providerKey="memory" checked="Qt::Checked" id="y20180406151217017" source="point?crs=EPSG:4326&amp;memoryid={2e6c36f3-69a2-41ef-83a8-21e2aec6cbfd}" name="y">
12+
<customproperties/>
13+
</layer-tree-layer>
14+
</layer-tree-group>
15+
<relations/>
16+
<mapcanvas>
17+
<units>degrees</units>
18+
<extent>
19+
<xmin>-1</xmin>
20+
<ymin>-1</ymin>
21+
<xmax>1</xmax>
22+
<ymax>1</ymax>
23+
</extent>
24+
<rotation>0</rotation>
25+
<projections>0</projections>
26+
<destinationsrs>
27+
<spatialrefsys>
28+
<proj4>+proj=longlat +datum=WGS84 +no_defs</proj4>
29+
<srsid>3452</srsid>
30+
<srid>4326</srid>
31+
<authid>EPSG:4326</authid>
32+
<description>WGS 84</description>
33+
<projectionacronym>longlat</projectionacronym>
34+
<ellipsoidacronym>WGS84</ellipsoidacronym>
35+
<geographicflag>true</geographicflag>
36+
</spatialrefsys>
37+
</destinationsrs>
38+
<rendermaptile>0</rendermaptile>
39+
<layer_coordinate_transform_info/>
40+
</mapcanvas>
41+
<layer-tree-canvas>
42+
<custom-order enabled="1">
43+
<item>y20180406151217017</item>
44+
<item>x20180406151213536</item>
45+
</custom-order>
46+
</layer-tree-canvas>
47+
<legend updateDrawingOrder="false">
48+
<legendlayer drawingOrder="1" open="true" checked="Qt::Checked" name="x" showFeatureCount="0">
49+
<filegroup open="true" hidden="false">
50+
<legendlayerfile isInOverview="0" layerid="x20180406151213536" visible="1"/>
51+
</filegroup>
52+
</legendlayer>
53+
<legendlayer drawingOrder="0" open="true" checked="Qt::Checked" name="y" showFeatureCount="0">
54+
<filegroup open="true" hidden="false">
55+
<legendlayerfile isInOverview="0" layerid="y20180406151217017" visible="1"/>
56+
</filegroup>
57+
</legendlayer>
58+
</legend>
59+
<projectlayers>
60+
<maplayer simplifyAlgorithm="0" minimumScale="0" maximumScale="1e+08" simplifyDrawingHints="1" minLabelScale="0" maxLabelScale="1e+08" simplifyDrawingTol="1" readOnly="0" geometry="Point" simplifyMaxScale="1" type="vector" hasScaleBasedVisibilityFlag="0" simplifyLocal="1" scaleBasedLabelVisibilityFlag="0">
61+
<id>x20180406151213536</id>
62+
<datasource>memory?geometry=Point&amp;crs=EPSG:4326</datasource>
63+
<keywordList>
64+
<value></value>
65+
</keywordList>
66+
<layername>x</layername>
67+
<srs>
68+
<spatialrefsys>
69+
<proj4>+proj=longlat +datum=WGS84 +no_defs</proj4>
70+
<srsid>3452</srsid>
71+
<srid>4326</srid>
72+
<authid>EPSG:4326</authid>
73+
<description>WGS 84</description>
74+
<projectionacronym>longlat</projectionacronym>
75+
<ellipsoidacronym>WGS84</ellipsoidacronym>
76+
<geographicflag>true</geographicflag>
77+
</spatialrefsys>
78+
</srs>
79+
<provider encoding="System">memory</provider>
80+
<vectorjoins/>
81+
<layerDependencies/>
82+
<expressionfields/>
83+
<map-layer-style-manager current="">
84+
<map-layer-style name=""/>
85+
</map-layer-style-manager>
86+
<edittypes/>
87+
<renderer-v2 forceraster="0" symbollevels="0" type="singleSymbol" enableorderby="0">
88+
<symbols>
89+
<symbol alpha="1" clip_to_extent="1" type="marker" name="0">
90+
<layer pass="0" class="SimpleMarker" locked="0">
91+
<prop k="angle" v="0"/>
92+
<prop k="color" v="81,139,114,255"/>
93+
<prop k="horizontal_anchor_point" v="1"/>
94+
<prop k="joinstyle" v="bevel"/>
95+
<prop k="name" v="circle"/>
96+
<prop k="offset" v="0,0"/>
97+
<prop k="offset_map_unit_scale" v="0,0,0,0,0,0"/>
98+
<prop k="offset_unit" v="MM"/>
99+
<prop k="outline_color" v="0,0,0,255"/>
100+
<prop k="outline_style" v="solid"/>
101+
<prop k="outline_width" v="0"/>
102+
<prop k="outline_width_map_unit_scale" v="0,0,0,0,0,0"/>
103+
<prop k="outline_width_unit" v="MM"/>
104+
<prop k="scale_method" v="diameter"/>
105+
<prop k="size" v="2"/>
106+
<prop k="size_map_unit_scale" v="0,0,0,0,0,0"/>
107+
<prop k="size_unit" v="MM"/>
108+
<prop k="vertical_anchor_point" v="1"/>
109+
</layer>
110+
</symbol>
111+
</symbols>
112+
<rotation/>
113+
<sizescale scalemethod="diameter"/>
114+
</renderer-v2>
115+
<labeling type="simple"/>
116+
<customproperties/>
117+
<blendMode>0</blendMode>
118+
<featureBlendMode>0</featureBlendMode>
119+
<layerTransparency>0</layerTransparency>
120+
<displayfield></displayfield>
121+
<label>0</label>
122+
<labelattributes>
123+
<label fieldname="" text="Label"/>
124+
<family fieldname="" name="Cantarell"/>
125+
<size fieldname="" units="pt" value="12"/>
126+
<bold fieldname="" on="0"/>
127+
<italic fieldname="" on="0"/>
128+
<underline fieldname="" on="0"/>
129+
<strikeout fieldname="" on="0"/>
130+
<color fieldname="" red="0" blue="0" green="0"/>
131+
<x fieldname=""/>
132+
<y fieldname=""/>
133+
<offset x="0" y="0" units="pt" yfieldname="" xfieldname=""/>
134+
<angle fieldname="" value="0" auto="0"/>
135+
<alignment fieldname="" value="center"/>
136+
<buffercolor fieldname="" red="255" blue="255" green="255"/>
137+
<buffersize fieldname="" units="pt" value="1"/>
138+
<bufferenabled fieldname="" on=""/>
139+
<multilineenabled fieldname="" on=""/>
140+
<selectedonly on=""/>
141+
</labelattributes>
142+
<annotationform></annotationform>
143+
<aliases/>
144+
<excludeAttributesWMS/>
145+
<excludeAttributesWFS/>
146+
<attributeactions default="-1"/>
147+
<attributetableconfig actionWidgetStyle="dropDown" sortExpression="" sortOrder="0">
148+
<columns/>
149+
</attributetableconfig>
150+
<editform></editform>
151+
<editforminit/>
152+
<editforminitcodesource>0</editforminitcodesource>
153+
<editforminitfilepath></editforminitfilepath>
154+
<editforminitcode><![CDATA[]]></editforminitcode>
155+
<featformsuppress>0</featformsuppress>
156+
<editorlayout>generatedlayout</editorlayout>
157+
<widgets/>
158+
<conditionalstyles>
159+
<rowstyles/>
160+
<fieldstyles/>
161+
</conditionalstyles>
162+
<defaults/>
163+
<previewExpression></previewExpression>
164+
</maplayer>
165+
<maplayer simplifyAlgorithm="0" minimumScale="0" maximumScale="1e+08" simplifyDrawingHints="1" minLabelScale="0" maxLabelScale="1e+08" simplifyDrawingTol="1" readOnly="0" geometry="Point" simplifyMaxScale="1" type="vector" hasScaleBasedVisibilityFlag="0" simplifyLocal="1" scaleBasedLabelVisibilityFlag="0">
166+
<id>y20180406151217017</id>
167+
<datasource>memory?geometry=Point&amp;crs=EPSG:4326</datasource>
168+
<keywordList>
169+
<value></value>
170+
</keywordList>
171+
<layername>y</layername>
172+
<srs>
173+
<spatialrefsys>
174+
<proj4>+proj=longlat +datum=WGS84 +no_defs</proj4>
175+
<srsid>3452</srsid>
176+
<srid>4326</srid>
177+
<authid>EPSG:4326</authid>
178+
<description>WGS 84</description>
179+
<projectionacronym>longlat</projectionacronym>
180+
<ellipsoidacronym>WGS84</ellipsoidacronym>
181+
<geographicflag>true</geographicflag>
182+
</spatialrefsys>
183+
</srs>
184+
<provider encoding="System">memory</provider>
185+
<vectorjoins/>
186+
<layerDependencies/>
187+
<expressionfields/>
188+
<map-layer-style-manager current="">
189+
<map-layer-style name=""/>
190+
</map-layer-style-manager>
191+
<edittypes/>
192+
<renderer-v2 forceraster="0" symbollevels="0" type="singleSymbol" enableorderby="0">
193+
<symbols>
194+
<symbol alpha="1" clip_to_extent="1" type="marker" name="0">
195+
<layer pass="0" class="SimpleMarker" locked="0">
196+
<prop k="angle" v="0"/>
197+
<prop k="color" v="118,57,172,255"/>
198+
<prop k="horizontal_anchor_point" v="1"/>
199+
<prop k="joinstyle" v="bevel"/>
200+
<prop k="name" v="circle"/>
201+
<prop k="offset" v="0,0"/>
202+
<prop k="offset_map_unit_scale" v="0,0,0,0,0,0"/>
203+
<prop k="offset_unit" v="MM"/>
204+
<prop k="outline_color" v="0,0,0,255"/>
205+
<prop k="outline_style" v="solid"/>
206+
<prop k="outline_width" v="0"/>
207+
<prop k="outline_width_map_unit_scale" v="0,0,0,0,0,0"/>
208+
<prop k="outline_width_unit" v="MM"/>
209+
<prop k="scale_method" v="diameter"/>
210+
<prop k="size" v="2"/>
211+
<prop k="size_map_unit_scale" v="0,0,0,0,0,0"/>
212+
<prop k="size_unit" v="MM"/>
213+
<prop k="vertical_anchor_point" v="1"/>
214+
</layer>
215+
</symbol>
216+
</symbols>
217+
<rotation/>
218+
<sizescale scalemethod="diameter"/>
219+
</renderer-v2>
220+
<labeling type="simple"/>
221+
<customproperties/>
222+
<blendMode>0</blendMode>
223+
<featureBlendMode>0</featureBlendMode>
224+
<layerTransparency>0</layerTransparency>
225+
<displayfield></displayfield>
226+
<label>0</label>
227+
<labelattributes>
228+
<label fieldname="" text="Label"/>
229+
<family fieldname="" name="Cantarell"/>
230+
<size fieldname="" units="pt" value="12"/>
231+
<bold fieldname="" on="0"/>
232+
<italic fieldname="" on="0"/>
233+
<underline fieldname="" on="0"/>
234+
<strikeout fieldname="" on="0"/>
235+
<color fieldname="" red="0" blue="0" green="0"/>
236+
<x fieldname=""/>
237+
<y fieldname=""/>
238+
<offset x="0" y="0" units="pt" yfieldname="" xfieldname=""/>
239+
<angle fieldname="" value="0" auto="0"/>
240+
<alignment fieldname="" value="center"/>
241+
<buffercolor fieldname="" red="255" blue="255" green="255"/>
242+
<buffersize fieldname="" units="pt" value="1"/>
243+
<bufferenabled fieldname="" on=""/>
244+
<multilineenabled fieldname="" on=""/>
245+
<selectedonly on=""/>
246+
</labelattributes>
247+
<annotationform></annotationform>
248+
<aliases/>
249+
<excludeAttributesWMS/>
250+
<excludeAttributesWFS/>
251+
<attributeactions default="-1"/>
252+
<attributetableconfig actionWidgetStyle="dropDown" sortExpression="" sortOrder="11337728">
253+
<columns/>
254+
</attributetableconfig>
255+
<editform></editform>
256+
<editforminit/>
257+
<editforminitcodesource>0</editforminitcodesource>
258+
<editforminitfilepath></editforminitfilepath>
259+
<editforminitcode><![CDATA[]]></editforminitcode>
260+
<featformsuppress>0</featformsuppress>
261+
<editorlayout>generatedlayout</editorlayout>
262+
<widgets/>
263+
<conditionalstyles>
264+
<rowstyles/>
265+
<fieldstyles/>
266+
</conditionalstyles>
267+
<defaults/>
268+
<previewExpression></previewExpression>
269+
</maplayer>
270+
</projectlayers>
271+
<properties>
272+
<Measurement>
273+
<DistanceUnits type="QString">meters</DistanceUnits>
274+
<AreaUnits type="QString">m2</AreaUnits>
275+
</Measurement>
276+
<SpatialRefSys>
277+
<ProjectCRSProj4String type="QString">+proj=longlat +datum=WGS84 +no_defs</ProjectCRSProj4String>
278+
<ProjectCrs type="QString">EPSG:4326</ProjectCrs>
279+
<ProjectCRSID type="int">3452</ProjectCRSID>
280+
</SpatialRefSys>
281+
<Paths>
282+
<Absolute type="bool">false</Absolute>
283+
</Paths>
284+
<Gui>
285+
<SelectionColorBluePart type="int">0</SelectionColorBluePart>
286+
<CanvasColorGreenPart type="int">255</CanvasColorGreenPart>
287+
<CanvasColorRedPart type="int">255</CanvasColorRedPart>
288+
<SelectionColorRedPart type="int">255</SelectionColorRedPart>
289+
<SelectionColorAlphaPart type="int">255</SelectionColorAlphaPart>
290+
<SelectionColorGreenPart type="int">255</SelectionColorGreenPart>
291+
<CanvasColorBluePart type="int">255</CanvasColorBluePart>
292+
</Gui>
293+
<Digitizing>
294+
<DefaultSnapToleranceUnit type="int">2</DefaultSnapToleranceUnit>
295+
<SnappingMode type="QString">current_layer</SnappingMode>
296+
<DefaultSnapType type="QString">off</DefaultSnapType>
297+
<DefaultSnapTolerance type="double">0</DefaultSnapTolerance>
298+
</Digitizing>
299+
<PositionPrecision>
300+
<DecimalPlaces type="int">2</DecimalPlaces>
301+
<Automatic type="bool">true</Automatic>
302+
</PositionPrecision>
303+
<Legend>
304+
<filterByMap type="bool">false</filterByMap>
305+
</Legend>
306+
</properties>
307+
<visibility-presets/>
308+
</qgis>

0 commit comments

Comments
 (0)