From 9afea37e15db29f59048d1bc2553838943ca1b62 Mon Sep 17 00:00:00 2001 From: Berthold Stoeger Date: Fri, 22 Mar 2019 20:55:05 +0100 Subject: Undo: update filter flag when dives change The filter code is strange: it actually only checks the dive->hidden_by_filter flag. Thus, before propagating the dive changed signal, this flag has to be updated. Do this in the DiveTripModel. Ultimately, this should be refactored. Moreover, if the filter-flag changed notify the frontend of a changed trip so that the trip is hidden / unhidden. Signed-off-by: Berthold Stoeger --- desktop-widgets/command_divesite.cpp | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) (limited to 'desktop-widgets') diff --git a/desktop-widgets/command_divesite.cpp b/desktop-widgets/command_divesite.cpp index 4f53b376e..e18a7f3c1 100644 --- a/desktop-widgets/command_divesite.cpp +++ b/desktop-widgets/command_divesite.cpp @@ -7,6 +7,7 @@ #include "core/qthelper.h" #include "core/subsurface-string.h" #include "qt-models/divelocationmodel.h" +#include "qt-models/filtermodels.h" namespace Command { @@ -17,13 +18,16 @@ namespace Command { static std::vector addDiveSites(std::vector &sites) { std::vector res; + std::vector changedDives; res.reserve(sites.size()); for (OwningDiveSitePtr &ds: sites) { // Readd the dives that belonged to this site for (int i = 0; i < ds->dives.nr; ++i) { // TODO: send dive site changed signal - ds->dives.dives[i]->dive_site = ds.get(); + struct dive *d = ds->dives.dives[i]; + d->dive_site = ds.get(); + changedDives.push_back(d); } // Add dive site to core, but remember a non-owning pointer first. @@ -32,6 +36,10 @@ static std::vector addDiveSites(std::vector &sit emit diveListNotifier.diveSiteAdded(res.back(), idx); // Inform frontend of new dive site. } + processByTrip(changedDives, [&](dive_trip *trip, const QVector &divesInTrip) { + emit diveListNotifier.divesChanged(trip, divesInTrip, DiveField::DIVESITE); + }); + // Clear vector of unused owning pointers sites.clear(); @@ -44,13 +52,15 @@ static std::vector addDiveSites(std::vector &sit static std::vector removeDiveSites(std::vector &sites) { std::vector res; + std::vector changedDives; res.reserve(sites.size()); for (dive_site *ds: sites) { // Reset the dive_site field of the affected dives for (int i = 0; i < ds->dives.nr; ++i) { - // TODO: send dive site changed signal - ds->dives.dives[i]->dive_site = nullptr; + struct dive *d = ds->dives.dives[i]; + d->dive_site = nullptr; + changedDives.push_back(d); } // Remove dive site from core and take ownership. @@ -59,6 +69,10 @@ static std::vector removeDiveSites(std::vector & emit diveListNotifier.diveSiteDeleted(ds, idx); // Inform frontend of removed dive site. } + processByTrip(changedDives, [&](dive_trip *trip, const QVector &divesInTrip) { + emit diveListNotifier.divesChanged(trip, divesInTrip, DiveField::DIVESITE); + }); + sites.clear(); return res; @@ -344,6 +358,7 @@ void MergeDiveSites::undo() } sitesToRemove = std::move(addDiveSites(sitesToAdd)); + processByTrip(divesChanged, [&](dive_trip *trip, const QVector &divesInTrip) { emit diveListNotifier.divesChanged(trip, divesInTrip, DiveField::DIVESITE); }); -- cgit v1.2.3-70-g09d2