From 18f7e6dc9f59159b70cb7e6a8745738f42d4f46f Mon Sep 17 00:00:00 2001 From: Paolo Angelelli Date: Tue, 2 May 2017 16:04:13 +0200 Subject: Fix for MapGestureArea pinch and scroll wheel not honoring min zoom This patch fixes a regression introduced with e81ba34a98b259723e783e2d2df4321309992291, which made possible to zoom below the minimum valid zoom level for a viewport size. Change-Id: I4e71530b9bc5423ea24083146963c3bd0928f14a Reviewed-by: Alex Blasche --- src/location/declarativemaps/qdeclarativegeomap.cpp | 20 ++++++++++++++++++-- src/location/declarativemaps/qdeclarativegeomap_p.h | 2 ++ .../declarativemaps/qquickgeomapgesturearea.cpp | 5 +++-- 3 files changed, 23 insertions(+), 4 deletions(-) (limited to 'src/location/declarativemaps') diff --git a/src/location/declarativemaps/qdeclarativegeomap.cpp b/src/location/declarativemaps/qdeclarativegeomap.cpp index f196af04..4df884d5 100644 --- a/src/location/declarativemaps/qdeclarativegeomap.cpp +++ b/src/location/declarativemaps/qdeclarativegeomap.cpp @@ -941,6 +941,21 @@ qreal QDeclarativeGeoMap::maximumZoomLevel() const tiles are available, may be accepted, or clamped. */ void QDeclarativeGeoMap::setZoomLevel(qreal zoomLevel) +{ + return setZoomLevel(zoomLevel, m_cameraCapabilities.overzoomEnabled()); +} + +/*! + \internal + + Sets the zoom level. + Larger values for the zoom level provide more detail. Zoom levels + are always non-negative. The default value is 8.0. Values outside the + [minimumZoomLevel, maximumZoomLevel] range, which represent the range for which + tiles are available, can be accepted or clamped by setting the overzoom argument + to true or false respectively. +*/ +void QDeclarativeGeoMap::setZoomLevel(qreal zoomLevel, bool overzoom) { if (m_cameraData.zoomLevel() == zoomLevel || zoomLevel < 0) return; @@ -949,8 +964,9 @@ void QDeclarativeGeoMap::setZoomLevel(qreal zoomLevel) bool centerHasChanged = false; if (m_initialized) { - m_cameraData.setZoomLevel(qBound(m_cameraCapabilities.overzoomEnabled() ? 0 : minimumZoomLevel(), zoomLevel, - m_cameraCapabilities.overzoomEnabled() ? 30 : maximumZoomLevel())); + m_cameraData.setZoomLevel(qBound(overzoom ? m_map->minimumZoom() : minimumZoomLevel(), + zoomLevel, + overzoom ? 30 : maximumZoomLevel())); m_maximumViewportLatitude = m_map->maximumCenterLatitudeAtZoom(m_cameraData); QGeoCoordinate coord = m_cameraData.center(); coord.setLatitude(qBound(-m_maximumViewportLatitude, coord.latitude(), m_maximumViewportLatitude)); diff --git a/src/location/declarativemaps/qdeclarativegeomap_p.h b/src/location/declarativemaps/qdeclarativegeomap_p.h index c63bb571..f07a2e7f 100644 --- a/src/location/declarativemaps/qdeclarativegeomap_p.h +++ b/src/location/declarativemaps/qdeclarativegeomap_p.h @@ -228,6 +228,8 @@ protected: void setError(QGeoServiceProvider::Error error, const QString &errorString); void initialize(); + void setZoomLevel(qreal zoomLevel, bool overzoom); + private Q_SLOTS: void mappingManagerInitialized(); void pluginReady(); diff --git a/src/location/declarativemaps/qquickgeomapgesturearea.cpp b/src/location/declarativemaps/qquickgeomapgesturearea.cpp index 13c667e6..a40afd68 100644 --- a/src/location/declarativemaps/qquickgeomapgesturearea.cpp +++ b/src/location/declarativemaps/qquickgeomapgesturearea.cpp @@ -953,7 +953,8 @@ void QQuickGeoMapGestureArea::handleWheelEvent(QWheelEvent *event) const double zoomLevelDelta = event->angleDelta().y() * qreal(0.001); // Gesture area should always honor maxZL, but Map might not. - m_declarativeMap->setZoomLevel(qMin(m_declarativeMap->zoomLevel() + zoomLevelDelta, maximumZoomLevel())); + m_declarativeMap->setZoomLevel(qMin(m_declarativeMap->zoomLevel() + zoomLevelDelta, maximumZoomLevel()), + false); const QPointF &postZoomPoint = m_map->geoProjection().coordinateToItemPosition(wheelGeoPos, false).toPointF(); if (preZoomPoint != postZoomPoint) // need to re-anchor the wheel geoPos to the event position @@ -1595,7 +1596,7 @@ void QQuickGeoMapGestureArea::updatePinch() qreal perPinchMinimumZoomLevel = qMax(m_pinch.m_zoom.m_start - m_pinch.m_zoom.maximumChange, m_pinch.m_zoom.m_minimum); qreal perPinchMaximumZoomLevel = qMin(m_pinch.m_zoom.m_start + m_pinch.m_zoom.maximumChange, m_pinch.m_zoom.m_maximum); newZoomLevel = qMin(qMax(perPinchMinimumZoomLevel, newZoomLevel), perPinchMaximumZoomLevel); - m_declarativeMap->setZoomLevel(qMin(newZoomLevel, maximumZoomLevel())); + m_declarativeMap->setZoomLevel(qMin(newZoomLevel, maximumZoomLevel()), false); m_pinch.m_zoom.m_previous = newZoomLevel; } } -- cgit v1.2.3