From 5db24601689d5c3827a8b12c50c2cbfdf53f48da Mon Sep 17 00:00:00 2001 From: "Lubomir I. Ivanov" Date: Mon, 7 Aug 2017 02:18:09 +0300 Subject: [PATCH] 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 --- mobile-widgets/qml/MapWidget.qml | 45 ++++++++++++++++++++++++++++++-- 1 file 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() {