diff options
author | Berthold Stoeger <bstoeger@mail.tuwien.ac.at> | 2019-11-24 15:02:34 +0100 |
---|---|---|
committer | bstoeger <32835590+bstoeger@users.noreply.github.com> | 2019-12-04 13:00:23 +0100 |
commit | 4b1a3a1a6e1db60bda77fc70e5be6278426589cd (patch) | |
tree | d4d939b28ed65fe94dc2168163f12f3e8be16533 /core | |
parent | 7787bfbf9e39595d98c459e4af121f3174762c7d (diff) | |
download | subsurface-4b1a3a1a6e1db60bda77fc70e5be6278426589cd.tar.gz |
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 <bstoeger@mail.tuwien.ac.at>
Diffstat (limited to 'core')
-rw-r--r-- | core/display.h | 2 | ||||
-rw-r--r-- | core/divelist.c | 109 | ||||
-rw-r--r-- | core/divelist.h | 9 | ||||
-rw-r--r-- | core/selection.cpp | 106 | ||||
-rw-r--r-- | core/selection.h | 26 | ||||
-rw-r--r-- | core/trip.c | 1 |
6 files changed, 132 insertions, 121 deletions
diff --git a/core/display.h b/core/display.h index 8c6223be6..6c26e2763 100644 --- a/core/display.h +++ b/core/display.h @@ -29,8 +29,6 @@ extern struct divecomputer *select_dc(struct dive *); extern unsigned int dc_number; -extern unsigned int amount_selected; - extern int is_default_dive_computer_device(const char *); extern int is_default_dive_computer(const char *, const char *); diff --git a/core/divelist.c b/core/divelist.c index 6405dfd51..0385e7e77 100644 --- a/core/divelist.c +++ b/core/divelist.c @@ -19,6 +19,7 @@ #include "planner.h" #include "qthelper.h" #include "git-access.h" +#include "selection.h" #include "table.h" #include "trip.h" @@ -28,23 +29,6 @@ static bool dive_list_changed = false; bool autogroup = false; -unsigned int amount_selected; - -#if DEBUG_SELECTION_TRACKING -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 - void set_autogroup(bool value) { /* if we keep the UI paradigm, this needs to toggle @@ -64,7 +48,6 @@ void get_dive_gas(const struct dive *dive, int *o2_p, int *he_p, int *o2max_p) int i; int maxo2 = -1, maxhe = -1, mino2 = 1000; - for (i = 0; i < dive->cylinders.nr; i++) { const cylinder_t *cyl = get_cylinder(dive, i); int o2 = get_o2(cyl->gasmix); @@ -159,7 +142,6 @@ static int calculate_otu(const struct dive *dive) return lrint(otu); } - /* Calculate the CNS for a single dive - this only takes the first divecomputer into account. The CNS contributions are summed for dive segments defined by samples. The maximum O2 exposure duration for each segment is calculated based on the mean depth of the two samples (start & end) that define each segment. The CNS @@ -648,30 +630,6 @@ char *get_dive_gas_string(const struct dive *dive) return buffer; } -struct dive *first_selected_dive() -{ - int idx; - struct dive *d; - - for_each_dive (idx, d) { - if (d->selected) - return d; - } - return NULL; -} - -struct dive *last_selected_dive() -{ - int idx; - struct dive *d, *ret = NULL; - - for_each_dive (idx, d) { - if (d->selected) - ret = d; - } - return ret; -} - /* Like strcmp(), but don't crash on null-pointers */ static int safe_strcmp(const char *s1, const char *s2) { @@ -834,71 +792,6 @@ void append_dive(struct dive *dive) amount_selected++; } -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; -} - -void select_dive(struct dive *dive) -{ - if (!dive) - return; - if (!dive->selected) { - dive->selected = 1; - amount_selected++; - } - current_dive = dive; -} - -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; - } -} - int shown_dives = 0; bool filter_dive(struct dive *d, bool shown) { diff --git a/core/divelist.h b/core/divelist.h index efab389ee..14366f274 100644 --- a/core/divelist.h +++ b/core/divelist.h @@ -41,12 +41,7 @@ extern void insert_dive(struct dive_table *table, struct dive *d); extern void get_dive_gas(const struct dive *dive, int *o2_p, int *he_p, int *o2low_p); extern int get_divenr(const struct dive *dive); extern int remove_dive(const struct dive *dive, struct dive_table *table); -extern bool consecutive_selected(); -extern void select_dive(struct dive *dive); -extern void deselect_dive(struct dive *dive); extern bool filter_dive(struct dive *d, bool shown); /* returns true if status changed */ -extern struct dive *first_selected_dive(); -extern struct dive *last_selected_dive(); extern int get_dive_nr_at_idx(int idx); extern void set_dive_nr_for_current_dive(); extern timestamp_t get_surface_interval(timestamp_t when); @@ -63,10 +58,6 @@ void clear_dive_file_data(); void clear_dive_table(struct dive_table *table); void move_dive_table(struct dive_table *src, struct dive_table *dst); -#ifdef DEBUG_TRIP -extern void dump_selection(void); -#endif - #ifdef __cplusplus } #endif 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 <QVector> +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. diff --git a/core/selection.h b/core/selection.h index 0fb226949..e990a697c 100644 --- a/core/selection.h +++ b/core/selection.h @@ -4,13 +4,35 @@ #ifndef SELECTION_H #define SELECTION_H +struct dive; + +extern int amount_selected; + +/*** C and C++ functions ***/ + +#ifdef __cplusplus +extern "C" { +#endif + +extern void select_dive(struct dive *dive); +extern void deselect_dive(struct dive *dive); +extern struct dive *first_selected_dive(void); +extern struct dive *last_selected_dive(void); +extern bool consecutive_selected(void); + +#if DEBUG_SELECTION_TRACKING +extern void dump_selection(void); +#endif + +#ifdef __cplusplus +} +#endif + /*** C++-only functions ***/ #ifdef __cplusplus #include <vector> -struct dive; - // Reset the selection to the dives of the "selection" vector and send the appropriate signals. // Set the current dive to "currentDive". "currentDive" must be an element of "selection" (or // null if "seletion" is empty). diff --git a/core/trip.c b/core/trip.c index 58e224f5b..9f05699dc 100644 --- a/core/trip.c +++ b/core/trip.c @@ -2,6 +2,7 @@ #include "trip.h" #include "subsurface-string.h" +#include "selection.h" #include "table.h" struct trip_table trip_table; |