X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=divelist.c;h=86e7daf571052104710ce8060ace9af34c11a17f;hb=565736a471e9ba66cbc68ce76c90d5e0c2fa57cf;hp=546d54bd0a16cc37e6583e988a8bf676b498bc64;hpb=8cca5404440960ba14ed870e77c6eb6537f4aa2e;p=ext%2Fsubsurface.git diff --git a/divelist.c b/divelist.c index 546d54b..86e7daf 100644 --- a/divelist.c +++ b/divelist.c @@ -223,21 +223,46 @@ static void temperature_data_func(GtkTreeViewColumn *col, g_object_set(renderer, "text", buffer, NULL); } -/* Get max O2/He permille levels for a dive for the dive summary */ -static void get_dive_gas(struct dive *dive, int *o2, int *he) +/* + * Get "maximal" dive gas for a dive. + * Rules: + * - Trimix trumps nitrox (highest He wins, O2 breaks ties) + * - 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, 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; - if (mix->o2.permille > maxo2) - maxo2 = mix->o2.permille; - if (mix->he.permille > maxhe) - maxhe = mix->he.permille; + 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) + continue; + if (o2 <= maxo2) + continue; +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, @@ -249,40 +274,50 @@ 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; } +#define UTF8_ELLIPSIS "\xE2\x80\xA6" + static void nitrox_data_func(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, 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" UTF8_ELLIPSIS "%d", o2low, o2); else strcpy(buffer, "air");