diff --git a/commands/command_divelist.cpp b/commands/command_divelist.cpp index 83ae2fbca..8f769514a 100644 --- a/commands/command_divelist.cpp +++ b/commands/command_divelist.cpp @@ -13,6 +13,14 @@ namespace Command { +// Helper function that takes care to unselect trips that are removed from the backend +static void remove_trip_from_backend(dive_trip *trip) +{ + if (trip->selected) + deselect_trip(trip); + remove_trip(trip, &trip_table); // Remove trip from backend +} + // This helper function removes a dive, takes ownership of the dive and adds it to a DiveToAdd structure. // If the trip the dive belongs to becomes empty, it is removed and added to the tripsToAdd vector. // It is crucial that dives are added in reverse order of deletion, so that the indices are correctly @@ -32,7 +40,7 @@ DiveToAdd DiveListBase::removeDive(struct dive *d, std::vector &t diveSiteCountChanged(d->dive_site); res.site = unregister_dive_from_dive_site(d); if (res.trip && res.trip->dives.nr == 0) { - remove_trip(res.trip, &trip_table); // Remove trip from backend + remove_trip_from_backend(res.trip); // Remove trip from backend tripsToAdd.emplace_back(res.trip); // Take ownership of trip } @@ -265,7 +273,7 @@ static OwningTripPtr moveDiveToTrip(DiveToTrip &diveToTrip) // Remove dive from trip - if this is the last dive in the trip, remove the whole trip. dive_trip *trip = unregister_dive_from_trip(diveToTrip.dive); if (trip && trip->dives.nr == 0) { - remove_trip(trip, &trip_table); // Remove trip from backend + remove_trip_from_backend(trip); // Remove trip from backend res.reset(trip); } diff --git a/core/selection.cpp b/core/selection.cpp index 2919f6486..f763afcc6 100644 --- a/core/selection.cpp +++ b/core/selection.cpp @@ -3,12 +3,13 @@ #include "selection.h" #include "divelist.h" -#include "display.h" // for amount_selected +#include "trip.h" #include "subsurface-qt/divelistnotifier.h" #include int amount_selected; +static int amount_trips_selected; extern "C" void select_dive(struct dive *dive) { @@ -155,6 +156,11 @@ void setSelection(const std::vector &selection, dive *currentDive) QVector divesToSelect; divesToSelect.reserve(selection.size()); + // Since we select only dives, there are no selected trips! + amount_trips_selected = 0; + for (int i = 0; i < trip_table.nr; ++i) + trip_table.trips[i]->selected = false; + // TODO: We might want to keep track of selected dives in a more efficient way! int i; dive *d; @@ -231,3 +237,19 @@ extern "C" void select_newest_visible_dive() // No visible dive -> deselect all select_single_dive(nullptr); } + +extern "C" void select_trip(struct dive_trip *trip) +{ + if (trip && !trip->selected) { + trip->selected = true; + amount_trips_selected++; + } +} + +extern "C" void deselect_trip(struct dive_trip *trip) +{ + if (trip && trip->selected) { + trip->selected = false; + amount_trips_selected--; + } +} diff --git a/core/selection.h b/core/selection.h index 8fe5707ce..55055de4a 100644 --- a/core/selection.h +++ b/core/selection.h @@ -21,6 +21,8 @@ extern struct dive *last_selected_dive(void); extern bool consecutive_selected(void); extern void select_newest_visible_dive(); extern void select_single_dive(struct dive *d); // wrapper for setSelection() with a single dive. NULL clears the selection. +extern void select_trip(struct dive_trip *trip); +extern void deselect_trip(struct dive_trip *trip); #if DEBUG_SELECTION_TRACKING extern void dump_selection(void); diff --git a/core/trip.h b/core/trip.h index c9335fc0a..976275736 100644 --- a/core/trip.h +++ b/core/trip.h @@ -17,6 +17,7 @@ typedef struct dive_trip /* Used by the io-routines to mark trips that have already been written. */ bool saved; bool autogen; + bool selected; } dive_trip_t; typedef struct trip_table {