diff options
author | Dirk Hohndel <dirk@hohndel.org> | 2013-10-17 14:53:12 -0700 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2013-10-17 15:00:22 -0700 |
commit | 8f623c2c72dfcae6b9fa49339e40b946c8877ae6 (patch) | |
tree | f879f1cddd43bdbee47ec47d1a1ea84b4b6bad81 | |
parent | 579d1cb91503ff3b51e94869a0234eaf2796f435 (diff) | |
download | subsurface-8f623c2c72dfcae6b9fa49339e40b946c8877ae6.tar.gz |
Fix marble losting track of zoom level
Marble had a bug on the way it treats zoom level, there's
no way for it to find out if it's user-input or algorithm input
and when a user clicks on a dive, it spins and centers on it,
but if the user clicks on another dive when it's still spinning,
it will get the zoom in the actual state ( spinning, usually zoom
is far away from the first position ) and continue the spin to the
other position.
This patch works by saving the first location and triggering a
helper function with a timer that will only update the zoom level
if the timer is not active ( and thus, will not get the bugged
zoom state set by the animation. ).
Signed-off-by: Tomaz Canabrava <tcanabrava@kde.org>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r-- | qt-ui/globe.cpp | 16 | ||||
-rw-r--r-- | qt-ui/globe.h | 9 |
2 files changed, 22 insertions, 3 deletions
diff --git a/qt-ui/globe.cpp b/qt-ui/globe.cpp index 966edda17..c2ae56536 100644 --- a/qt-ui/globe.cpp +++ b/qt-ui/globe.cpp @@ -7,6 +7,7 @@ #include "../helpers.h" #include <QDebug> +#include <QTimer> #include <marble/AbstractFloatItem.h> #include <marble/GeoDataPlacemark.h> @@ -63,6 +64,9 @@ GlobeGPS::GlobeGPS(QWidget* parent) : MarbleWidget(parent), loadedDives(0) setMinimumHeight(0); setMinimumWidth(0); editingDiveCoords = 0; + fixZoomTimer = new QTimer(); + connect(fixZoomTimer, SIGNAL(timeout()), this, SLOT(fixZoom())); + fixZoomTimer->setSingleShot(true); } void GlobeGPS::mouseClicked(qreal lon, qreal lat, GeoDataCoordinates::Unit unit) @@ -178,9 +182,21 @@ void GlobeGPS::centerOn(dive* dive) if (!zoom()) zoomView(zoomFromDistance(3)); + if (!fixZoomTimer->isActive()) + currentZoomLevel = zoom(); + // From the marble source code, the maximum time of + // 'spin and fit' is 2 seconds, so wait a bit them zoom again. + fixZoomTimer->start(2100); + centerOn(longitude,latitude, true); } +void GlobeGPS::fixZoom() +{ + zoomView(currentZoomLevel, Marble::Linear); +} + + void GlobeGPS::prepareForGetDiveCoordinates(dive* dive) { if (!messageWidget->isVisible()) { diff --git a/qt-ui/globe.h b/qt-ui/globe.h index eef01244b..cab42cefc 100644 --- a/qt-ui/globe.h +++ b/qt-ui/globe.h @@ -13,25 +13,28 @@ struct dive; class GlobeGPS : public MarbleWidget{ Q_OBJECT - void prepareForGetDiveCoordinates(struct dive* dive); public: using MarbleWidget::centerOn; GlobeGPS(QWidget *parent); void reload(); void centerOn(struct dive* dive); - void resizeEvent(QResizeEvent *event); protected: - virtual void mousePressEvent(QMouseEvent* event); + /* reimp */ void resizeEvent(QResizeEvent *event); + /* reimp */ void mousePressEvent(QMouseEvent* event); private: + void prepareForGetDiveCoordinates(struct dive* dive); GeoDataDocument *loadedDives; struct dive* editingDiveCoords; KMessageWidget* messageWidget; + QTimer *fixZoomTimer; + int currentZoomLevel; public slots: void changeDiveGeoPosition(qreal lon,qreal lat,GeoDataCoordinates::Unit); void mouseClicked(qreal lon, qreal lat, GeoDataCoordinates::Unit); + void fixZoom(); }; #endif |