From 4b1a3a1a6e1db60bda77fc70e5be6278426589cd Mon Sep 17 00:00:00 2001 From: Berthold Stoeger Date: Sun, 24 Nov 2019 15:02:34 +0100 Subject: Selection: move selection functions from divelist.c to selection.c Since we now have a selection.c translation unit, put the selection- related functions there. Signed-off-by: Berthold Stoeger --- core/selection.cpp | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) (limited to 'core/selection.cpp') diff --git a/core/selection.cpp b/core/selection.cpp index ce0b0aa42..92bb631fc 100644 --- a/core/selection.cpp +++ b/core/selection.cpp @@ -8,6 +8,112 @@ #include +int amount_selected; + +extern "C" void select_dive(struct dive *dive) +{ + if (!dive) + return; + if (!dive->selected) { + dive->selected = 1; + amount_selected++; + } + current_dive = dive; +} + +extern "C" void deselect_dive(struct dive *dive) +{ + int idx; + if (dive && dive->selected) { + dive->selected = 0; + if (amount_selected) + amount_selected--; + if (current_dive == dive && amount_selected > 0) { + /* pick a different dive as selected */ + int selected_dive = idx = get_divenr(dive); + while (--selected_dive >= 0) { + dive = get_dive(selected_dive); + if (dive && dive->selected) { + current_dive = dive; + return; + } + } + selected_dive = idx; + while (++selected_dive < dive_table.nr) { + dive = get_dive(selected_dive); + if (dive && dive->selected) { + current_dive = dive; + return; + } + } + } + current_dive = NULL; + } +} + +extern "C" struct dive *first_selected_dive() +{ + int idx; + struct dive *d; + + for_each_dive (idx, d) { + if (d->selected) + return d; + } + return NULL; +} + +extern "C" struct dive *last_selected_dive() +{ + int idx; + struct dive *d, *ret = NULL; + + for_each_dive (idx, d) { + if (d->selected) + ret = d; + } + return ret; +} + +extern "C" bool consecutive_selected() +{ + struct dive *d; + int i; + bool consecutive = true; + bool firstfound = false; + bool lastfound = false; + + if (amount_selected == 0 || amount_selected == 1) + return true; + + for_each_dive(i, d) { + if (d->selected) { + if (!firstfound) + firstfound = true; + else if (lastfound) + consecutive = false; + } else if (firstfound) { + lastfound = true; + } + } + return consecutive; +} + +#if DEBUG_SELECTION_TRACKING +extern "C" void dump_selection(void) +{ + int i; + struct dive *dive; + + printf("currently selected are %u dives:", amount_selected); + for_each_dive(i, dive) { + if (dive->selected) + printf(" %d", i); + } + printf("\n"); +} +#endif + // Set the current dive either from a list of selected dives, // or a newly selected dive. In both cases, try to select the // dive that is newer that is newer than the given date. -- cgit v1.2.3-70-g09d2