Skip to content

Commit

Permalink
When reading a project, fallback to default view extent if canvas
Browse files Browse the repository at this point in the history
extents are not set
  • Loading branch information
nyalldawson committed Oct 31, 2019
1 parent f602ed3 commit 8b7447a
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 1 deletion.
8 changes: 8 additions & 0 deletions src/gui/qgsmapcanvas.cpp
Expand Up @@ -74,6 +74,7 @@ email : sherman at mrcc.com
#include "qgsmimedatautils.h"
#include "qgscustomdrophandler.h"
#include "qgsreferencedgeometry.h"
#include "qgsprojectviewsettings.h"

/**
* \ingroup gui
Expand Down Expand Up @@ -2137,6 +2138,8 @@ void QgsMapCanvas::setSnappingUtils( QgsSnappingUtils *utils )

void QgsMapCanvas::readProject( const QDomDocument &doc )
{
QgsProject *project = qobject_cast< QgsProject * >( sender() );

QDomNodeList nodes = doc.elementsByTagName( QStringLiteral( "mapcanvas" ) );
if ( nodes.count() )
{
Expand Down Expand Up @@ -2191,6 +2194,11 @@ void QgsMapCanvas::readProject( const QDomDocument &doc )
else
{
QgsDebugMsg( QStringLiteral( "Couldn't read mapcanvas information from project" ) );
if ( !project->viewSettings()->defaultViewExtent().isNull() )
{
setReferencedExtent( project->viewSettings()->defaultViewExtent() );
clearExtentHistory(); // clear the extent history on project load
}
}
}

Expand Down
43 changes: 42 additions & 1 deletion tests/src/python/test_qgsprojectviewsettings.py
Expand Up @@ -12,11 +12,15 @@

import qgis # NOQA

from qgis.core import (QgsProjectViewSettings,
from qgis.core import (QgsProject,
QgsProjectViewSettings,
QgsReadWriteContext,
QgsReferencedRectangle,
QgsRectangle,
QgsCoordinateReferenceSystem)
from qgis.gui import QgsMapCanvas

from qgis.PyQt.QtCore import QTemporaryDir

from qgis.PyQt.QtTest import QSignalSpy
from qgis.PyQt.QtXml import QDomDocument, QDomElement
Expand Down Expand Up @@ -81,6 +85,43 @@ def testDefaultViewExtent(self):
p.reset()
self.assertTrue(p.defaultViewExtent().isNull())

def testDefaultViewExtentWithCanvas(self):
p = QgsProject()
p.setCrs(QgsCoordinateReferenceSystem('EPSG:3857'))

canvas = QgsMapCanvas()
canvas.setDestinationCrs(QgsCoordinateReferenceSystem(4326))
canvas.setFrameStyle(0)
canvas.resize(600, 400)
self.assertEqual(canvas.width(), 600)
self.assertEqual(canvas.height(), 400)
canvas.setExtent(QgsRectangle(10, 30, 20, 35))
canvas.show()

tmpDir = QTemporaryDir()
tmpFile = "{}/project.qgz".format(tmpDir.path())
self.assertTrue(p.write(tmpFile))

QgsProject.instance().read(tmpFile)

# no default view, extent should not change
self.assertAlmostEqual(canvas.extent().xMinimum(), 10, 3)
self.assertAlmostEqual(canvas.extent().yMinimum(), 29.16666, 3)
self.assertAlmostEqual(canvas.extent().xMaximum(), 20, 3)
self.assertAlmostEqual(canvas.extent().yMaximum(), 35.833333333, 3)
self.assertEqual(canvas.mapSettings().destinationCrs().authid(), 'EPSG:4326')

p.viewSettings().setDefaultViewExtent(QgsReferencedRectangle(QgsRectangle(1000, 2000, 1500, 2500), QgsCoordinateReferenceSystem('EPSG:3857')))

self.assertTrue(p.write(tmpFile))
QgsProject.instance().read(tmpFile)

self.assertAlmostEqual(canvas.extent().xMinimum(), 0.0078602, 3)
self.assertAlmostEqual(canvas.extent().yMinimum(), 0.017966, 3)
self.assertAlmostEqual(canvas.extent().xMaximum(), 0.01459762, 3)
self.assertAlmostEqual(canvas.extent().yMaximum(), 0.02245788, 3)
self.assertEqual(canvas.mapSettings().destinationCrs().authid(), 'EPSG:4326')

def testReadWrite(self):
p = QgsProjectViewSettings()
self.assertFalse(p.mapScales())
Expand Down

0 comments on commit 8b7447a

Please sign in to comment.