Skip to content

Commit ee969df

Browse files
committed
Correctly handle reading/writing multiple canvas to project
1 parent cb43ec3 commit ee969df

File tree

2 files changed

+52
-3
lines changed

2 files changed

+52
-3
lines changed

src/gui/qgsmapcanvas.cpp

+16
Original file line numberDiff line numberDiff line change
@@ -1857,6 +1857,21 @@ void QgsMapCanvas::readProject( const QDomDocument &doc )
18571857
{
18581858
QDomNode node = nodes.item( 0 );
18591859

1860+
// Search the specific MapCanvas node using the name
1861+
if ( nodes.count() > 1 )
1862+
{
1863+
for ( int i = 0; i < nodes.size(); ++i )
1864+
{
1865+
QDomElement elementNode = nodes.at( i ).toElement();
1866+
1867+
if ( elementNode.hasAttribute( "name" ) && elementNode.attribute( "name" ) == objectName() )
1868+
{
1869+
node = nodes.at( i );
1870+
break;
1871+
}
1872+
}
1873+
}
1874+
18601875
QgsMapSettings tmpSettings;
18611876
tmpSettings.readXml( node );
18621877
setDestinationCrs( tmpSettings.destinationCrs() );
@@ -1886,6 +1901,7 @@ void QgsMapCanvas::writeProject( QDomDocument &doc )
18861901
QDomNode qgisNode = nl.item( 0 ); // there should only be one, so zeroth element ok
18871902

18881903
QDomElement mapcanvasNode = doc.createElement( QStringLiteral( "mapcanvas" ) );
1904+
mapcanvasNode.setAttribute( "name", objectName() );
18891905
qgisNode.appendChild( mapcanvasNode );
18901906

18911907
mSettings.writeXml( mapcanvasNode, doc );

tests/src/python/test_qgsmapcanvas.py

+36-3
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414

1515
import qgis # NOQA
1616

17-
from qgis.core import (QgsCoordinateReferenceSystem,
17+
from qgis.core import (QgsMapSettings,
18+
QgsCoordinateReferenceSystem,
1819
QgsRectangle,
1920
QgsVectorLayer,
2021
QgsFeature,
@@ -23,10 +24,13 @@
2324
QgsFillSymbol,
2425
QgsSingleSymbolRenderer,
2526
QgsMapThemeCollection,
26-
QgsProject)
27+
QgsProject,
28+
QgsApplication)
2729
from qgis.gui import (QgsMapCanvas)
2830

29-
from qgis.PyQt.QtCore import QDir
31+
from qgis.PyQt.QtCore import (Qt,
32+
QDir)
33+
from qgis.PyQt.QtXml import (QDomDocument, QDomElement)
3034
import time
3135
from qgis.testing import start_app, unittest
3236

@@ -337,6 +341,35 @@ def canvasImageCheck(self, name, reference_image, canvas):
337341
print((self.report))
338342
return result
339343

344+
def testSaveMultipleCanvasesToProject(self):
345+
# test saving/restoring canvas state to project with multiple canvases
346+
c1 = QgsMapCanvas()
347+
c1.setObjectName('c1')
348+
c1.setDestinationCrs(QgsCoordinateReferenceSystem('EPSG:3111'))
349+
c1.setRotation(45)
350+
c2 = QgsMapCanvas()
351+
c2.setObjectName('c2')
352+
c2.setDestinationCrs(QgsCoordinateReferenceSystem('EPSG:4326'))
353+
c2.setRotation(65)
354+
355+
doc = QDomDocument("testdoc")
356+
elem = doc.createElement("qgis")
357+
doc.appendChild(elem)
358+
c1.writeProject(doc)
359+
c2.writeProject(doc)
360+
361+
c3 = QgsMapCanvas()
362+
c3.setObjectName('c1')
363+
c4 = QgsMapCanvas()
364+
c4.setObjectName('c2')
365+
c3.readProject(doc)
366+
c4.readProject(doc)
367+
368+
self.assertEqual(c3.mapSettings().destinationCrs().authid(), 'EPSG:3111')
369+
self.assertEqual(c3.rotation(), 45)
370+
self.assertEqual(c4.mapSettings().destinationCrs().authid(), 'EPSG:4326')
371+
self.assertEqual(c4.rotation(), 65)
372+
340373

341374
if __name__ == '__main__':
342375
unittest.main()

0 commit comments

Comments
 (0)