aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--map-widget/qmlmapwidgethelper.cpp48
-rw-r--r--qt-models/maplocationmodel.cpp66
-rw-r--r--qt-models/maplocationmodel.h3
3 files changed, 54 insertions, 63 deletions
diff --git a/map-widget/qmlmapwidgethelper.cpp b/map-widget/qmlmapwidgethelper.cpp
index da3e6963e..f00105f04 100644
--- a/map-widget/qmlmapwidgethelper.cpp
+++ b/map-widget/qmlmapwidgethelper.cpp
@@ -8,11 +8,7 @@
#include "core/divesite.h"
#include "core/qthelper.h"
#include "qt-models/maplocationmodel.h"
-#ifndef SUBSURFACE_MOBILE
-#include "qt-models/filtermodels.h"
-#endif
-#define MIN_DISTANCE_BETWEEN_DIVE_SITES_M 50.0
#define SMALL_CIRCLE_RADIUS_PX 26.0
MapWidgetHelper::MapWidgetHelper(QObject *parent) : QObject(parent)
@@ -108,49 +104,7 @@ void MapWidgetHelper::centerOnSelectedDiveSite()
void MapWidgetHelper::reloadMapLocations()
{
- int idx;
- struct dive *dive;
- QMap<QString, MapLocation *> locationNameMap;
- m_mapLocationModel->clear();
- MapLocation *location;
- QVector<MapLocation *> locationList;
- QVector<struct dive_site *> locations;
- qreal latitude, longitude;
-
-#ifdef SUBSURFACE_MOBILE
- bool diveSiteMode = false;
-#else
- // In dive site mode (that is when either editing a dive site or on
- // the dive site tab), we want to show all dive sites, not only those
- // of the non-hidden dives.
- bool diveSiteMode = MultiFilterSortModel::instance()->diveSiteMode();
-#endif
- for_each_dive(idx, dive) {
- // Don't show dive sites of hidden dives, unless this is the currently
- // displayed (edited) dive or we're in dive site edit mode.
- if (!diveSiteMode && dive->hidden_by_filter && dive != current_dive)
- continue;
- struct dive_site *ds = get_dive_site_for_dive(dive);
- if (!dive_site_has_gps_location(ds) || locations.contains(ds))
- continue;
- latitude = ds->location.lat.udeg * 0.000001;
- longitude = ds->location.lon.udeg * 0.000001;
- QGeoCoordinate dsCoord(latitude, longitude);
- QString name(ds->name);
- // don't add dive locations with the same name, unless they are
- // at least MIN_DISTANCE_BETWEEN_DIVE_SITES_M apart
- if (locationNameMap.contains(name)) {
- MapLocation *existingLocation = locationNameMap[name];
- QGeoCoordinate coord = existingLocation->coordinate();
- if (dsCoord.distanceTo(coord) < MIN_DISTANCE_BETWEEN_DIVE_SITES_M)
- continue;
- }
- location = new MapLocation(ds, dsCoord, name);
- locationList.append(location);
- locations.append(ds);
- locationNameMap[name] = location;
- }
- m_mapLocationModel->addList(locationList);
+ m_mapLocationModel->reload();
}
void MapWidgetHelper::selectedLocationChanged(MapLocation *location)
diff --git a/qt-models/maplocationmodel.cpp b/qt-models/maplocationmodel.cpp
index e1e79d435..85c106ff1 100644
--- a/qt-models/maplocationmodel.cpp
+++ b/qt-models/maplocationmodel.cpp
@@ -2,11 +2,16 @@
#include <QDebug>
#include "maplocationmodel.h"
#include "core/divesite.h"
+#ifndef SUBSURFACE_MOBILE
+#include "qt-models/filtermodels.h"
+#endif
const char *MapLocation::PROPERTY_NAME_COORDINATE = "coordinate";
const char *MapLocation::PROPERTY_NAME_DIVESITE = "divesite";
const char *MapLocation::PROPERTY_NAME_NAME = "name";
+#define MIN_DISTANCE_BETWEEN_DIVE_SITES_M 50.0
+
MapLocation::MapLocation() : m_ds(nullptr)
{
}
@@ -66,7 +71,7 @@ MapLocationModel::MapLocationModel(QObject *parent) : QAbstractListModel(parent)
MapLocationModel::~MapLocationModel()
{
- clear();
+ qDeleteAll(m_mapLocations);
}
QVariant MapLocationModel::data(const QModelIndex & index, int role) const
@@ -106,23 +111,56 @@ void MapLocationModel::add(MapLocation *location)
endInsertRows();
}
-void MapLocationModel::addList(QVector<MapLocation *> list)
+void MapLocationModel::reload()
{
- if (!list.size())
- return;
- beginInsertRows(QModelIndex(), m_mapLocations.size(), m_mapLocations.size() + list.size() - 1);
- m_mapLocations.append(list);
- endInsertRows();
-}
+ int idx;
+ struct dive *dive;
+
+ beginResetModel();
-void MapLocationModel::clear()
-{
- if (!m_mapLocations.size())
- return;
- beginRemoveRows(QModelIndex(), 0, m_mapLocations.size() - 1);
qDeleteAll(m_mapLocations);
m_mapLocations.clear();
- endRemoveRows();
+
+ QMap<QString, MapLocation *> locationNameMap;
+ MapLocation *location;
+ QVector<struct dive_site *> locations;
+ qreal latitude, longitude;
+
+#ifdef SUBSURFACE_MOBILE
+ bool diveSiteMode = false;
+#else
+ // In dive site mode (that is when either editing a dive site or on
+ // the dive site tab), we want to show all dive sites, not only those
+ // of the non-hidden dives.
+ bool diveSiteMode = MultiFilterSortModel::instance()->diveSiteMode();
+#endif
+ for_each_dive(idx, dive) {
+ // Don't show dive sites of hidden dives, unless this is the currently
+ // displayed (edited) dive or we're in dive site edit mode.
+ if (!diveSiteMode && dive->hidden_by_filter && dive != current_dive)
+ continue;
+ struct dive_site *ds = get_dive_site_for_dive(dive);
+ if (!dive_site_has_gps_location(ds) || locations.contains(ds))
+ continue;
+ latitude = ds->location.lat.udeg * 0.000001;
+ longitude = ds->location.lon.udeg * 0.000001;
+ QGeoCoordinate dsCoord(latitude, longitude);
+ QString name(ds->name);
+ // don't add dive locations with the same name, unless they are
+ // at least MIN_DISTANCE_BETWEEN_DIVE_SITES_M apart
+ if (locationNameMap.contains(name)) {
+ MapLocation *existingLocation = locationNameMap[name];
+ QGeoCoordinate coord = existingLocation->coordinate();
+ if (dsCoord.distanceTo(coord) < MIN_DISTANCE_BETWEEN_DIVE_SITES_M)
+ continue;
+ }
+ location = new MapLocation(ds, dsCoord, name);
+ m_mapLocations.append(location);
+ locations.append(ds);
+ locationNameMap[name] = location;
+ }
+
+ endResetModel();
}
void MapLocationModel::setSelected(struct dive_site *ds, bool fromClick)
diff --git a/qt-models/maplocationmodel.h b/qt-models/maplocationmodel.h
index 70f247f33..6c28c6c99 100644
--- a/qt-models/maplocationmodel.h
+++ b/qt-models/maplocationmodel.h
@@ -61,8 +61,7 @@ public:
int rowCount(const QModelIndex &parent) const override;
int count();
void add(MapLocation *);
- void addList(QVector<MapLocation *>);
- void clear();
+ void reload();
MapLocation *getMapLocation(const struct dive_site *ds);
void updateMapLocationCoordinates(const struct dive_site *ds, QGeoCoordinate coord);
Q_INVOKABLE void setSelected(struct dive_site *ds, bool fromClick = true);