diff options
Diffstat (limited to 'equipment.c')
-rw-r--r-- | equipment.c | 124 |
1 files changed, 119 insertions, 5 deletions
diff --git a/equipment.c b/equipment.c index 5b8bf3583..f250c46f2 100644 --- a/equipment.c +++ b/equipment.c @@ -8,26 +8,138 @@ #include "display.h" #include "divelist.h" +static GtkWidget *cylinder_description; + +static gboolean match_cylinder(GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + gpointer data) +{ + const char *name; + const char *desc = data; + GValue value = {0, }; + + gtk_tree_model_get_value(model, iter, 0, &value); + name = g_value_get_string(&value); + if (strcmp(desc, name)) + return FALSE; + gtk_combo_box_set_active_iter(GTK_COMBO_BOX(cylinder_description), iter); + return TRUE; +} + void show_dive_equipment(struct dive *dive) { + const char *desc = dive->cylinder[0].type.description; + GtkTreeModel *model = gtk_combo_box_get_model(GTK_COMBO_BOX(cylinder_description)); + + if (!desc) + return; + gtk_tree_model_foreach(model, match_cylinder, (gpointer)desc); +} + +static GtkWidget *create_spinbutton(GtkWidget *vbox, const char *name) +{ + GtkWidget *frame, *button; + + frame = gtk_frame_new(name); + gtk_container_add(GTK_CONTAINER(vbox), frame); + + button = gtk_spin_button_new_with_range( 1.0, 3000, 0.1); + gtk_container_add(GTK_CONTAINER(frame), button); + + return button; +} + +static int get_cylinder_details(const char *name, int *volume, int *pressure) +{ + int result; + GtkWidget *dialog, *frame, *vbox; + + dialog = gtk_dialog_new_with_buttons("New Cylinder Type", + GTK_WINDOW(main_window), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, + GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, + NULL); + + frame = gtk_frame_new(name); + gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), frame); + vbox = gtk_vbox_new(TRUE, 6); + gtk_container_add(GTK_CONTAINER(frame), vbox); + + create_spinbutton(vbox, "Size:"); + create_spinbutton(vbox, "Working pressure:"); + + gtk_widget_show_all(dialog); + result = gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + + *volume = 0; + *pressure = 0; + return result == GTK_RESPONSE_ACCEPT; +} + +static void fill_cylinder_info(cylinder_t *cyl, const char *desc, int mliter, int mbar) +{ + /* + * The code is currently too broken to actually set anything, + * so just print what we would set + */ + printf("Set cylinder to '%s': %.1f liter at %.1f bar working pressure\n", + desc, mliter / 1000.0, mbar / 1000.); +#if 0 + cyl->type.description = desc; + cyl->type.size.mliter = mliter; + cyl->type.workingpressure.mbar = mbar; +#endif } void flush_dive_equipment_changes(struct dive *dive) { + GtkTreeIter iter; + const gchar *desc; + GtkComboBox *box = GTK_COMBO_BOX(cylinder_description); + GtkTreeModel *model = gtk_combo_box_get_model(box); + GtkListStore *store = GTK_LIST_STORE(model); + GValue value1 = {0, }, value2 = {0,}, value3 = {0, }; + int volume, pressure; + + if (!gtk_combo_box_get_active_iter(box, &iter)) { + desc = gtk_combo_box_get_active_text(box); + if (!get_cylinder_details(desc, &volume, &pressure)) + return; + gtk_list_store_append(store, &iter); + gtk_list_store_set(store, &iter, + 0, desc, + 1, volume, + 2, pressure, + -1); + } + + gtk_tree_model_get_value(model, &iter, 0, &value1); + desc = g_value_get_string(&value1); + gtk_tree_model_get_value(model, &iter, 1, &value2); + volume = g_value_get_int(&value2); + gtk_tree_model_get_value(model, &iter, 2, &value3); + pressure = g_value_get_int(&value3); + fill_cylinder_info(dive->cylinder+0, desc, volume, pressure); } +/* We should take these from the dive list instead */ static struct tank_info { const char *name; int size; /* cuft or mliter depending on psi */ int psi; /* If zero, size is in mliter */ } tank_info[] = { - { "None", }, + { "None", 0, 0 }, { "10.0 l", 10000 }, { "11.1 l", 11100 }, { "AL72", 72, 3000 }, { "AL80", 80, 3000 }, - { "LP85", 85, 2640 }, - { "LP95", 95, 2640 }, + { "LP85", 85, 2400 }, + { "LP95", 95, 2400 }, + { "LP85+", 85, 2640 }, + { "LP95+", 95, 2640 }, { "HP100", 100, 3442 }, { "HP119", 119, 3442 }, { NULL, } @@ -71,13 +183,15 @@ static void cylinder_widget(GtkWidget *box, int nr, GtkListStore *model) snprintf(buffer, sizeof(buffer), "Cylinder %d", nr); frame = gtk_frame_new(buffer); - gtk_box_pack_start(GTK_BOX(box), frame, TRUE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(box), frame, FALSE, FALSE, 0); hbox = gtk_hbox_new(TRUE, 3); gtk_container_add(GTK_CONTAINER(frame), hbox); size = gtk_combo_box_entry_new_with_model(GTK_TREE_MODEL(model), 0); gtk_box_pack_start(GTK_BOX(hbox), size, FALSE, FALSE, 0); + + cylinder_description = size; } static GtkListStore *create_tank_size_model(void) @@ -99,7 +213,7 @@ GtkWidget *equipment_widget(void) GtkWidget *vbox; GtkListStore *model; - vbox = gtk_vbox_new(TRUE, 3); + vbox = gtk_vbox_new(FALSE, 3); model = create_tank_size_model(); cylinder_widget(vbox, 0, model); |