diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-06-05 15:41:52 +0900 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2013-06-05 16:40:27 +0900 |
commit | a737f595538584844041adda02bea5a5dae48d3d (patch) | |
tree | 3c0e1ca5be9075360167e53324235bf83f0ec821 /qt-ui/globe.cpp | |
parent | b533cf299fba1b2d9dd4737f109caf5aba042d7a (diff) | |
download | subsurface-a737f595538584844041adda02bea5a5dae48d3d.tar.gz |
First cut at selecting dives from the map
We'll want to enhance this: better logic for which dives are near the
selection, and it's probably best to have a "control-click" that adds
the dives to the selection rather than deselecting all the old ones.
But it's already useful.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'qt-ui/globe.cpp')
-rw-r--r-- | qt-ui/globe.cpp | 41 |
1 files changed, 40 insertions, 1 deletions
diff --git a/qt-ui/globe.cpp b/qt-ui/globe.cpp index 97c848d80..20c913bbd 100644 --- a/qt-ui/globe.cpp +++ b/qt-ui/globe.cpp @@ -1,5 +1,7 @@ #include "globe.h" #include "kmessagewidget.h" +#include "mainwindow.h" +#include "ui_mainwindow.h" #include "../dive.h" #include "../helpers.h" @@ -60,7 +62,44 @@ GlobeGPS::GlobeGPS(QWidget* parent) : MarbleWidget(parent), loadedDives(0) void GlobeGPS::mouseClicked(qreal lon, qreal lat, GeoDataCoordinates::Unit unit) { GeoDataCoordinates here(lon, lat, unit); - qDebug("At this point Linus will make magic appear... %f/%f", here.longitude(GeoDataCoordinates::Degree), here.latitude(GeoDataCoordinates::Degree)); + long lon_udeg = rint(1000000 * here.longitude(GeoDataCoordinates::Degree)); + long lat_udeg = rint(1000000 * here.latitude(GeoDataCoordinates::Degree)); + + // distance() is in km above the map. + // We're going to use that to decide how + // approximate the dives have to be. + // + // Totally arbitrarily I say that 1km + // distance means that we can resolve + // to about 100m. Which in turn is about + // 1000 udeg. + // + // Trigonometry is hard, but sin x == x + // for small x, so let's just do this as + // a linear thing. + long resolve = rint(distance() * 1000); + + int idx; + struct dive *dive; + bool first = true; + for_each_dive(idx, dive) { + long lat_diff, lon_diff; + if (!dive_has_gps_location(dive)) + continue; + lat_diff = labs(dive->latitude.udeg - lat_udeg); + lon_diff = labs(dive->longitude.udeg - lon_udeg); + if (lat_diff > 180000000) + lat_diff = 360000000 - lat_diff; + if (lon_diff > 180000000) + lon_diff = 180000000 - lon_diff; + if (lat_diff > resolve || lon_diff > resolve) + continue; + + if (first) + mainWindow()->dive_list()->unselectDives(); + mainWindow()->dive_list()->selectDive(dive, first); + first = false; + } } void GlobeGPS::reload() |