From d3f1a30364878d0eb155a7d9ab7a58419e8690a3 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Mon, 12 Dec 2011 09:20:22 -0800 Subject: [PATCH] divelist: show/sort nitrox dive oxygen percentage as a range If you are diving multiple nitrox cylinders, we now show them as a range instead of just the max. We'll still sort by max O2 (and for the same max, by min O2). So now with trimix dives, we'll show the bottom gas (we assume that "highest He percentage" is that bottom gas), for nitrox dives we'll show the range of Oxygen percentage, and for all-air dives we'll show just "air". For simple nitrox dives (only a single mix), we'll obviously show just that single percentage. This should hopefully conclude the whole "show multiple cylinders in dive list" mess. Signed-off-by: Linus Torvalds --- divelist.c | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/divelist.c b/divelist.c index 5b6c7e3..f664cde 100644 --- a/divelist.c +++ b/divelist.c @@ -230,16 +230,23 @@ static void temperature_data_func(GtkTreeViewColumn *col, * - Nitrox trumps air (even if hypoxic) * These are the same rules as the inter-dive sorting rules. */ -static void get_dive_gas(struct dive *dive, int *o2, int *he) +static void get_dive_gas(struct dive *dive, int *o2, int *he, int *o2low) { int i; - int maxo2 = -1, maxhe = -1; + int maxo2 = -1, maxhe = -1, mino2 = 1000; for (i = 0; i < MAX_CYLINDERS; i++) { - struct gasmix *mix = &dive->cylinder[i].gasmix; + cylinder_t *cyl = dive->cylinder + i; + struct gasmix *mix = &cyl->gasmix; int o2 = mix->o2.permille; int he = mix->he.permille; + if (cylinder_none(cyl)) + continue; + if (!o2) + o2 = 209; + if (o2 < mino2) + mino2 = o2; if (he > maxhe) goto newmax; if (he < maxhe) @@ -250,8 +257,12 @@ newmax: maxhe = he; maxo2 = o2; } + /* All air? Show/sort as "air"/zero */ + if (!maxhe && maxo2 == 209 && mino2 == maxo2) + maxo2 = mino2 = 0; *o2 = maxo2; *he = maxhe; + *o2low = mino2; } static gint nitrox_sort_func(GtkTreeModel *model, @@ -263,17 +274,21 @@ static gint nitrox_sort_func(GtkTreeModel *model, struct dive *a, *b; int a_o2, b_o2; int a_he, b_he; + int a_o2low, b_o2low; gtk_tree_model_get(model, iter_a, DIVE_INDEX, &index_a, -1); gtk_tree_model_get(model, iter_b, DIVE_INDEX, &index_b, -1); a = get_dive(index_a); b = get_dive(index_b); - get_dive_gas(a, &a_o2, &a_he); - get_dive_gas(b, &b_o2, &b_he); + get_dive_gas(a, &a_o2, &a_he, &a_o2low); + get_dive_gas(b, &b_o2, &b_he, &b_o2low); /* Sort by Helium first, O2 second */ - if (a_he == b_he) + if (a_he == b_he) { + if (a_o2 == b_o2) + return a_o2low - b_o2low; return a_o2 - b_o2; + } return a_he - b_he; } @@ -283,20 +298,24 @@ static void nitrox_data_func(GtkTreeViewColumn *col, GtkTreeIter *iter, gpointer data) { - int index, o2, he; + int index, o2, he, o2low; char buffer[80]; struct dive *dive; gtk_tree_model_get(model, iter, DIVE_INDEX, &index, -1); dive = get_dive(index); - get_dive_gas(dive, &o2, &he); + get_dive_gas(dive, &o2, &he, &o2low); o2 = (o2 + 5) / 10; he = (he + 5) / 10; + o2low = (o2low + 5) / 10; if (he) snprintf(buffer, sizeof(buffer), "%d/%d", o2, he); else if (o2) - snprintf(buffer, sizeof(buffer), "%d", o2); + if (o2 == o2low) + snprintf(buffer, sizeof(buffer), "%d", o2); + else + snprintf(buffer, sizeof(buffer), "%d-%d", o2low, o2); else strcpy(buffer, "air"); -- 2.43.0