diff options
Diffstat (limited to 'equipment.c')
-rw-r--r-- | equipment.c | 95 |
1 files changed, 58 insertions, 37 deletions
diff --git a/equipment.c b/equipment.c index 4bde92aef..151b1f9bd 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) |