summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Angelelli <paolo.angelelli@qt.io>2018-01-31 14:30:51 +0100
committerPaolo Angelelli <paolo.angelelli@qt.io>2018-02-12 13:31:14 +0000
commit108442eeae16dfcdbdbe3e73a45e6128b7839fe8 (patch)
tree435914481665926150b48e5480033e5f1dbc2c9b
parent66ba05c88524023012efdb76d54d48f47411a5a4 (diff)
downloadqtlocation-108442eeae16dfcdbdbe3e73a45e6128b7839fe8.tar.gz
Fix Map.zoomLevel not honoring user-set values
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 <jan-arve.saether@qt.io>
-rw-r--r--src/location/declarativemaps/qdeclarativegeomap.cpp28
-rw-r--r--src/location/declarativemaps/qdeclarativegeomap_p.h2
2 files changed, 27 insertions, 3 deletions
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<qreal>(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();
}
}
@@ -826,11 +829,30 @@ 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<qreal>(minimumZoomLevel(), implicitMinimumZoomLevel());
+}
+
+/*!
+ \internal
Sets the gesture areas maximum zoom level. If the camera capabilities
has been set this method honors the boundaries set by it.
*/
@@ -901,7 +923,7 @@ void QDeclarativeGeoMap::setZoomLevel(qreal zoomLevel, bool overzoom)
bool centerHasChanged = false;
if (m_initialized) {
- m_cameraData.setZoomLevel(qBound<qreal>(overzoom ? m_map->minimumZoom() : minimumZoomLevel(),
+ m_cameraData.setZoomLevel(qBound<qreal>(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;