Desktop: Fix 'planned' and 'logged' Filters.

Fix the filters for planned (i.e. has at least one dive plan attached)
and logged (i.e. has at least one dive computer log attached) dives.
Also refactor the respective functions for improved readability.

Signed-off-by: Michael Keller <github@ike.ch>
This commit is contained in:
Michael Keller 2024-04-25 12:10:59 +12:00
parent bb00a9728f
commit f3c7dcf9c9
3 changed files with 19 additions and 9 deletions

View file

@ -969,7 +969,7 @@ static void fixup_dc_depths(struct dive *dive, struct divecomputer *dc)
} }
update_depth(&dc->maxdepth, maxdepth); update_depth(&dc->maxdepth, maxdepth);
if (!has_planned(dive, false) || !is_dc_planner(dc)) if (!is_logged(dive) || !is_dc_planner(dc))
if (maxdepth > dive->maxdepth.mm) if (maxdepth > dive->maxdepth.mm)
dive->maxdepth.mm = maxdepth; dive->maxdepth.mm = maxdepth;
} }
@ -2550,19 +2550,29 @@ static void join_dive_computers(struct dive *d, struct divecomputer *res,
remove_redundant_dc(res, prefer_downloaded); remove_redundant_dc(res, prefer_downloaded);
} }
// Does this dive have a dive computer for which is_dc_planner has value planned static bool has_dc_type(const struct dive *dive, bool dc_is_planner)
extern "C" bool has_planned(const struct dive *dive, bool planned)
{ {
const struct divecomputer *dc = &dive->dc; const struct divecomputer *dc = &dive->dc;
while (dc) { while (dc) {
if (is_dc_planner(&dive->dc) == planned) if (is_dc_planner(dc) == dc_is_planner)
return true; return true;
dc = dc->next; dc = dc->next;
} }
return false; return false;
} }
// Does this dive have a dive computer for which is_dc_planner has value planned
extern "C" bool is_planned(const struct dive *dive)
{
return has_dc_type(dive, true);
}
extern "C" bool is_logged(const struct dive *dive)
{
return has_dc_type(dive, false);
}
/* /*
* Merging two dives can be subtle, because there's two different ways * Merging two dives can be subtle, because there's two different ways
* of merging: * of merging:

View file

@ -141,8 +141,7 @@ void split_divecomputer(const struct dive *src, int num, struct dive **out1, str
for (_dc = &_dive->dc; _dc; _dc = _dc->next) for (_dc = &_dive->dc; _dc; _dc = _dc->next)
#define for_each_relevant_dc(_dive, _dc) \ #define for_each_relevant_dc(_dive, _dc) \
bool _all_planned = !has_planned(_dive, false); \ for (_dc = &_dive->dc; _dc; _dc = _dc->next) if (!is_logged(_dive) || !is_dc_planner(_dc))
for (_dc = &_dive->dc; _dc; _dc = _dc->next) if (_all_planned || !is_dc_planner(_dc))
extern struct dive *get_dive_by_uniq_id(int id); extern struct dive *get_dive_by_uniq_id(int id);
extern int get_idx_by_uniq_id(int id); extern int get_idx_by_uniq_id(int id);
@ -207,7 +206,8 @@ extern void invalidate_dive_cache(struct dive *dc);
extern int total_weight(const struct dive *); extern int total_weight(const struct dive *);
extern bool has_planned(const struct dive *dive, bool planned); extern bool is_planned(const struct dive *dive);
extern bool is_logged(const struct dive *dive);
/* Get gasmixes at increasing timestamps. /* Get gasmixes at increasing timestamps.
* In "evp", pass a pointer to a "struct event *" which is NULL-initialized on first invocation. * In "evp", pass a pointer to a "struct event *" which is NULL-initialized on first invocation.

View file

@ -1074,9 +1074,9 @@ bool filter_constraint_match_dive(const filter_constraint &c, const struct dive
case FILTER_CONSTRAINT_SAC: case FILTER_CONSTRAINT_SAC:
return check_numerical_range_non_zero(c, d->sac); return check_numerical_range_non_zero(c, d->sac);
case FILTER_CONSTRAINT_LOGGED: case FILTER_CONSTRAINT_LOGGED:
return has_planned(d, false) != c.negate; return is_logged(d) != c.negate;
case FILTER_CONSTRAINT_PLANNED: case FILTER_CONSTRAINT_PLANNED:
return has_planned(d, true) != c.negate; return is_planned(d) != c.negate;
case FILTER_CONSTRAINT_DIVE_MODE: case FILTER_CONSTRAINT_DIVE_MODE:
return check_multiple_choice(c, (int)d->dc.divemode); // should we be smarter and check all DCs? return check_multiple_choice(c, (int)d->dc.divemode); // should we be smarter and check all DCs?
case FILTER_CONSTRAINT_TAGS: case FILTER_CONSTRAINT_TAGS: