]> git.tdb.fi Git - ext/subsurface.git/blobdiff - equipment.c
Add cylinder data to cylinder model as we record each dive
[ext/subsurface.git] / equipment.c
index 5ff8f0fe6d9bb56aa0bfb1fea3f4f43e33527f78..a360daeb41280f976d07c561fc4d8ada9e60be17 100644 (file)
@@ -19,7 +19,7 @@
 #include "display-gtk.h"
 #include "divelist.h"
 
-GtkListStore *cylinder_model;
+static GtkListStore *cylinder_model;
 
 enum {
        CYL_DESC,
@@ -87,13 +87,18 @@ static int convert_volume_pressure(int ml, int mbar, double *v, double *p)
        return decimals;
 }
 
-static void set_cylinder_spinbuttons(struct cylinder_widget *cylinder, int ml, int mbar, int start, int end)
+static void set_cylinder_type_spinbuttons(struct cylinder_widget *cylinder, int ml, int mbar)
 {
        double volume, pressure;
 
        convert_volume_pressure(ml, mbar, &volume, &pressure);
        gtk_spin_button_set_value(cylinder->size, volume);
        gtk_spin_button_set_value(cylinder->pressure, pressure);
+}
+
+static void set_cylinder_pressure_spinbuttons(struct cylinder_widget *cylinder, int start, int end)
+{
+       double pressure;
 
        convert_pressure(start, &pressure);
        gtk_spin_button_set_value(cylinder->start, pressure);
@@ -105,7 +110,7 @@ static void cylinder_cb(GtkComboBox *combo_box, gpointer data)
 {
        GtkTreeIter iter;
        GtkTreeModel *model = gtk_combo_box_get_model(combo_box);
-       int ml, mbar, start, end;
+       int ml, mbar;
        struct cylinder_widget *cylinder = data;
        cylinder_t *cyl = current_dive->cylinder + cylinder->index;
 
@@ -134,18 +139,17 @@ static void cylinder_cb(GtkComboBox *combo_box, gpointer data)
        gtk_tree_model_get(model, &iter,
                CYL_SIZE, &ml,
                CYL_WORKP, &mbar,
-               CYL_STARTP, &start,
-               CYL_ENDP, &end,
                -1);
 
-       set_cylinder_spinbuttons(cylinder, ml, mbar, start, end);
+       set_cylinder_type_spinbuttons(cylinder, ml, mbar);
 }
 
 /*
  * 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,
@@ -153,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)
@@ -205,8 +240,9 @@ static void show_cylinder(cylinder_t *cyl, struct cylinder_widget *cylinder)
        mbar = cyl->type.workingpressure.mbar;
        add_cylinder(cylinder, desc, ml, mbar);
 
-       set_cylinder_spinbuttons(cylinder,
-               cyl->type.size.mliter, cyl->type.workingpressure.mbar,
+       set_cylinder_type_spinbuttons(cylinder,
+               cyl->type.size.mliter, cyl->type.workingpressure.mbar);
+       set_cylinder_pressure_spinbuttons(cylinder,
                cyl->start.mbar, cyl->end.mbar);
        o2 = cyl->gasmix.o2.permille / 10.0;
        gtk_widget_set_sensitive(cylinder->o2, !!o2);