X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;ds=sidebyside;f=equipment.c;h=54ac5e8da939347480c317e482956e5612e87d55;hb=d51f40bdcff32b1a5d5dedea054db8de06de5e07;hp=2bbd6511ecf647d9914dc67d69e07fc38d652a4a;hpb=3c7218287bf79ac808435efd627cc1b1e7bbca01;p=ext%2Fsubsurface.git diff --git a/equipment.c b/equipment.c index 2bbd651..54ac5e8 100644 --- a/equipment.c +++ b/equipment.c @@ -50,8 +50,6 @@ struct cylinder_widget { GtkWidget *o2, *gasmix_button; }; -static struct cylinder_widget gtk_cylinder[MAX_CYLINDERS]; - static int convert_pressure(int mbar, double *p) { int decimals = 1; @@ -219,6 +217,20 @@ static int cyl_nothing(cylinder_t *cyl) !cyl->end.mbar; } +static void set_one_cylinder(int index, cylinder_t *cyl, GtkListStore *model, GtkTreeIter *iter) +{ + gtk_list_store_set(model, iter, + CYL_INDEX, index, + CYL_DESC, cyl->type.description ? : "", + CYL_SIZE, cyl->type.size.mliter, + CYL_WORKP, cyl->type.workingpressure.mbar, + CYL_STARTP, cyl->start.mbar, + CYL_ENDP, cyl->end.mbar, + CYL_O2, cyl->gasmix.o2.permille, + CYL_HE, cyl->gasmix.he.permille, + -1); +} + void show_dive_equipment(struct dive *dive) { int i, max; @@ -245,16 +257,7 @@ void show_dive_equipment(struct dive *dive) cylinder_t *cyl = dive->cylinder+i; gtk_list_store_append(model, &iter); - gtk_list_store_set(model, &iter, - CYL_INDEX, i, - CYL_DESC, cyl->type.description ? : "", - CYL_SIZE, cyl->type.size.mliter, - CYL_WORKP, cyl->type.workingpressure.mbar, - CYL_STARTP, cyl->start.mbar, - CYL_ENDP, cyl->end.mbar, - CYL_O2, cyl->gasmix.o2.permille, - CYL_HE, cyl->gasmix.he.permille, - -1); + set_one_cylinder(i, cyl, model, &iter); } } @@ -330,30 +333,6 @@ void flush_dive_equipment_changes(struct dive *dive) /* We do nothing: we require the "Ok" button press */ } -static void apply_cb(GtkButton *button, gpointer data) -{ - int i; - struct dive *dive = current_dive; - - if (!dive) - return; - - for (i = 0; i < MAX_CYLINDERS; i++) - record_cylinder_changes(dive->cylinder+i, gtk_cylinder+i); - mark_divelist_changed(TRUE); - flush_divelist(dive); -} - -static void cancel_cb(GtkButton *button, gpointer data) -{ - struct dive *dive = current_dive; - - if (!dive) - return; - - show_dive_equipment(current_dive); -} - /* * We hardcode the most common standard cylinders, * we should pick up any other names from the dive @@ -470,11 +449,20 @@ static void cylinder_widget(GtkWidget *vbox, struct cylinder_widget *cylinder, G gtk_spin_button_set_range(GTK_SPIN_BUTTON(cylinder->o2), 21.0, 100.0); } -static void edit_cylinder_dialog(int index, GtkListStore *model, GtkTreeIter *iter) +static int edit_cylinder_dialog(int index, cylinder_t *cyl) { - int result; - struct cylinder_widget cyl; - GtkWidget *dialog, *frame, *vbox; + int success; + GtkWidget *dialog, *vbox; + struct cylinder_widget cylinder; + struct dive *dive; + + cylinder.index = index; + cylinder.changed = 0; + + dive = current_dive; + if (!dive) + return 0; + *cyl = dive->cylinder[index]; dialog = gtk_dialog_new_with_buttons("Cylinder", GTK_WINDOW(main_window), @@ -484,14 +472,22 @@ static void edit_cylinder_dialog(int index, GtkListStore *model, GtkTreeIter *it NULL); vbox = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); - cylinder_widget(vbox, &cyl, cylinder_model); + cylinder_widget(vbox, &cylinder, cylinder_model); + + show_cylinder(cyl, &cylinder); gtk_widget_show_all(dialog); - result = gtk_dialog_run(GTK_DIALOG(dialog)); - if (result == GTK_RESPONSE_ACCEPT) { - /* Save it */ + success = gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT; + if (success) { + record_cylinder_changes(cyl, &cylinder); + dive->cylinder[index] = *cyl; + mark_divelist_changed(TRUE); + flush_divelist(dive); } + gtk_widget_destroy(dialog); + + return success; } static void edit_cb(GtkButton *button, gpointer data) @@ -500,6 +496,7 @@ static void edit_cb(GtkButton *button, gpointer data) GtkTreeIter iter; GtkListStore *model = cylinder_list.model; GtkTreeSelection *selection; + cylinder_t cyl; selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(cylinder_list.tree_view)); @@ -508,7 +505,10 @@ static void edit_cb(GtkButton *button, gpointer data) return; gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, CYL_INDEX, &index, -1); - edit_cylinder_dialog(index, model, &iter); + if (!edit_cylinder_dialog(index, &cyl)) + return; + + set_one_cylinder(index, &cyl, model, &iter); } static void add_cb(GtkButton *button, gpointer data) @@ -517,24 +517,29 @@ static void add_cb(GtkButton *button, gpointer data) GtkTreeIter iter; GtkListStore *model = cylinder_list.model; GtkTreeSelection *selection; + cylinder_t cyl; + + if (!edit_cylinder_dialog(index, &cyl)) + return; gtk_list_store_append(model, &iter); - gtk_list_store_set(model, &iter, CYL_INDEX, index, -1); + set_one_cylinder(index, &cyl, model, &iter); selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(cylinder_list.tree_view)); gtk_tree_selection_select_iter(selection, &iter); - edit_cylinder_dialog(index, model, &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) { - int index; + int index, nr; GtkTreeIter iter; GtkListStore *model = cylinder_list.model; GtkTreeSelection *selection; + struct dive *dive; + cylinder_t *cyl; selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(cylinder_list.tree_view)); @@ -543,6 +548,13 @@ static void del_cb(GtkButton *button, gpointer data) return; gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, CYL_INDEX, &index, -1); + + dive = current_dive; + if (!dive) + return; + cyl = dive->cylinder + index; + nr = cylinder_list.max_index - index - 1; + if (gtk_list_store_remove(model, &iter)) { do { gtk_list_store_set(model, &iter, CYL_INDEX, index, -1); @@ -551,6 +563,12 @@ static void del_cb(GtkButton *button, gpointer data) } cylinder_list.max_index--; + memmove(cyl, cyl+1, nr*sizeof(*cyl)); + memset(cyl+nr, 0, sizeof(*cyl)); + + mark_divelist_changed(TRUE); + flush_divelist(dive); + gtk_widget_set_sensitive(cylinder_list.edit, 0); gtk_widget_set_sensitive(cylinder_list.del, 0); gtk_widget_set_sensitive(cylinder_list.add, 1);