aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Dirk Hohndel <dirk@hohndel.org>2013-10-17 14:53:12 -0700
committerGravatar Dirk Hohndel <dirk@hohndel.org>2013-10-17 15:00:22 -0700
commit8f623c2c72dfcae6b9fa49339e40b946c8877ae6 (patch)
treef879f1cddd43bdbee47ec47d1a1ea84b4b6bad81
parent579d1cb91503ff3b51e94869a0234eaf2796f435 (diff)
downloadsubsurface-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.cpp16
-rw-r--r--qt-ui/globe.h9
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