diff options
author | Berthold Stoeger <bstoeger@mail.tuwien.ac.at> | 2019-05-08 22:26:28 +0200 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2019-05-11 12:06:19 -0700 |
commit | 30d96d37043684a4087f09b7171b1873ec140236 (patch) | |
tree | 03d477271e651cbeeda242ae1d57c0573376c28a | |
parent | 0da86dfd8601edd33c47c787d42e4a687fff8aaf (diff) | |
download | subsurface-30d96d37043684a4087f09b7171b1873ec140236.tar.gz |
Map: ignore dive sites without location in centerOnSelectedDiveSite()
Don't zoom onto (0,0) for selected dive sites that have no location.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
-rw-r--r-- | map-widget/qmlmapwidgethelper.cpp | 62 |
1 files changed, 33 insertions, 29 deletions
diff --git a/map-widget/qmlmapwidgethelper.cpp b/map-widget/qmlmapwidgethelper.cpp index 9aba7f27a..ccc5a6e7a 100644 --- a/map-widget/qmlmapwidgethelper.cpp +++ b/map-widget/qmlmapwidgethelper.cpp @@ -48,45 +48,49 @@ void MapWidgetHelper::centerOnDiveSite(struct dive_site *ds) void MapWidgetHelper::centerOnSelectedDiveSite() { QVector<struct dive_site *> selDS = m_mapLocationModel->selectedDs(); - QVector<QGeoCoordinate> selGC; if (selDS.isEmpty()) { // no selected dives with GPS coordinates QMetaObject::invokeMethod(m_map, "deselectMapLocation"); - } else if (selDS.size() == 1) { + return; + } + + // find the most top-left and bottom-right dive sites on the map coordinate system. + qreal minLat = 0.0, minLon = 0.0, maxLat = 0.0, maxLon = 0.0; + int count = 0; + for(struct dive_site *dss: selDS) { + if (!has_location(&dss->location)) + continue; + qreal lat = dss->location.lat.udeg * 0.000001; + qreal lon = dss->location.lon.udeg * 0.000001; + if (++count == 1) { + minLat = maxLat = lat; + minLon = maxLon = lon; + continue; + } + if (lat < minLat) + minLat = lat; + else if (lat > maxLat) + maxLat = lat; + if (lon < minLon) + minLon = lon; + else if (lon > maxLon) + maxLon = lon; + } + + // Pass coordinates to QML, either as a point or as a rectangle. + // If we didn't find any coordinates, do nothing. + if (count == 1) { QGeoCoordinate dsCoord (selDS[0]->location.lat.udeg * 0.000001, selDS[0]->location.lon.udeg * 0.000001); QMetaObject::invokeMethod(m_map, "centerOnCoordinate", Q_ARG(QVariant, QVariant::fromValue(dsCoord))); - } else { - /* more than one dive sites with GPS selected. - * find the most top-left and bottom-right dive sites on the map coordinate system. */ - qreal minLat = 0.0, minLon = 0.0, maxLat = 0.0, maxLon = 0.0; - bool start = true; - for(struct dive_site *dss: selDS) { - qreal lat = dss->location.lat.udeg * 0.000001; - qreal lon = dss->location.lon.udeg * 0.000001; - if (start) { - minLat = maxLat = lat; - minLon = maxLon = lon; - start = false; - continue; - } - if (lat < minLat) - minLat = lat; - else if (lat > maxLat) - maxLat = lat; - if (lon < minLon) - minLon = lon; - else if (lon > maxLon) - maxLon = lon; - } - // pass rectangle coordinates to QML + } else if (count > 1) { QGeoCoordinate coordTopLeft(minLat, minLon); QGeoCoordinate coordBottomRight(maxLat, maxLon); QGeoCoordinate coordCenter(minLat + (maxLat - minLat) * 0.5, minLon + (maxLon - minLon) * 0.5); QMetaObject::invokeMethod(m_map, "centerOnRectangle", - Q_ARG(QVariant, QVariant::fromValue(coordTopLeft)), - Q_ARG(QVariant, QVariant::fromValue(coordBottomRight)), - Q_ARG(QVariant, QVariant::fromValue(coordCenter))); + Q_ARG(QVariant, QVariant::fromValue(coordTopLeft)), + Q_ARG(QVariant, QVariant::fromValue(coordBottomRight)), + Q_ARG(QVariant, QVariant::fromValue(coordCenter))); } } |