diff options
author | Lubomir I. Ivanov <neolit123@gmail.com> | 2017-08-07 02:18:09 +0300 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2017-08-07 00:51:21 -0700 |
commit | 5db24601689d5c3827a8b12c50c2cbfdf53f48da (patch) | |
tree | 1863d0815e954a7b584b31e0bccbe4b1b4dce3cf | |
parent | 0fc9a3bf4ae532f5a9afd6d3fd8731eb16745671 (diff) | |
download | subsurface-5db24601689d5c3827a8b12c50c2cbfdf53f48da.tar.gz |
mapwidget.qml: implement centerOnRectangle()
First, this function calculates the zoom out effect until both the
current Map center and the target rectangle are visible - see the
"calculate zoom out" part.
Then it calculates a zoom level, so that the target rectangle
fits the viewport, but also so that the zoom is not too much (clamped).
see the "calculate zoom in" part.
NOTE: "centerStored" (the variable used to store the current map center)
is created using QtPositioning.coordinate(), because the code needs a new
object and not a reference of the map.center QGeoCoordinate object.
Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
-rw-r--r-- | mobile-widgets/qml/MapWidget.qml | 45 |
1 files changed, 43 insertions, 2 deletions
diff --git a/mobile-widgets/qml/MapWidget.qml b/mobile-widgets/qml/MapWidget.qml index cdfa25d79..7c0f9a691 100644 --- a/mobile-widgets/qml/MapWidget.qml +++ b/mobile-widgets/qml/MapWidget.qml @@ -181,8 +181,49 @@ Item { mapAnimationZoomOut.stop() } - function centerOnRectangle(topLeft, bottomRight, center) { - // TODO + function centerOnRectangle(topLeft, bottomRight, centerRect) { + stopZoomAnimations() + newCenter = centerRect + if (newCenter.latitude === 0.0 && newCenter.longitude === 0.0) { + newZoom = 2.6 + newZoomOut = newZoom + } else { + var centerStored = QtPositioning.coordinate(center.latitude, center.longitude) + var zoomStored = zoomLevel + var ptCenter + var ptTopLeft + var ptBottomRight + // calculate zoom out + newZoomOut = zoomLevel + while (zoomLevel > minimumZoomLevel) { + ptCenter = fromCoordinate(centerStored) + ptTopLeft = fromCoordinate(topLeft) + ptBottomRight = fromCoordinate(bottomRight) + if (pointIsVisible(ptCenter) && pointIsVisible(ptTopLeft) && pointIsVisible(ptBottomRight)) { + newZoomOut = zoomLevel + break + } + zoomLevel-- + } + // calculate zoom in + center = newCenter + zoomLevel = maximumZoomLevel + while (zoomLevel > minimumZoomLevel) { + ptTopLeft = fromCoordinate(topLeft) + ptBottomRight = fromCoordinate(bottomRight) + if (pointIsVisible(ptTopLeft) && pointIsVisible(ptBottomRight)) { + newZoom = zoomLevel + break + } + zoomLevel-- + } + if (newZoom > defaultZoomIn) + newZoom = defaultZoomIn + zoomLevel = zoomStored + center = centerStored + } + mapAnimationZoomIn.restart() + mapAnimationZoomOut.stop() } function deselectMapLocation() { |