diff options
author | Dirk Hohndel <dirk@hohndel.org> | 2015-07-08 13:45:24 -0700 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2015-07-08 13:45:24 -0700 |
commit | 83e5e4933fe66a6e3d0dfff80a5b4f9463dbf0cb (patch) | |
tree | f729665487a297048cca23cb611f9d77314b0031 /qt-ui/globe.cpp | |
parent | 33a7e5cd73f12199d932665c6e59bb242167345f (diff) | |
download | subsurface-83e5e4933fe66a6e3d0dfff80a5b4f9463dbf0cb.tar.gz |
Globe: another attempt to fix the globe zoom
The fact that Marble doesn't tell us when it's done flying to the next
point is making this excessively complicated to get right.
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'qt-ui/globe.cpp')
-rw-r--r-- | qt-ui/globe.cpp | 42 |
1 files changed, 27 insertions, 15 deletions
diff --git a/qt-ui/globe.cpp b/qt-ui/globe.cpp index c6e997c12..41b250052 100644 --- a/qt-ui/globe.cpp +++ b/qt-ui/globe.cpp @@ -47,7 +47,7 @@ GlobeGPS::GlobeGPS(QWidget *parent) : MarbleWidget(parent), // been processed but before we initialize the rest of Marble Marble::MarbleDebug::setEnabled(verbose); #endif - currentZoomLevel = zoomFromDistance(3.0); + currentZoomLevel = -1; // check if Google Sat Maps are installed // if not, check if they are in a known location MapThemeManager mtm; @@ -241,7 +241,7 @@ void GlobeGPS::repopulateLabels() struct dive_site *center = displayed_dive_site.uuid != 0 ? &displayed_dive_site : current_dive ? get_dive_site_by_uuid(current_dive->dive_site_uuid) : NULL; - if(center) + if(dive_site_has_gps_location(&displayed_dive_site) && center) centerOn(displayed_dive_site.longitude.udeg / 1000000.0, displayed_dive_site.latitude.udeg / 1000000.0, true); } @@ -260,7 +260,6 @@ void GlobeGPS::centerOnDiveSite(uint32_t uuid) zoomOutForNoGPS(); return; } - qreal longitude = ds->longitude.udeg / 1000000.0; qreal latitude = ds->latitude.udeg / 1000000.0; @@ -268,24 +267,36 @@ void GlobeGPS::centerOnDiveSite(uint32_t uuid) // if we come back from a dive without GPS data, reset to the last zoom value // otherwise check to make sure we aren't still running an animation and then remember // the current zoom level - if (fixZoomTimer->isActive()) { - fixZoomTimer->stop(); - } else if (needResetZoom) { - needResetZoom = false; - fixZoom(); - } else if (zoom() > 1000) { - currentZoomLevel = zoom(); + if (currentZoomLevel == -1) { + currentZoomLevel = zoomFromDistance(3.0); + centerOn(longitude, latitude); + fixZoom(true); + return; + } + if (!fixZoomTimer->isActive()) { + if (needResetZoom) { + needResetZoom = false; + fixZoom(); + } else if (zoom() >= 1200) { + currentZoomLevel = zoom(); + } } // From the marble source code, the maximum time of // 'spin and fit' is 2000 miliseconds so wait a bit them zoom again. - fixZoomTimer->start(2100); - + fixZoomTimer->stop(); + if (zoom() < 1200 && IS_FP_SAME(centerLatitude(), latitude) && IS_FP_SAME(centerLongitude(), longitude)) { + // create a tiny movement + centerOn(longitude + 0.00001, latitude + 0.00001); + fixZoomTimer->start(300); + } else { + fixZoomTimer->start(2100); + } centerOn(longitude, latitude, true); } -void GlobeGPS::fixZoom() +void GlobeGPS::fixZoom(bool now) { - setZoom(currentZoomLevel, Marble::Linear); + setZoom(currentZoomLevel, now ? Marble::Instant : Marble::Linear); } void GlobeGPS::zoomOutForNoGPS() @@ -295,8 +306,9 @@ void GlobeGPS::zoomOutForNoGPS() // we show a dive with GPS location we need to zoom in again if (!needResetZoom) { needResetZoom = true; - if (!fixZoomTimer->isActive()) + if (!fixZoomTimer->isActive() && zoom() >= 1500) { currentZoomLevel = zoom(); + } } if (fixZoomTimer->isActive()) fixZoomTimer->stop(); |