aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--dive.c5
-rw-r--r--dive.h1
-rw-r--r--equipment.c62
3 files changed, 53 insertions, 15 deletions
diff --git a/dive.c b/dive.c
index 0341d0992..9edf36c91 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 f29712e2c..824063bb4 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 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)