X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=divelist.c;h=48a9ea99a5030fd679dd773190fa3405b388f263;hb=cf6e0e7ca1ef74f4090f660484bdc4726609b5d3;hp=3ddfb6582dea8aedb2a44ef6e257f7452e42f0e7;hpb=a72408400c67a142b9abaec89df954df7dac7a71;p=ext%2Fsubsurface.git diff --git a/divelist.c b/divelist.c index 3ddfb65..48a9ea9 100644 --- a/divelist.c +++ b/divelist.c @@ -223,7 +223,6 @@ static void sac_data_func(GtkTreeViewColumn *col, gpointer data) { int value; - const double liters_per_cuft = 28.317; const char *fmt; char buffer[16]; double sac; @@ -242,7 +241,7 @@ static void sac_data_func(GtkTreeViewColumn *col, break; case CUFT: fmt = "%4.2f"; - sac /= liters_per_cuft; + sac = ml_to_cuft(sac * 1000); break; } snprintf(buffer, sizeof(buffer), fmt, sac); @@ -300,6 +299,7 @@ static double calculate_airuse(struct dive *dive) int i; for (i = 0; i < MAX_CYLINDERS; i++) { + pressure_t start, end; cylinder_t *cyl = dive->cylinder + i; int size = cyl->type.size.mliter; double kilo_atm; @@ -307,7 +307,9 @@ static double calculate_airuse(struct dive *dive) if (!size) continue; - kilo_atm = (cyl->start.mbar - cyl->end.mbar) / 1013250.0; + start = cyl->start.mbar ? cyl->start : cyl->sample_start; + end = cyl->end.mbar ? cyl->end : cyl->sample_end; + kilo_atm = (to_ATM(start) - to_ATM(end)) / 1000.0; /* Liters of air at 1 atm == milliliters at 1k atm*/ airuse += kilo_atm * size; @@ -315,23 +317,30 @@ static double calculate_airuse(struct dive *dive) return airuse; } -static void get_sac(struct dive *dive, int *val) +static int calculate_sac(struct dive *dive) { double airuse, pressure, sac; - *val = 0; airuse = calculate_airuse(dive); if (!airuse) - return; + return 0; if (!dive->duration.seconds) - return; + return 0; /* Mean pressure in atm: 1 atm per 10m */ pressure = 1 + (dive->meandepth.mm / 10000.0); sac = airuse / pressure * 60 / dive->duration.seconds; /* milliliters per minute.. */ - *val = sac * 1000; + return sac * 1000; +} + +void update_cylinder_related_info(struct dive *dive) +{ + if (dive != NULL) { + dive->sac = calculate_sac(dive); + dive->otu = calculate_otu(dive); + } } static void get_string(char **str, const char *s) @@ -342,8 +351,8 @@ static void get_string(char **str, const char *s) if (!s) s = ""; len = strlen(s); - if (len > 40) - len = 40; + if (len > 60) + len = 60; n = malloc(len+1); memcpy(n, s, len); n[len] = 0; @@ -364,12 +373,10 @@ static void fill_one_dive(struct dive *dive, GtkTreeModel *model, GtkTreeIter *iter) { - int sac; char *location, *cylinder; get_cylinder(dive, &cylinder); get_location(dive, &location); - get_sac(dive, &sac); /* * We only set the fields that changed: the strings. @@ -379,7 +386,7 @@ static void fill_one_dive(struct dive *dive, DIVE_NR, dive->number, DIVE_LOCATION, location, DIVE_CYLINDER, cylinder, - DIVE_SAC, sac, + DIVE_SAC, dive->sac, DIVE_OTU, dive->otu, -1); } @@ -423,27 +430,10 @@ void update_dive_list_units(void) const char *unit; GtkTreeModel *model = GTK_TREE_MODEL(dive_list.model); - switch (output_units.length) { - case METERS: - unit = "m"; - break; - case FEET: - unit = "ft"; - break; - } + (void) get_depth_units(0, NULL, &unit); gtk_tree_view_column_set_title(dive_list.depth, unit); - switch (output_units.temperature) { - case CELSIUS: - unit = UTF8_DEGREE "C"; - break; - case FAHRENHEIT: - unit = UTF8_DEGREE "F"; - break; - case KELVIN: - unit = "Kelvin"; - break; - } + (void) get_temp_units(0, &unit); gtk_tree_view_column_set_title(dive_list.temperature, unit); gtk_tree_model_foreach(model, set_one_dive, NULL); @@ -467,10 +457,11 @@ static void fill_dive_list(void) store = GTK_LIST_STORE(dive_list.model); - for (i = 0; i < dive_table.nr; i++) { + i = dive_table.nr; + while (--i >= 0) { struct dive *dive = dive_table.dives[i]; - dive->otu = calculate_otu(dive); + update_cylinder_related_info(dive); gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, DIVE_INDEX, i, @@ -515,6 +506,20 @@ static void realize_cb(GtkWidget *tree_view, gpointer userdata) gtk_widget_grab_focus(tree_view); } +static void row_activated_cb(GtkTreeView *tree_view, + GtkTreePath *path, + GtkTreeViewColumn *column, + GtkTreeModel *model) +{ + int index; + GtkTreeIter iter; + + if (!gtk_tree_model_get_iter(model, &iter, path)) + return; + gtk_tree_model_get(model, &iter, DIVE_INDEX, &index, -1); + edit_dive_info(get_dive(index)); +} + GtkWidget *dive_list_create(void) { GtkTreeSelection *selection; @@ -560,6 +565,7 @@ GtkWidget *dive_list_create(void) NULL); g_signal_connect_after(dive_list.tree_view, "realize", G_CALLBACK(realize_cb), NULL); + g_signal_connect(dive_list.tree_view, "row-activated", G_CALLBACK(row_activated_cb), dive_list.model); g_signal_connect(selection, "changed", G_CALLBACK(selection_cb), dive_list.model); dive_list.container_widget = gtk_scrolled_window_new(NULL, NULL);