diff options
author | Berthold Stoeger <bstoeger@mail.tuwien.ac.at> | 2019-03-10 16:03:39 +0100 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2019-04-12 18:19:07 +0300 |
commit | 8dcc33d8ab4081310d2e18b2c3d6c95141999698 (patch) | |
tree | 019c74009720b7164f0a6c5edaaf98a780130897 | |
parent | dd12bdaf94c1ebc5d32598151aa96da12e61c146 (diff) | |
download | subsurface-8dcc33d8ab4081310d2e18b2c3d6c95141999698.tar.gz |
Undo: keep frontend informed of changes to dive site count
Add a new signal to DiveListNotifier. Send signal if dives are
added or removed and therefore the dive count of a dive site
changes. The dive sites are collected and the signal is sent
at the end of the command.
Add code to update the table view.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
-rw-r--r-- | core/divesite.c | 1 | ||||
-rw-r--r-- | core/subsurface-qt/DiveListNotifier.h | 3 | ||||
-rw-r--r-- | desktop-widgets/command_divelist.cpp | 14 | ||||
-rw-r--r-- | desktop-widgets/command_divelist.h | 8 | ||||
-rw-r--r-- | qt-models/divelocationmodel.cpp | 9 | ||||
-rw-r--r-- | qt-models/divelocationmodel.h | 4 |
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; }; |