Skip to content

Commit 5a3d397

Browse files
committed
Fix duplicate layers in custom layer order panel
Fixes #21955
1 parent 24510cb commit 5a3d397

File tree

2 files changed

+35
-1
lines changed

2 files changed

+35
-1
lines changed

src/core/layertree/qgslayertree.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,18 @@ void QgsLayerTree::nodeRemovedChildren()
209209
++layer;
210210
}
211211

212+
// we need to ensure that the customLayerOrderChanged signal is ALWAYS raised
213+
// here, since that order HAS changed due to removal of the child!
214+
// setCustomLayerOrder will only emit this signal when the layers list
215+
// at this stage is different to the stored customer layer order. If this
216+
// isn't the case (i.e. the lists ARE the same) then manually emit the
217+
// signal
218+
const bool emitSignal = _qgis_listRawToQPointer( layers ) == mCustomLayerOrder;
219+
212220
setCustomLayerOrder( layers );
221+
if ( emitSignal )
222+
emit customLayerOrderChanged();
223+
213224
emit layerOrderChanged();
214225
}
215226

tests/src/python/test_qgslayertree.py

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
from qgis.core import (
2020
QgsLayerTree,
2121
QgsProject,
22-
QgsVectorLayer
22+
QgsVectorLayer,
23+
QgsLayerTreeLayer
2324
)
2425
from qgis.testing import start_app, unittest
2526
from utilities import (unitTestDataPath)
@@ -78,6 +79,28 @@ def testCustomLayerOrder(self):
7879
prj.clear()
7980
self.assertEqual(prj.layerTreeRoot().customLayerOrder(), [])
8081

82+
def testCustomLayerOrderChanged(self):
83+
layer = QgsVectorLayer("Point?field=fldtxt:string",
84+
"layer1", "memory")
85+
layer2 = QgsVectorLayer("Point?field=fldtxt:string",
86+
"layer2", "memory")
87+
88+
layer_tree = QgsLayerTree()
89+
layer_order_changed_spy = QSignalSpy(layer_tree.customLayerOrderChanged)
90+
layer1_node = QgsLayerTreeLayer(layer)
91+
layer_tree.addChildNode(layer1_node)
92+
self.assertEqual(len(layer_order_changed_spy), 1)
93+
layer2_node = QgsLayerTreeLayer(layer2)
94+
layer_tree.addChildNode(layer2_node)
95+
self.assertEqual(len(layer_order_changed_spy), 2)
96+
97+
# simulate a layer move in the tree
98+
layer3_node = QgsLayerTreeLayer(layer)
99+
layer_tree.addChildNode(layer3_node)
100+
self.assertEqual(len(layer_order_changed_spy), 3)
101+
layer_tree.removeChildNode(layer1_node)
102+
self.assertEqual(len(layer_order_changed_spy), 4)
103+
81104

82105
if __name__ == '__main__':
83106
unittest.main()

0 commit comments

Comments
 (0)