diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-10-22 18:12:30 +0300 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-10-22 18:12:30 +0300 |
commit | f9cb526c969488e6a12d7fe2baf4a71417521460 (patch) | |
tree | 42d039682aebde284b602bb4d9dbc9990250ac41 /equipment.c | |
parent | 567c945714e0f627b8b7fe638d925b91b8397a9a (diff) | |
download | subsurface-f9cb526c969488e6a12d7fe2baf4a71417521460.tar.gz |
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 <torvalds@linux-foundation.org>
Diffstat (limited to 'equipment.c')
-rw-r--r-- | equipment.c | 62 |
1 files changed, 47 insertions, 15 deletions
diff --git a/equipment.c b/equipment.c index 690064390..a360daeb4 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) |