X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=equipment.c;h=2b278934d559cba41c5ccd8eca9293fc18671423;hb=0f139718697035fa8e1b26f908403ad27bb36554;hp=c2d05d2ba4d2304595acd175d487a8a913e999d0;hpb=04b076cf40e0a4643493ee4671157ef4055f7fed;p=ext%2Fsubsurface.git diff --git a/equipment.c b/equipment.c index c2d05d2..2b27893 100644 --- a/equipment.c +++ b/equipment.c @@ -3,7 +3,6 @@ * controlled through the following interfaces: * * void show_dive_equipment(struct dive *dive) - * void flush_dive_equipment_changes(struct dive *dive) * * called from gtk-ui: * GtkWidget *equipment_widget(void) @@ -35,9 +34,7 @@ enum { static struct { int max_index; GtkListStore *model; - GtkWidget *tree_view; GtkWidget *edit, *add, *del; - GtkTreeViewColumn *desc, *size, *workp, *startp, *endp, *o2, *he; } cylinder_list; struct cylinder_widget { @@ -45,7 +42,8 @@ struct cylinder_widget { const char *name; GtkWidget *hbox; GtkComboBox *description; - GtkSpinButton *size, *pressure, *start, *end; + GtkSpinButton *size, *pressure; + GtkWidget *start, *end, *pressure_button; GtkWidget *o2, *gasmix_button; }; @@ -100,12 +98,25 @@ static void set_cylinder_type_spinbuttons(struct cylinder_widget *cylinder, int static void set_cylinder_pressure_spinbuttons(struct cylinder_widget *cylinder, cylinder_t *cyl) { + int set; + unsigned int start, end; double pressure; - convert_pressure(cyl->start.mbar, &pressure); - gtk_spin_button_set_value(cylinder->start, pressure); - convert_pressure(cyl->end.mbar, &pressure); - gtk_spin_button_set_value(cylinder->end, pressure); + start = cyl->start.mbar; + end = cyl->end.mbar; + set = start || end; + if (!set) { + start = cyl->sample_start.mbar; + end = cyl->sample_end.mbar; + } + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cylinder->pressure_button), set); + gtk_widget_set_sensitive(cylinder->start, set); + gtk_widget_set_sensitive(cylinder->end, set); + + convert_pressure(start, &pressure); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(cylinder->start), pressure); + convert_pressure(end, &pressure); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(cylinder->end), pressure); } /* @@ -402,19 +413,19 @@ static void record_cylinder_changes(cylinder_t *cyl, struct cylinder_widget *cyl desc = gtk_combo_box_get_active_text(box); volume = gtk_spin_button_get_value(cylinder->size); pressure = gtk_spin_button_get_value(cylinder->pressure); - start = gtk_spin_button_get_value(cylinder->start); - end = gtk_spin_button_get_value(cylinder->end); - o2 = gtk_spin_button_get_value(GTK_SPIN_BUTTON(cylinder->o2))*10 + 0.5; - if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cylinder->gasmix_button))) + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cylinder->pressure_button))) { + start = gtk_spin_button_get_value(GTK_SPIN_BUTTON(cylinder->start)); + end = gtk_spin_button_get_value(GTK_SPIN_BUTTON(cylinder->end)); + } else { + start = end = 0; + } + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cylinder->gasmix_button))) + o2 = gtk_spin_button_get_value(GTK_SPIN_BUTTON(cylinder->o2))*10 + 0.5; + else o2 = 0; fill_cylinder_info(cylinder, cyl, desc, volume, pressure, start, end, o2); } -void flush_dive_equipment_changes(struct dive *dive) -{ - /* We do nothing: we require the "Ok" button press */ -} - /* * We hardcode the most common standard cylinders, * we should pick up any other names from the dive @@ -495,6 +506,16 @@ static void nitrox_cb(GtkToggleButton *button, gpointer data) gtk_widget_set_sensitive(cylinder->o2, state); } +static void pressure_cb(GtkToggleButton *button, gpointer data) +{ + struct cylinder_widget *cylinder = data; + int state; + + state = gtk_toggle_button_get_active(button); + gtk_widget_set_sensitive(cylinder->start, state); + gtk_widget_set_sensitive(cylinder->end, state); +} + static gboolean completion_cb(GtkEntryCompletion *widget, GtkTreeModel *model, GtkTreeIter *iter, struct cylinder_widget *cylinder) { const char *desc; @@ -558,11 +579,15 @@ static void cylinder_widget(GtkWidget *vbox, struct cylinder_widget *cylinder, G hbox = gtk_hbox_new(FALSE, 3); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0); + cylinder->pressure_button = gtk_check_button_new(); + gtk_box_pack_start(GTK_BOX(hbox), cylinder->pressure_button, FALSE, FALSE, 3); + g_signal_connect(cylinder->pressure_button, "toggled", G_CALLBACK(pressure_cb), cylinder); + widget = create_spinbutton(hbox, "Start Pressure", 0, 5000, 1); - cylinder->start = GTK_SPIN_BUTTON(widget); + cylinder->start = widget; widget = create_spinbutton(hbox, "End Pressure", 0, 5000, 1); - cylinder->end = GTK_SPIN_BUTTON(widget); + cylinder->end = widget; /* * Cylinder gas mix: Air, Nitrox or Trimix @@ -613,6 +638,7 @@ static int edit_cylinder_dialog(int index, cylinder_t *cyl) record_cylinder_changes(cyl, &cylinder); dive->cylinder[index] = *cyl; mark_divelist_changed(TRUE); + update_cylinder_related_info(dive); flush_divelist(dive); } @@ -633,7 +659,7 @@ static int get_model_index(GtkListStore *model, GtkTreeIter *iter) return index; } -static void edit_cb(GtkButton *button, gpointer data) +static void edit_cb(GtkButton *button, GtkTreeView *tree_view) { int index; GtkTreeIter iter; @@ -641,7 +667,7 @@ static void edit_cb(GtkButton *button, gpointer data) GtkTreeSelection *selection; cylinder_t cyl; - selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(cylinder_list.tree_view)); + selection = gtk_tree_view_get_selection(tree_view); /* Nothing selected? This shouldn't happen, since the button should be inactive */ if (!gtk_tree_selection_get_selected(selection, NULL, &iter)) @@ -655,7 +681,7 @@ static void edit_cb(GtkButton *button, gpointer data) repaint_dive(); } -static void add_cb(GtkButton *button, gpointer data) +static void add_cb(GtkButton *button, GtkTreeView *tree_view) { int index = cylinder_list.max_index; GtkTreeIter iter; @@ -669,14 +695,14 @@ static void add_cb(GtkButton *button, gpointer data) gtk_list_store_append(model, &iter); set_one_cylinder(index, &cyl, model, &iter); - selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(cylinder_list.tree_view)); + selection = gtk_tree_view_get_selection(tree_view); gtk_tree_selection_select_iter(selection, &iter); cylinder_list.max_index++; gtk_widget_set_sensitive(cylinder_list.add, cylinder_list.max_index < MAX_CYLINDERS); } -static void del_cb(GtkButton *button, gpointer data) +static void del_cb(GtkButton *button, GtkTreeView *tree_view) { int index, nr; GtkTreeIter iter; @@ -685,7 +711,7 @@ static void del_cb(GtkButton *button, gpointer data) struct dive *dive; cylinder_t *cyl; - selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(cylinder_list.tree_view)); + selection = gtk_tree_view_get_selection(tree_view); /* Nothing selected? This shouldn't happen, since the button should be inactive */ if (!gtk_tree_selection_get_selected(selection, NULL, &iter)) @@ -799,26 +825,18 @@ static void row_activated_cb(GtkTreeView *tree_view, GtkTreeViewColumn *column, GtkTreeModel *model) { - edit_cb(NULL, NULL); + edit_cb(NULL, tree_view); } -static GtkWidget *cylinder_list_create(void) +GtkWidget *cylinder_list_widget(void) { + GtkListStore *model = cylinder_list.model; GtkWidget *tree_view; GtkTreeSelection *selection; - GtkListStore *model; - model = gtk_list_store_new(CYL_COLUMNS, - G_TYPE_STRING, /* CYL_DESC: utf8 */ - G_TYPE_INT, /* CYL_SIZE: mliter */ - G_TYPE_INT, /* CYL_WORKP: mbar */ - G_TYPE_INT, /* CYL_STARTP: mbar */ - G_TYPE_INT, /* CYL_ENDP: mbar */ - G_TYPE_INT, /* CYL_O2: permille */ - G_TYPE_INT /* CYL_HE: permille */ - ); - cylinder_list.model = model; tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model)); + gtk_widget_set_can_focus(tree_view, FALSE); + g_signal_connect(tree_view, "row-activated", G_CALLBACK(row_activated_cb), model); selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view)); @@ -829,19 +847,36 @@ static GtkWidget *cylinder_list_create(void) "enable-grid-lines", GTK_TREE_VIEW_GRID_LINES_BOTH, NULL); - cylinder_list.desc = tree_view_column(tree_view, CYL_DESC, "Type", NULL, PANGO_ALIGN_LEFT, TRUE); - cylinder_list.size = tree_view_column(tree_view, CYL_SIZE, "Size", size_data_func, PANGO_ALIGN_RIGHT, TRUE); - cylinder_list.workp = tree_view_column(tree_view, CYL_WORKP, "MaxPress", pressure_data_func, PANGO_ALIGN_RIGHT, TRUE); - cylinder_list.startp = tree_view_column(tree_view, CYL_STARTP, "Start", pressure_data_func, PANGO_ALIGN_RIGHT, TRUE); - cylinder_list.endp = tree_view_column(tree_view, CYL_ENDP, "End", pressure_data_func, PANGO_ALIGN_RIGHT, TRUE); - cylinder_list.o2 = tree_view_column(tree_view, CYL_O2, "O" UTF8_SUBSCRIPT_2 "%", percentage_data_func, PANGO_ALIGN_RIGHT, TRUE); - cylinder_list.he = tree_view_column(tree_view, CYL_HE, "He%", percentage_data_func, PANGO_ALIGN_RIGHT, TRUE); + tree_view_column(tree_view, CYL_DESC, "Type", NULL, PANGO_ALIGN_LEFT, TRUE); + tree_view_column(tree_view, CYL_SIZE, "Size", size_data_func, PANGO_ALIGN_RIGHT, TRUE); + tree_view_column(tree_view, CYL_WORKP, "MaxPress", pressure_data_func, PANGO_ALIGN_RIGHT, TRUE); + tree_view_column(tree_view, CYL_STARTP, "Start", pressure_data_func, PANGO_ALIGN_RIGHT, TRUE); + tree_view_column(tree_view, CYL_ENDP, "End", pressure_data_func, PANGO_ALIGN_RIGHT, TRUE); + tree_view_column(tree_view, CYL_O2, "O" UTF8_SUBSCRIPT_2 "%", percentage_data_func, PANGO_ALIGN_RIGHT, TRUE); + tree_view_column(tree_view, CYL_HE, "He%", percentage_data_func, PANGO_ALIGN_RIGHT, TRUE); return tree_view; } +static GtkWidget *cylinder_list_create(void) +{ + GtkListStore *model; + + model = gtk_list_store_new(CYL_COLUMNS, + G_TYPE_STRING, /* CYL_DESC: utf8 */ + G_TYPE_INT, /* CYL_SIZE: mliter */ + G_TYPE_INT, /* CYL_WORKP: mbar */ + G_TYPE_INT, /* CYL_STARTP: mbar */ + G_TYPE_INT, /* CYL_ENDP: mbar */ + G_TYPE_INT, /* CYL_O2: permille */ + G_TYPE_INT /* CYL_HE: permille */ + ); + cylinder_list.model = model; + return cylinder_list_widget(); +} + GtkWidget *equipment_widget(void) { - GtkWidget *vbox, *hbox, *frame, *framebox; + GtkWidget *vbox, *hbox, *frame, *framebox, *tree_view; GtkWidget *add, *del, *edit; vbox = gtk_vbox_new(FALSE, 3); @@ -855,7 +890,7 @@ GtkWidget *equipment_widget(void) */ cylinder_model = create_tank_size_model(); - cylinder_list.tree_view = cylinder_list_create(); + tree_view = cylinder_list_create(); hbox = gtk_hbox_new(FALSE, 3); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 3); @@ -869,7 +904,7 @@ GtkWidget *equipment_widget(void) hbox = gtk_hbox_new(FALSE, 3); gtk_box_pack_start(GTK_BOX(framebox), hbox, TRUE, FALSE, 3); - gtk_box_pack_start(GTK_BOX(hbox), cylinder_list.tree_view, TRUE, FALSE, 3); + gtk_box_pack_start(GTK_BOX(hbox), tree_view, TRUE, FALSE, 3); hbox = gtk_hbox_new(TRUE, 3); gtk_box_pack_start(GTK_BOX(framebox), hbox, TRUE, FALSE, 3); @@ -885,9 +920,9 @@ GtkWidget *equipment_widget(void) cylinder_list.add = add; cylinder_list.del = del; - g_signal_connect(edit, "clicked", G_CALLBACK(edit_cb), NULL); - g_signal_connect(add, "clicked", G_CALLBACK(add_cb), NULL); - g_signal_connect(del, "clicked", G_CALLBACK(del_cb), NULL); + g_signal_connect(edit, "clicked", G_CALLBACK(edit_cb), tree_view); + g_signal_connect(add, "clicked", G_CALLBACK(add_cb), tree_view); + g_signal_connect(del, "clicked", G_CALLBACK(del_cb), tree_view); return vbox; }