From 108442eeae16dfcdbdbe3e73a45e6128b7839fe8 Mon Sep 17 00:00:00 2001 From: Paolo Angelelli Date: Wed, 31 Jan 2018 14:30:51 +0100 Subject: Fix Map.zoomLevel not honoring user-set values MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Apparently m_userMinimumZoomLevel is set but not used when setting the zoom level. With this patch, the minimumZoomLevelChanged signal is still emitted when the "implicit" minimumZoomLevel of the map changes (the one derived from the map size), but only if no user minimum zoom level is explicitly set. Task-number: QTBUG-66107 Change-Id: Id7f87cbd237407b255deea90dad80eeadd2d2f0d Reviewed-by: Jan Arve Sæther --- .../declarativemaps/qdeclarativegeomap.cpp | 28 +++++++++++++++++++--- .../declarativemaps/qdeclarativegeomap_p.h | 2 ++ 2 files changed, 27 insertions(+), 3 deletions(-) (limited to 'src/location/declarativemaps') diff --git a/src/location/declarativemaps/qdeclarativegeomap.cpp b/src/location/declarativemaps/qdeclarativegeomap.cpp index be08c3a4..d7f93d14 100644 --- a/src/location/declarativemaps/qdeclarativegeomap.cpp +++ b/src/location/declarativemaps/qdeclarativegeomap.cpp @@ -790,8 +790,8 @@ QDeclarativeGeoServiceProvider *QDeclarativeGeoMap::plugin() const */ void QDeclarativeGeoMap::setMinimumZoomLevel(qreal minimumZoomLevel, bool userSet) { - if (minimumZoomLevel >= 0) { + qreal oldUserMinimumZoomLevel = m_userMinimumZoomLevel; if (userSet) m_userMinimumZoomLevel = minimumZoomLevel; qreal oldMinimumZoomLevel = this->minimumZoomLevel(); @@ -800,12 +800,15 @@ void QDeclarativeGeoMap::setMinimumZoomLevel(qreal minimumZoomLevel, bool userSe if (m_map) minimumZoomLevel = qMax(minimumZoomLevel, m_map->minimumZoom()); + // minimumZoomLevel is, at this point, the implicit minimum zoom level m_gestureArea->setMinimumZoomLevel(minimumZoomLevel); if (zoomLevel() < minimumZoomLevel && (m_gestureArea->enabled() || !m_cameraCapabilities.overzoomEnabled())) setZoomLevel(minimumZoomLevel); - if (oldMinimumZoomLevel != minimumZoomLevel) + if (qIsNaN(m_userMinimumZoomLevel) && oldMinimumZoomLevel != minimumZoomLevel) + emit minimumZoomLevelChanged(); + else if (userSet && oldUserMinimumZoomLevel != m_userMinimumZoomLevel) emit minimumZoomLevelChanged(); } } @@ -825,10 +828,29 @@ void QDeclarativeGeoMap::setMinimumZoomLevel(qreal minimumZoomLevel, bool userSe */ qreal QDeclarativeGeoMap::minimumZoomLevel() const +{ + if (!qIsNaN(m_userMinimumZoomLevel)) + return m_userMinimumZoomLevel; + else + return m_gestureArea->minimumZoomLevel(); +} + +/*! + \internal +*/ +qreal QDeclarativeGeoMap::implicitMinimumZoomLevel() const { return m_gestureArea->minimumZoomLevel(); } +/*! + \internal +*/ +qreal QDeclarativeGeoMap::effectiveMinimumZoomLevel() const +{ + return qMax(minimumZoomLevel(), implicitMinimumZoomLevel()); +} + /*! \internal Sets the gesture areas maximum zoom level. If the camera capabilities @@ -901,7 +923,7 @@ void QDeclarativeGeoMap::setZoomLevel(qreal zoomLevel, bool overzoom) bool centerHasChanged = false; if (m_initialized) { - m_cameraData.setZoomLevel(qBound(overzoom ? m_map->minimumZoom() : minimumZoomLevel(), + m_cameraData.setZoomLevel(qBound(overzoom ? m_map->minimumZoom() : effectiveMinimumZoomLevel(), zoomLevel, overzoom ? 30 : maximumZoomLevel())); m_maximumViewportLatitude = m_map->maximumCenterLatitudeAtZoom(m_cameraData); diff --git a/src/location/declarativemaps/qdeclarativegeomap_p.h b/src/location/declarativemaps/qdeclarativegeomap_p.h index f357d322..0c1ea6d9 100644 --- a/src/location/declarativemaps/qdeclarativegeomap_p.h +++ b/src/location/declarativemaps/qdeclarativegeomap_p.h @@ -116,6 +116,8 @@ public: void setMinimumZoomLevel(qreal minimumZoomLevel, bool userSet = true); qreal minimumZoomLevel() const; + qreal implicitMinimumZoomLevel() const; + qreal effectiveMinimumZoomLevel() const; void setMaximumZoomLevel(qreal maximumZoomLevel, bool userSet = true); qreal maximumZoomLevel() const; -- cgit v1.2.3