gpointer data)
{
int value;
- const double liters_per_cuft = 28.317;
const char *fmt;
char buffer[16];
double sac;
break;
case CUFT:
fmt = "%4.2f";
- sac /= liters_per_cuft;
+ sac = ml_to_cuft(sac * 1000);
break;
}
snprintf(buffer, sizeof(buffer), fmt, sac);
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;
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;
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)
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;
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.
DIVE_NR, dive->number,
DIVE_LOCATION, location,
DIVE_CYLINDER, cylinder,
- DIVE_SAC, sac,
+ DIVE_SAC, dive->sac,
DIVE_OTU, dive->otu,
-1);
}
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);
void update_dive_list_col_visibility(void)
{
+ gtk_tree_view_column_set_visible(dive_list.cylinder, visible_cols.cylinder);
+ gtk_tree_view_column_set_visible(dive_list.temperature, visible_cols.temperature);
+ gtk_tree_view_column_set_visible(dive_list.nitrox, visible_cols.nitrox);
gtk_tree_view_column_set_visible(dive_list.sac, visible_cols.sac);
gtk_tree_view_column_set_visible(dive_list.otu, visible_cols.otu);
return;
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,
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;
gtk_widget_set_size_request(dive_list.tree_view, 200, 200);
dive_list.nr = divelist_column(&dive_list, DIVE_NR, "#", NULL, PANGO_ALIGN_RIGHT, TRUE);
+ gtk_tree_view_column_set_sort_column_id(dive_list.nr, -1);
dive_list.date = divelist_column(&dive_list, DIVE_DATE, "Date", date_data_func, PANGO_ALIGN_LEFT, TRUE);
dive_list.depth = divelist_column(&dive_list, DIVE_DEPTH, "ft", depth_data_func, PANGO_ALIGN_RIGHT, TRUE);
dive_list.duration = divelist_column(&dive_list, DIVE_DURATION, "min", duration_data_func, PANGO_ALIGN_RIGHT, TRUE);
- dive_list.temperature = divelist_column(&dive_list, DIVE_TEMPERATURE, UTF8_DEGREE "F", temperature_data_func, PANGO_ALIGN_RIGHT, TRUE);
- dive_list.cylinder = divelist_column(&dive_list, DIVE_CYLINDER, "Cyl", NULL, PANGO_ALIGN_CENTER, TRUE);
- dive_list.nitrox = divelist_column(&dive_list, DIVE_NITROX, "O" UTF8_SUBSCRIPT_2 "%", nitrox_data_func, PANGO_ALIGN_CENTER, TRUE);
+ dive_list.temperature = divelist_column(&dive_list, DIVE_TEMPERATURE, UTF8_DEGREE "F", temperature_data_func, PANGO_ALIGN_RIGHT, visible_cols.temperature);
+ dive_list.cylinder = divelist_column(&dive_list, DIVE_CYLINDER, "Cyl", NULL, PANGO_ALIGN_CENTER, visible_cols.cylinder);
+ dive_list.nitrox = divelist_column(&dive_list, DIVE_NITROX, "O" UTF8_SUBSCRIPT_2 "%", nitrox_data_func, PANGO_ALIGN_CENTER, visible_cols.nitrox);
dive_list.sac = divelist_column(&dive_list, DIVE_SAC, "SAC", sac_data_func, PANGO_ALIGN_CENTER, visible_cols.sac);
dive_list.otu = divelist_column(&dive_list, DIVE_OTU, "OTU", otu_data_func, PANGO_ALIGN_CENTER, visible_cols.otu);
dive_list.location = divelist_column(&dive_list, DIVE_LOCATION, "Location", NULL, PANGO_ALIGN_LEFT, TRUE);
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);