]> git.tdb.fi Git - ext/subsurface.git/commitdiff
Add cylinder data to cylinder model as we record each dive
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 22 Oct 2011 15:12:30 +0000 (18:12 +0300)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 22 Oct 2011 15:12:30 +0000 (18:12 +0300)
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>
dive.c
dive.h
equipment.c

diff --git a/dive.c b/dive.c
index 0341d09928cd4ef9ad9a974858a17c037db55a4c..9edf36c9183998d9eef986598ec6bb5fa845cfd8 100644 (file)
--- 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 f29712e2c382e437e66db5a7cc2e460e992bc482..824063bb4f0f20bec24ea6d002eb2cc2cf717e89 100644 (file)
--- 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);
 
index 69006439084b1ee905c27f522dba9bb8222ffa5c..a360daeb41280f976d07c561fc4d8ada9e60be17 100644 (file)
@@ -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)