summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/divesite.c1
-rw-r--r--core/subsurface-qt/DiveListNotifier.h3
-rw-r--r--desktop-widgets/command_divelist.cpp14
-rw-r--r--desktop-widgets/command_divelist.h8
-rw-r--r--qt-models/divelocationmodel.cpp9
-rw-r--r--qt-models/divelocationmodel.h4
6 files changed, 37 insertions, 2 deletions
diff --git a/core/divesite.c b/core/divesite.c
index 5f6275027..23ef62070 100644
--- a/core/divesite.c
+++ b/core/divesite.c
@@ -23,6 +23,7 @@ int get_divesite_idx(const struct dive_site *ds, struct dive_site_table *ds_tabl
return -1;
}
+// TODO: keep table sorted by UUID and do a binary search?
struct dive_site *get_dive_site_by_uuid(uint32_t uuid, struct dive_site_table *ds_table)
{
int i;
diff --git a/core/subsurface-qt/DiveListNotifier.h b/core/subsurface-qt/DiveListNotifier.h
index 35ecf108d..124bde127 100644
--- a/core/subsurface-qt/DiveListNotifier.h
+++ b/core/subsurface-qt/DiveListNotifier.h
@@ -42,6 +42,9 @@ signals:
void divesDeselected(dive_trip *trip, const QVector<dive *> &dives);
void currentDiveChanged();
void selectionChanged();
+
+ // Dive site signals
+ void diveSiteDiveCountChanged(dive_site *ds);
public:
// Desktop uses the QTreeView class to present the list of dives. The layout
// of this class gives us a very fundamental problem, as we can not easily
diff --git a/desktop-widgets/command_divelist.cpp b/desktop-widgets/command_divelist.cpp
index 089fe3ec5..c7dad70e4 100644
--- a/desktop-widgets/command_divelist.cpp
+++ b/desktop-widgets/command_divelist.cpp
@@ -69,6 +69,8 @@ DiveToAdd DiveListBase::removeDive(struct dive *d, std::vector<OwningTripPtr> &t
// remove dive from trip and site - if this is the last dive in the trip
// remove the whole trip.
res.trip = unregister_dive_from_trip(d);
+ if (d->dive_site)
+ diveSiteCountChanged(d->dive_site);
res.site = unregister_dive_from_dive_site(d);
if (res.trip && res.trip->dives.nr == 0) {
unregister_trip(res.trip, &trip_table); // Remove trip from backend
@@ -80,6 +82,12 @@ DiveToAdd DiveListBase::removeDive(struct dive *d, std::vector<OwningTripPtr> &t
return res;
}
+void DiveListBase::diveSiteCountChanged(struct dive_site *ds)
+{
+ if (std::find(sitesCountChanged.begin(), sitesCountChanged.end(), ds) == sitesCountChanged.end())
+ sitesCountChanged.push_back(ds);
+}
+
// This helper function adds a dive and returns ownership to the backend. It may also add a dive trip.
// It is crucial that dives are added in reverse order of deletion (see comment above)!
// Returns pointer to added dive (which is owned by the backend!)
@@ -87,8 +95,10 @@ dive *DiveListBase::addDive(DiveToAdd &d)
{
if (d.trip)
add_dive_to_trip(d.dive.get(), d.trip);
- if (d.site)
+ if (d.site) {
add_dive_to_dive_site(d.dive.get(), d.site);
+ diveSiteCountChanged(d.site);
+ }
dive *res = d.dive.release(); // Give up ownership of dive
// Set the filter flag according to current filter settings
@@ -370,6 +380,8 @@ void DiveListBase::finishWork()
{
if (selectionChanged) // If the selection changed -> tell the frontend
emit diveListNotifier.selectionChanged();
+ for (dive_site *ds: sitesCountChanged)
+ emit diveListNotifier.diveSiteDiveCountChanged(ds);
}
// Set the current dive either from a list of selected dives,
diff --git a/desktop-widgets/command_divelist.h b/desktop-widgets/command_divelist.h
index 9199a2e58..841799473 100644
--- a/desktop-widgets/command_divelist.h
+++ b/desktop-widgets/command_divelist.h
@@ -66,6 +66,9 @@ protected:
DivesAndTripsToAdd removeDives(DivesAndSitesToRemove &divesAndSitesToDelete);
DivesAndSitesToRemove addDives(DivesAndTripsToAdd &toAdd);
+ // Register dive sites where counts changed so that we can signal the frontend later.
+ void diveSiteCountChanged(struct dive_site *ds);
+
// Set the selection to a given state. Set the selectionChanged flag if anything changed.
void restoreSelection(const std::vector<dive *> &selection, dive *currentDive);
@@ -74,9 +77,12 @@ protected:
// If this flag is set on first execution, a selectionChanged signal will
// be sent.
bool selectionChanged;
+
private:
+ // Keep track of dive sites where the number of dives changed
+ std::vector<dive_site *> sitesCountChanged;
void initWork(); // reset selectionChanged flag
- void finishWork(); // emit signal if selection changed
+ void finishWork(); // emit signals if selection or dive site counts changed
void undo() override;
void redo() override;
virtual void redoit() = 0;
diff --git a/qt-models/divelocationmodel.cpp b/qt-models/divelocationmodel.cpp
index b9bf5702b..03c07a5e0 100644
--- a/qt-models/divelocationmodel.cpp
+++ b/qt-models/divelocationmodel.cpp
@@ -1,6 +1,7 @@
// SPDX-License-Identifier: GPL-2.0
#include "core/units.h"
#include "qt-models/divelocationmodel.h"
+#include "core/subsurface-qt/DiveListNotifier.h"
#include "core/qthelper.h"
#include "core/divesite.h"
#include "core/metrics.h"
@@ -23,6 +24,7 @@ LocationInformationModel *LocationInformationModel::instance()
LocationInformationModel::LocationInformationModel(QObject *obj) : QAbstractTableModel(obj)
{
+ connect(&diveListNotifier, &DiveListNotifier::diveSiteDiveCountChanged, this, &LocationInformationModel::diveSiteDiveCountChanged);
}
int LocationInformationModel::columnCount(const QModelIndex &) const
@@ -154,6 +156,13 @@ bool LocationInformationModel::removeRows(int row, int, const QModelIndex&)
return true;
}
+void LocationInformationModel::diveSiteDiveCountChanged(dive_site *ds)
+{
+ int idx = get_divesite_idx(ds, &dive_site_table);
+ if (idx >= 0)
+ dataChanged(createIndex(idx, NUM_DIVES), createIndex(idx, NUM_DIVES));
+}
+
GeoReferencingOptionsModel *GeoReferencingOptionsModel::instance()
{
static GeoReferencingOptionsModel *self = new GeoReferencingOptionsModel();
diff --git a/qt-models/divelocationmodel.h b/qt-models/divelocationmodel.h
index 4840bff21..794056324 100644
--- a/qt-models/divelocationmodel.h
+++ b/qt-models/divelocationmodel.h
@@ -9,6 +9,9 @@
#define RECENTLY_ADDED_DIVESITE ((struct dive_site *)~0)
+struct dive;
+struct dive_trip;
+
class LocationInformationModel : public QAbstractTableModel {
Q_OBJECT
public:
@@ -30,6 +33,7 @@ public:
public slots:
void update();
QStringList allSiteNames() const;
+ void diveSiteDiveCountChanged(struct dive_site *ds);
private:
QStringList locationNames;
};