From e48cebc2d8e3acdfaf64512259fa582245265799 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Sat, 10 Sep 2011 11:09:39 -0700 Subject: [PATCH] Actually connect the cylinder configuration with the dive It seems to be sufficiently useful to be worth updating the dive information now. This still doesn't handle multiple cylinders in any way. I need to think about the interface for that. Signed-off-by: Linus Torvalds --- equipment.c | 95 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 58 insertions(+), 37 deletions(-) diff --git a/equipment.c b/equipment.c index 4bde92a..151b1f9 100644 --- a/equipment.c +++ b/equipment.c @@ -10,7 +10,7 @@ static int cylinder_changed; static GtkComboBox *cylinder_description; -static GtkSpinButton *cylinder_size, *cylinder_pressure; +static GtkSpinButton *cylinder_size, *cylinder_pressure, *nitrox_value; static void cylinder_cb(GtkComboBox *combo_box, gpointer data) { @@ -18,10 +18,29 @@ static void cylinder_cb(GtkComboBox *combo_box, gpointer data) GtkTreeModel *model = gtk_combo_box_get_model(combo_box); GValue value1 = {0, }, value2 = {0,}; int volume, pressure; + cylinder_t *cyl = current_dive->cylinder + 0; - cylinder_changed = 1; - if (!gtk_combo_box_get_active_iter(combo_box, &iter)) + /* Did the user set it to some non-standard value? */ + if (!gtk_combo_box_get_active_iter(combo_box, &iter)) { + cylinder_changed = 1; return; + } + + /* + * We get "change" signal callbacks just because we set + * the description by hand. Whatever. So ignore them if + * they are no-ops. + */ + if (!cylinder_changed && cyl->type.description) { + int same; + char *desc = gtk_combo_box_get_active_text(combo_box); + + same = !strcmp(desc, cyl->type.description); + g_free(desc); + if (same) + return; + } + cylinder_changed = 1; gtk_tree_model_get_value(model, &iter, 1, &value1); volume = g_value_get_int(&value1); @@ -53,66 +72,64 @@ static gboolean match_cylinder(GtkTreeModel *model, void show_dive_equipment(struct dive *dive) { - cylinder_type_t *type = &dive->cylinder[0].type; - const char *desc = type->description; + cylinder_t *cyl = &dive->cylinder[0]; + const char *desc = cyl->type.description; GtkTreeModel *model = gtk_combo_box_get_model(cylinder_description); + double o2; if (desc) gtk_tree_model_foreach(model, match_cylinder, (gpointer)desc); gtk_spin_button_set_value(cylinder_size, - type->size.mliter / 1000.0); + cyl->type.size.mliter / 1000.0); gtk_spin_button_set_value(cylinder_pressure, - type->workingpressure.mbar / 1000.0); + cyl->type.workingpressure.mbar / 1000.0); + o2 = cyl->gasmix.o2.permille / 10.0; + if (!o2) + o2 = 21.0; + gtk_spin_button_set_value(nitrox_value, o2); } -static GtkWidget *create_spinbutton(GtkWidget *vbox, const char *name) +static GtkWidget *create_spinbutton(GtkWidget *vbox, const char *name, double min, double max, double incr) { GtkWidget *frame, *button; frame = gtk_frame_new(name); gtk_container_add(GTK_CONTAINER(vbox), frame); - button = gtk_spin_button_new_with_range( 0.0, 3500.0, 0.1); + button = gtk_spin_button_new_with_range(min, max, incr); gtk_container_add(GTK_CONTAINER(frame), button); + gtk_spin_button_set_update_policy(GTK_SPIN_BUTTON(button), GTK_UPDATE_IF_VALID); + return button; } -static void fill_cylinder_info(cylinder_t *cyl, const char *desc, int mliter, int mbar) +static void fill_cylinder_info(cylinder_t *cyl, const char *desc, int mliter, int mbar, int o2) { - /* - * 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 + if (o2 < 211) + o2 = 0; cyl->type.description = desc; cyl->type.size.mliter = mliter; cyl->type.workingpressure.mbar = mbar; -#endif + cyl->gasmix.o2.permille = o2; } static void record_cylinder_changes(struct dive *dive) { const gchar *desc; GtkComboBox *box = cylinder_description; - gdouble volume, pressure; + int volume, pressure, o2; desc = gtk_combo_box_get_active_text(box); - volume = gtk_spin_button_get_value(cylinder_size); - pressure = gtk_spin_button_get_value(cylinder_pressure); - - fill_cylinder_info(dive->cylinder+0, - desc, volume * 1000, pressure * 1000); + volume = gtk_spin_button_get_value(cylinder_size) * 1000 + 0.5; + pressure = gtk_spin_button_get_value(cylinder_pressure) * 1000 + 0.5; + o2 = gtk_spin_button_get_value(nitrox_value)*10 + 0.5; + fill_cylinder_info(dive->cylinder+0, desc, volume, pressure, o2); } void flush_dive_equipment_changes(struct dive *dive) { - if (cylinder_changed) { - cylinder_changed = 0; - record_cylinder_changes(dive); - } + record_cylinder_changes(dive); } /* We should take these from the dive list instead */ @@ -169,7 +186,7 @@ static void fill_tank_list(GtkListStore *store) static void cylinder_widget(GtkWidget *box, int nr, GtkListStore *model) { GtkWidget *frame, *hbox; - GtkWidget *description, *size, *pressure; + GtkWidget *widget; char buffer[80]; snprintf(buffer, sizeof(buffer), "Cylinder %d", nr); @@ -182,17 +199,21 @@ static void cylinder_widget(GtkWidget *box, int nr, GtkListStore *model) 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); + widget = gtk_combo_box_entry_new_with_model(GTK_TREE_MODEL(model), 0); + gtk_container_add(GTK_CONTAINER(frame), widget); + + cylinder_description = GTK_COMBO_BOX(widget); + g_signal_connect(widget, "changed", G_CALLBACK(cylinder_cb), NULL); - cylinder_description = GTK_COMBO_BOX(description); - g_signal_connect(description, "changed", G_CALLBACK(cylinder_cb), description); + widget = create_spinbutton(hbox, "Size", 0, 200, 0.1); + cylinder_size = GTK_SPIN_BUTTON(widget); - size = create_spinbutton(hbox, "Size"); - cylinder_size = GTK_SPIN_BUTTON(size); + widget = create_spinbutton(hbox, "Working Pressure", 0, 5000, 1); + cylinder_pressure = GTK_SPIN_BUTTON(widget); - pressure = create_spinbutton(hbox, "Working Pressure"); - cylinder_pressure = GTK_SPIN_BUTTON(pressure); + widget = create_spinbutton(hbox, "Nitrox", 21, 100, 0.1); + nitrox_value = GTK_SPIN_BUTTON(widget); + gtk_spin_button_set_range(nitrox_value, 21.0, 100.0); } static GtkListStore *create_tank_size_model(void) -- 2.43.0