summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--desktop-widgets/locationinformation.cpp16
-rw-r--r--desktop-widgets/locationinformation.h2
-rw-r--r--qt-models/divelocationmodel.cpp38
-rw-r--r--qt-models/divelocationmodel.h16
4 files changed, 49 insertions, 23 deletions
diff --git a/desktop-widgets/locationinformation.cpp b/desktop-widgets/locationinformation.cpp
index 64c0574b9..c7d537374 100644
--- a/desktop-widgets/locationinformation.cpp
+++ b/desktop-widgets/locationinformation.cpp
@@ -6,7 +6,6 @@
#include "core/qthelper.h"
#include "desktop-widgets/mapwidget.h"
#include "qt-models/filtermodels.h"
-#include "qt-models/divelocationmodel.h"
#include "core/divesitehelpers.h"
#include "desktop-widgets/modeldelegates.h"
@@ -42,10 +41,7 @@ LocationInformationWidget::LocationInformationWidget(QWidget *parent) : QGroupBo
connect(ui.diveSiteCoordinates, SIGNAL(returnPressed()), this, SLOT(updateLocationOnMap()));
ui.diveSiteCoordinates->installEventFilter(this);
- SsrfSortFilterProxyModel *filter_model = new SsrfSortFilterProxyModel(this);
- filter_model->setSourceModel(LocationInformationModel::instance());
- filter_model->setFilterRow(filter_same_gps_cb);
- ui.diveSiteListView->setModel(filter_model);
+ ui.diveSiteListView->setModel(&filter_model);
ui.diveSiteListView->setModelColumn(LocationInformationModel::NAME);
ui.diveSiteListView->installEventFilter(this);
// Map Management Code.
@@ -217,6 +213,7 @@ void LocationInformationWidget::rejectChanges()
void LocationInformationWidget::showEvent(QShowEvent *ev)
{
if (displayed_dive_site.uuid) {
+ filter_model.set(displayed_dive_site.uuid, displayed_dive_site.latitude, displayed_dive_site.longitude);
updateLabels();
enableLocationButtons(dive_site_has_gps_location(&displayed_dive_site));
QSortFilterProxyModel *m = qobject_cast<QSortFilterProxyModel *>(ui.diveSiteListView->model());
@@ -224,6 +221,7 @@ void LocationInformationWidget::showEvent(QShowEvent *ev)
if (m)
m->invalidate();
} else {
+ filter_model.set(0, degrees_t{ 0 }, degrees_t{ 0 });
clearLabels();
}
MapWidget::instance()->prepareForGetDiveCoordinates(displayed_dive_site.uuid);
@@ -324,9 +322,11 @@ void LocationInformationWidget::reverseGeocode()
void LocationInformationWidget::updateLocationOnMap()
{
- if (displayed_dive_site.uuid)
- MapWidget::instance()->updateDiveSiteCoordinates(displayed_dive_site.uuid, displayed_dive_site.latitude,
- displayed_dive_site.longitude);
+ if (!displayed_dive_site.uuid)
+ return;
+ MapWidget::instance()->updateDiveSiteCoordinates(displayed_dive_site.uuid, displayed_dive_site.latitude,
+ displayed_dive_site.longitude);
+ filter_model.setCoordinates(displayed_dive_site.latitude, displayed_dive_site.longitude);
}
DiveLocationFilterProxyModel::DiveLocationFilterProxyModel(QObject*)
diff --git a/desktop-widgets/locationinformation.h b/desktop-widgets/locationinformation.h
index 225414b2f..868ea729e 100644
--- a/desktop-widgets/locationinformation.h
+++ b/desktop-widgets/locationinformation.h
@@ -4,6 +4,7 @@
#include "core/units.h"
#include "ui_locationInformation.h"
+#include "qt-models/divelocationmodel.h"
#include <stdint.h>
#include <QAbstractListModel>
#include <QSortFilterProxyModel>
@@ -48,6 +49,7 @@ private:
Ui::LocationInformation ui;
bool modified;
QAction *acceptAction, *rejectAction;
+ GPSLocationInformationModel filter_model;
};
class DiveLocationFilterProxyModel : public QSortFilterProxyModel {
diff --git a/qt-models/divelocationmodel.cpp b/qt-models/divelocationmodel.cpp
index 4411f5d98..ca803f1cf 100644
--- a/qt-models/divelocationmodel.cpp
+++ b/qt-models/divelocationmodel.cpp
@@ -116,21 +116,35 @@ GeoReferencingOptionsModel::GeoReferencingOptionsModel(QObject *parent) : QStrin
setStringList(list);
}
-bool filter_same_gps_cb (QAbstractItemModel *model, int sourceRow, const QModelIndex& parent)
+bool GPSLocationInformationModel::filterAcceptsRow(int sourceRow, const QModelIndex &parent) const
{
- int ref_lat = displayed_dive_site.latitude.udeg;
- int ref_lon = displayed_dive_site.longitude.udeg;
- uint32_t ref_uuid = displayed_dive_site.uuid;
- QSortFilterProxyModel *self = (QSortFilterProxyModel*) model;
+ uint32_t uuid = sourceModel()->index(sourceRow, LocationInformationModel::UUID, parent).data().toUInt();
+ if (uuid == ignoreUuid || uuid == RECENTLY_ADDED_DIVESITE)
+ return false;
+ struct dive_site *ds = get_dive_site_by_uuid(uuid);
- uint32_t ds_uuid = self->sourceModel()->index(sourceRow, LocationInformationModel::UUID, parent).data().toUInt();
- struct dive_site *ds = get_dive_site_by_uuid(ds_uuid);
+ return ds && ds->latitude.udeg == latitude.udeg && ds->longitude.udeg == longitude.udeg;
+}
- if (!ds)
- return false;
+GPSLocationInformationModel::GPSLocationInformationModel(QObject *parent) : QSortFilterProxyModel(parent),
+ ignoreUuid(0),
+ latitude({ 0 }),
+ longitude({ 0 })
+{
+ setSourceModel(LocationInformationModel::instance());
+}
- if (ds->latitude.udeg == 0 || ds->longitude.udeg == 0)
- return false;
+void GPSLocationInformationModel::set(uint32_t ignoreUuidIn, degrees_t latitudeIn, degrees_t longitudeIn)
+{
+ ignoreUuid = ignoreUuidIn;
+ latitude = latitudeIn;
+ longitude = longitudeIn;
+ invalidate();
+}
- return ds->latitude.udeg == ref_lat && ds->longitude.udeg == ref_lon && ds->uuid != ref_uuid;
+void GPSLocationInformationModel::setCoordinates(degrees_t latitudeIn, degrees_t longitudeIn)
+{
+ latitude = latitudeIn;
+ longitude = longitudeIn;
+ invalidate();
}
diff --git a/qt-models/divelocationmodel.h b/qt-models/divelocationmodel.h
index 8dbc8f3e6..048b2c0a3 100644
--- a/qt-models/divelocationmodel.h
+++ b/qt-models/divelocationmodel.h
@@ -10,9 +10,6 @@
#define RECENTLY_ADDED_DIVESITE 1
-bool filter_same_gps_cb (QAbstractItemModel *m, int sourceRow, const QModelIndex& parent);
-
-
class LocationInformationModel : public QAbstractTableModel {
Q_OBJECT
public:
@@ -36,6 +33,19 @@ private:
QStringList locationNames;
};
+// To access only divesites at the given GPS coordinates with the exception of a given dive site
+class GPSLocationInformationModel : public QSortFilterProxyModel {
+Q_OBJECT
+private:
+ uint32_t ignoreUuid;
+ degrees_t latitude, longitude;
+ bool filterAcceptsRow(int sourceRow, const QModelIndex &source_parent) const override;
+public:
+ GPSLocationInformationModel(QObject *parent = nullptr);
+ void set(uint32_t ignoreUuid, degrees_t latitude, degrees_t longitude);
+ void setCoordinates(degrees_t latitude, degrees_t longitude);
+};
+
class GeoReferencingOptionsModel : public QStringListModel {
Q_OBJECT
public: