From ed8561bf59e8a46ca5f7442f0ca80ad10c482970 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Fri, 9 Sep 2011 21:39:54 -0700 Subject: [PATCH] Getting closer to a usable cylinder management interface Not quite there yet, though. And never mind multiple cylinders.. Signed-off-by: Linus Torvalds --- equipment.c | 135 ++++++++++++++++++++++++++-------------------------- 1 file changed, 68 insertions(+), 67 deletions(-) diff --git a/equipment.c b/equipment.c index f250c46..4bde92a 100644 --- a/equipment.c +++ b/equipment.c @@ -8,7 +8,31 @@ #include "display.h" #include "divelist.h" -static GtkWidget *cylinder_description; +static int cylinder_changed; +static GtkComboBox *cylinder_description; +static GtkSpinButton *cylinder_size, *cylinder_pressure; + +static void cylinder_cb(GtkComboBox *combo_box, gpointer data) +{ + GtkTreeIter iter; + GtkTreeModel *model = gtk_combo_box_get_model(combo_box); + GValue value1 = {0, }, value2 = {0,}; + int volume, pressure; + + cylinder_changed = 1; + if (!gtk_combo_box_get_active_iter(combo_box, &iter)) + return; + + gtk_tree_model_get_value(model, &iter, 1, &value1); + volume = g_value_get_int(&value1); + gtk_tree_model_get_value(model, &iter, 2, &value2); + pressure = g_value_get_int(&value2); + + gtk_spin_button_set_value(cylinder_size, + volume / 1000.0); + gtk_spin_button_set_value(cylinder_pressure, + pressure / 1000.0); +} static gboolean match_cylinder(GtkTreeModel *model, GtkTreePath *path, @@ -23,18 +47,22 @@ static gboolean match_cylinder(GtkTreeModel *model, name = g_value_get_string(&value); if (strcmp(desc, name)) return FALSE; - gtk_combo_box_set_active_iter(GTK_COMBO_BOX(cylinder_description), iter); + gtk_combo_box_set_active_iter(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); + cylinder_type_t *type = &dive->cylinder[0].type; + const char *desc = type->description; + GtkTreeModel *model = gtk_combo_box_get_model(cylinder_description); + + if (desc) + gtk_tree_model_foreach(model, match_cylinder, (gpointer)desc); + gtk_spin_button_set_value(cylinder_size, + type->size.mliter / 1000.0); + gtk_spin_button_set_value(cylinder_pressure, + type->workingpressure.mbar / 1000.0); } static GtkWidget *create_spinbutton(GtkWidget *vbox, const char *name) @@ -44,41 +72,12 @@ static GtkWidget *create_spinbutton(GtkWidget *vbox, const char *name) frame = gtk_frame_new(name); gtk_container_add(GTK_CONTAINER(vbox), frame); - button = gtk_spin_button_new_with_range( 1.0, 3000, 0.1); + button = gtk_spin_button_new_with_range( 0.0, 3500.0, 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) { /* @@ -94,35 +93,26 @@ static void fill_cylinder_info(cylinder_t *cyl, const char *desc, int mliter, in #endif } -void flush_dive_equipment_changes(struct dive *dive) +static void record_cylinder_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; + GtkComboBox *box = cylinder_description; + gdouble 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); - } + desc = gtk_combo_box_get_active_text(box); + volume = gtk_spin_button_get_value(cylinder_size); + pressure = gtk_spin_button_get_value(cylinder_pressure); - 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); + fill_cylinder_info(dive->cylinder+0, + desc, volume * 1000, pressure * 1000); +} + +void flush_dive_equipment_changes(struct dive *dive) +{ + if (cylinder_changed) { + cylinder_changed = 0; + record_cylinder_changes(dive); + } } /* We should take these from the dive list instead */ @@ -178,7 +168,8 @@ static void fill_tank_list(GtkListStore *store) static void cylinder_widget(GtkWidget *box, int nr, GtkListStore *model) { - GtkWidget *frame, *hbox, *size; + GtkWidget *frame, *hbox; + GtkWidget *description, *size, *pressure; char buffer[80]; snprintf(buffer, sizeof(buffer), "Cylinder %d", nr); @@ -188,10 +179,20 @@ static void cylinder_widget(GtkWidget *box, int nr, GtkListStore *model) 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); + frame = gtk_frame_new("Description"); + gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, FALSE, 0); + + description = gtk_combo_box_entry_new_with_model(GTK_TREE_MODEL(model), 0); + gtk_container_add(GTK_CONTAINER(frame), description); + + cylinder_description = GTK_COMBO_BOX(description); + g_signal_connect(description, "changed", G_CALLBACK(cylinder_cb), description); + + size = create_spinbutton(hbox, "Size"); + cylinder_size = GTK_SPIN_BUTTON(size); - cylinder_description = size; + pressure = create_spinbutton(hbox, "Working Pressure"); + cylinder_pressure = GTK_SPIN_BUTTON(pressure); } static GtkListStore *create_tank_size_model(void) -- 2.45.2