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 <torvalds@linux-foundation.org>
This commit is contained in:
Linus Torvalds 2011-12-12 09:20:22 -08:00
parent 51176cb089
commit d3f1a30364

View file

@ -230,16 +230,23 @@ static void temperature_data_func(GtkTreeViewColumn *col,
* - Nitrox trumps air (even if hypoxic) * - Nitrox trumps air (even if hypoxic)
* These are the same rules as the inter-dive sorting rules. * 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 i;
int maxo2 = -1, maxhe = -1; int maxo2 = -1, maxhe = -1, mino2 = 1000;
for (i = 0; i < MAX_CYLINDERS; i++) { 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 o2 = mix->o2.permille;
int he = mix->he.permille; int he = mix->he.permille;
if (cylinder_none(cyl))
continue;
if (!o2)
o2 = 209;
if (o2 < mino2)
mino2 = o2;
if (he > maxhe) if (he > maxhe)
goto newmax; goto newmax;
if (he < maxhe) if (he < maxhe)
@ -250,8 +257,12 @@ newmax:
maxhe = he; maxhe = he;
maxo2 = o2; maxo2 = o2;
} }
/* All air? Show/sort as "air"/zero */
if (!maxhe && maxo2 == 209 && mino2 == maxo2)
maxo2 = mino2 = 0;
*o2 = maxo2; *o2 = maxo2;
*he = maxhe; *he = maxhe;
*o2low = mino2;
} }
static gint nitrox_sort_func(GtkTreeModel *model, static gint nitrox_sort_func(GtkTreeModel *model,
@ -263,17 +274,21 @@ static gint nitrox_sort_func(GtkTreeModel *model,
struct dive *a, *b; struct dive *a, *b;
int a_o2, b_o2; int a_o2, b_o2;
int a_he, b_he; 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_a, DIVE_INDEX, &index_a, -1);
gtk_tree_model_get(model, iter_b, DIVE_INDEX, &index_b, -1); gtk_tree_model_get(model, iter_b, DIVE_INDEX, &index_b, -1);
a = get_dive(index_a); a = get_dive(index_a);
b = get_dive(index_b); b = get_dive(index_b);
get_dive_gas(a, &a_o2, &a_he); get_dive_gas(a, &a_o2, &a_he, &a_o2low);
get_dive_gas(b, &b_o2, &b_he); get_dive_gas(b, &b_o2, &b_he, &b_o2low);
/* Sort by Helium first, O2 second */ /* 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_o2 - b_o2;
}
return a_he - b_he; return a_he - b_he;
} }
@ -283,20 +298,24 @@ static void nitrox_data_func(GtkTreeViewColumn *col,
GtkTreeIter *iter, GtkTreeIter *iter,
gpointer data) gpointer data)
{ {
int index, o2, he; int index, o2, he, o2low;
char buffer[80]; char buffer[80];
struct dive *dive; struct dive *dive;
gtk_tree_model_get(model, iter, DIVE_INDEX, &index, -1); gtk_tree_model_get(model, iter, DIVE_INDEX, &index, -1);
dive = get_dive(index); dive = get_dive(index);
get_dive_gas(dive, &o2, &he); get_dive_gas(dive, &o2, &he, &o2low);
o2 = (o2 + 5) / 10; o2 = (o2 + 5) / 10;
he = (he + 5) / 10; he = (he + 5) / 10;
o2low = (o2low + 5) / 10;
if (he) if (he)
snprintf(buffer, sizeof(buffer), "%d/%d", o2, he); snprintf(buffer, sizeof(buffer), "%d/%d", o2, he);
else if (o2) 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 else
strcpy(buffer, "air"); strcpy(buffer, "air");