summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--qt-ui/divelistview.cpp19
-rw-r--r--qt-ui/divelistview.h2
-rw-r--r--qt-ui/globe.cpp41
3 files changed, 61 insertions, 1 deletions
diff --git a/qt-ui/divelistview.cpp b/qt-ui/divelistview.cpp
index 1e822869b..6306f5f8d 100644
--- a/qt-ui/divelistview.cpp
+++ b/qt-ui/divelistview.cpp
@@ -40,6 +40,25 @@ DiveListView::DiveListView(QWidget *parent) : QTreeView(parent), mouseClickSelec
connect(searchBox, SIGNAL(textChanged(QString)), model, SLOT(setFilterFixedString(QString)));
}
+void DiveListView::unselectDives()
+{
+ selectionModel()->clearSelection();
+}
+
+void DiveListView::selectDive(struct dive *dive, bool scrollto)
+{
+ QSortFilterProxyModel *m = qobject_cast<QSortFilterProxyModel*>(model());
+ QModelIndexList match = m->match(m->index(0,0), TreeItemDT::NR, dive->number, 1, Qt::MatchRecursive);
+ QModelIndex idx = match.first();
+
+ QModelIndex parent = idx.parent();
+ if (parent.isValid())
+ expand(parent);
+ selectionModel()->select( idx, QItemSelectionModel::Select | QItemSelectionModel::Rows);
+ if (scrollto)
+ scrollTo(idx, PositionAtCenter);
+}
+
void DiveListView::showSearchEdit()
{
searchBox->show();
diff --git a/qt-ui/divelistview.h b/qt-ui/divelistview.h
index 2f3838c00..630f74e7f 100644
--- a/qt-ui/divelistview.h
+++ b/qt-ui/divelistview.h
@@ -26,6 +26,8 @@ public:
void currentChanged(const QModelIndex& current, const QModelIndex& previous);
void reload(DiveTripModel::Layout layout = DiveTripModel::TREE, bool forceSort = true);
bool eventFilter(QObject* , QEvent* );
+ void unselectDives();
+ void selectDive(struct dive *, bool scrollto = false);
public slots:
void toggleColumnVisibilityByIndex();
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()