diff options
author | Lubomir I. Ivanov <neolit123@gmail.com> | 2018-04-02 22:48:23 +0300 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2018-04-02 13:47:43 -0700 |
commit | 48c032bb8ee3c2493783f3db3691f7f067f7782f (patch) | |
tree | d6ee0828231f801e31c7ca2f5a85dc1aa71a5bbe | |
parent | 2700f02dcd83d6ffebb22975b80999dd96cd79c2 (diff) | |
download | subsurface-48c032bb8ee3c2493783f3db3691f7f067f7782f.tar.gz |
mapwidget-mobile: do not animate the first selection
centerOnLocationHard() is added in MapPage.qml so that
on `firstRun` the map is hard panned to the desired location
without animation.
This affects the selection of a new "Dive details" -> "Map it" or
when opening a GPS location in the map.
The idea behind this change is to avoid starting the map animation
from an arbitrary location such as [0,0] or London. Also, to not
start the map zoomed out completely and then zoom in on a selected
dive.
For this change to work, add the helper getCoordinatesForUUID()
to qmlmapwidgethelper.cpp/.h and use it to obtain the
QGeoCoordinates for a dive site UUID.
Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
-rw-r--r-- | map-widget/qmlmapwidgethelper.cpp | 9 | ||||
-rw-r--r-- | map-widget/qmlmapwidgethelper.h | 1 | ||||
-rw-r--r-- | mobile-widgets/qml/MapPage.qml | 18 |
3 files changed, 28 insertions, 0 deletions
diff --git a/map-widget/qmlmapwidgethelper.cpp b/map-widget/qmlmapwidgethelper.cpp index e8187a679..fa0616202 100644 --- a/map-widget/qmlmapwidgethelper.cpp +++ b/map-widget/qmlmapwidgethelper.cpp @@ -23,6 +23,15 @@ MapWidgetHelper::MapWidgetHelper(QObject *parent) : QObject(parent) this, SLOT(selectedLocationChanged(MapLocation *))); } +QGeoCoordinate MapWidgetHelper::getCoordinatesForUUID(QVariant dive_site_uuid) +{ + const uint32_t uuid = qvariant_cast<uint32_t>(dive_site_uuid); + struct dive_site *ds = get_dive_site_by_uuid(uuid); + if (!ds || !dive_site_has_gps_location(ds)) + return QGeoCoordinate(0.0, 0.0); + return QGeoCoordinate(ds->latitude.udeg * 0.000001, ds->longitude.udeg * 0.000001); +} + void MapWidgetHelper::centerOnDiveSiteUUID(QVariant dive_site_uuid) { const uint32_t uuid = qvariant_cast<uint32_t>(dive_site_uuid); diff --git a/map-widget/qmlmapwidgethelper.h b/map-widget/qmlmapwidgethelper.h index d5cdb35bc..eb57dcd88 100644 --- a/map-widget/qmlmapwidgethelper.h +++ b/map-widget/qmlmapwidgethelper.h @@ -22,6 +22,7 @@ public: explicit MapWidgetHelper(QObject *parent = NULL); void centerOnDiveSite(struct dive_site *); + Q_INVOKABLE QGeoCoordinate getCoordinatesForUUID(QVariant dive_site_uuid); Q_INVOKABLE void centerOnDiveSiteUUID(QVariant dive_site_uuid); Q_INVOKABLE void reloadMapLocations(); Q_INVOKABLE void copyToClipboardCoordinates(QGeoCoordinate coord, bool formatTraditional); diff --git a/mobile-widgets/qml/MapPage.qml b/mobile-widgets/qml/MapPage.qml index ee1e99dc2..fdfcfa213 100644 --- a/mobile-widgets/qml/MapPage.qml +++ b/mobile-widgets/qml/MapPage.qml @@ -12,6 +12,7 @@ Kirigami.Page { topPadding: 0 rightPadding: 0 bottomPadding: 0 + property bool firstRun: true MapWidget { id: mapWidget @@ -40,10 +41,27 @@ Kirigami.Page { console.warn("main.qml: centerOnDiveSiteUUI(): uuid is undefined!") return } + // on firstRun, hard pan/center the map to the desired location so that + // we don't start at an arbitrary location such as [0,0] or London. + if (firstRun) { + var coord = mapWidget.mapHelper.getCoordinatesForUUID(uuid) + centerOnLocationHard(coord.latitude, coord.longitude) + firstRun = false + } // continue here as centerOnDiveSiteUUID() also does marker selection. mapWidget.mapHelper.centerOnDiveSiteUUID(uuid) } function centerOnLocation(lat, lon) { + if (firstRun) { + centerOnLocationHard(lat, lon) + firstRun = false + return // no need to animate via centerOnCoordinate(). + } mapWidget.map.centerOnCoordinate(QtPositioning.coordinate(lat, lon)) } + + function centerOnLocationHard(lat, lon) { + mapWidget.map.zoomLevel = mapWidget.map.defaultZoomIn + mapWidget.map.center = QtPositioning.coordinate(lat, lon) + } } |