From f9cb526c969488e6a12d7fe2baf4a71417521460 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Sat, 22 Oct 2011 18:12:30 +0300 Subject: [PATCH] Add cylinder data to cylinder model as we record each dive This way the cylinder model list will contain all the different cylinders that we have ever seen, rather than only containing the models that we have *edited*. That makes it much more practical to add new dives with the same cylinders that we've used before, because now those cylinders will show up as cylinder models even if we haven't looked and edited the old dives first. Signed-off-by: Linus Torvalds --- dive.c | 5 +++++ dive.h | 1 + equipment.c | 62 ++++++++++++++++++++++++++++++++++++++++------------- 3 files changed, 53 insertions(+), 15 deletions(-) diff --git a/dive.c b/dive.c index 0341d09..9edf36c 100644 --- a/dive.c +++ b/dive.c @@ -240,6 +240,11 @@ struct dive *fixup_dive(struct dive *dive) update_temperature(&dive->watertemp, mintemp); update_depth(&dive->maxdepth, maxdepth); + for (i = 0; i < MAX_CYLINDERS; i++) { + cylinder_type_t *type = &dive->cylinder[i].type; + add_cylinder_description(type); + } + return dive; } diff --git a/dive.h b/dive.h index f29712e..824063b 100644 --- a/dive.h +++ b/dive.h @@ -259,6 +259,7 @@ extern void run_ui(void); extern void report_error(GError* error); +extern void add_cylinder_description(cylinder_type_t *); extern void dive_list_update_dives(void); extern void flush_divelist(struct dive *dive); diff --git a/equipment.c b/equipment.c index 6900643..a360dae 100644 --- a/equipment.c +++ b/equipment.c @@ -19,7 +19,7 @@ #include "display-gtk.h" #include "divelist.h" -GtkListStore *cylinder_model; +static GtkListStore *cylinder_model; enum { CYL_DESC, @@ -148,7 +148,8 @@ static void cylinder_cb(GtkComboBox *combo_box, gpointer data) * The gtk_tree_model_foreach() interface is bad. It could have * returned whether the callback ever returned true */ -static int found_match = 0; +static GtkTreeIter *found_match = NULL; +static GtkTreeIter match_iter; static gboolean match_cylinder(GtkTreeModel *model, GtkTreePath *path, @@ -156,39 +157,70 @@ static gboolean match_cylinder(GtkTreeModel *model, gpointer data) { const char *name; - struct cylinder_widget *cylinder = data; + const char *desc = data; GValue value = {0, }; gtk_tree_model_get_value(model, iter, 0, &value); name = g_value_get_string(&value); - if (strcmp(cylinder->name, name)) + if (strcmp(desc, name)) return FALSE; - gtk_combo_box_set_active_iter(cylinder->description, iter); - found_match = 1; + match_iter = *iter; + found_match = &match_iter; return TRUE; } -static void add_cylinder(struct cylinder_widget *cylinder, const char *desc, int ml, int mbar) +static GtkTreeIter *add_cylinder_type(const char *desc, int ml, int mbar, GtkTreeIter *iter) { GtkTreeModel *model; - found_match = 0; - model = gtk_combo_box_get_model(cylinder->description); - cylinder->name = desc; - gtk_tree_model_foreach(model, match_cylinder, cylinder); + /* Don't even bother adding stuff without a size */ + if (!ml) + return NULL; + + found_match = NULL; + model = GTK_TREE_MODEL(cylinder_model); + gtk_tree_model_foreach(model, match_cylinder, (void *)desc); if (!found_match) { GtkListStore *store = GTK_LIST_STORE(model); - GtkTreeIter iter; - gtk_list_store_append(store, &iter); - gtk_list_store_set(store, &iter, + gtk_list_store_append(store, iter); + gtk_list_store_set(store, iter, 0, desc, 1, ml, 2, mbar, -1); - gtk_combo_box_set_active_iter(cylinder->description, &iter); + return iter; } + return found_match; +} + +/* + * When adding a dive, we'll add all the pre-existing cylinder + * information from that dive to our cylinder model. + */ +void add_cylinder_description(cylinder_type_t *type) +{ + GtkTreeIter iter; + const char *desc; + unsigned int size, workp; + + desc = type->description; + if (!desc) + return; + size = type->size.mliter; + workp = type->workingpressure.mbar; + add_cylinder_type(desc, size, workp, &iter); +} + +static void add_cylinder(struct cylinder_widget *cylinder, const char *desc, int ml, int mbar) +{ + GtkTreeIter iter, *match; + + cylinder->name = desc; + match = add_cylinder_type(desc, ml, mbar, &iter); + if (match) + gtk_combo_box_set_active_iter(cylinder->description, match); } static void show_cylinder(cylinder_t *cyl, struct cylinder_widget *cylinder) -- 2.45.2