X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=equipment.c;h=43bb29d593ae6009d81db0e291adf60af2f26a1c;hb=ed1ce8ebc8590533291a9c5d6460f8d1c9f857dd;hp=ccfeb1270c7bb42883acca8e13558ea3f65024c4;hpb=621761233b2e1b139c07987b562ef2aa299ff35e;p=ext%2Fsubsurface.git diff --git a/equipment.c b/equipment.c index ccfeb12..43bb29d 100644 --- a/equipment.c +++ b/equipment.c @@ -309,13 +309,15 @@ static GtkTreeIter *add_weightsystem_type(const char *desc, int weight, GtkTreeI model = GTK_TREE_MODEL(weightsystem_model); gtk_tree_model_foreach(model, match_desc, (void *)desc); - if (!found_match) { - GtkListStore *store = GTK_LIST_STORE(model); - - gtk_list_store_append(store, iter); - gtk_list_store_set(store, iter, - 0, desc, - 1, weight, + if (found_match) { + gtk_list_store_set(GTK_LIST_STORE(model), found_match, + WS_WEIGHT, weight, + -1); + } else if (desc && desc[0]) { + gtk_list_store_append(GTK_LIST_STORE(model), iter); + gtk_list_store_set(GTK_LIST_STORE(model), iter, + WS_DESC, desc, + WS_WEIGHT, weight, -1); return iter; } @@ -426,7 +428,7 @@ static void show_weightsystem(weightsystem_t *ws, struct ws_widget *weightsystem set_weight_weight_spinbutton(weightsystem_widget, ws->weight.grams); } -int cylinder_none(void *_data) +gboolean cylinder_none(void *_data) { cylinder_t *cyl = _data; return !cyl->type.size.mliter && @@ -440,12 +442,77 @@ int cylinder_none(void *_data) !cyl->end.mbar; } -int weightsystem_none(void *_data) +gboolean no_cylinders(cylinder_t *cyl) +{ + int i; + + for (i = 0; i < MAX_CYLINDERS; i++) + if (!cylinder_none(cyl + i)) + return FALSE; + return TRUE; +} + +/* descriptions are equal if they are both NULL or both non-NULL + and the same text */ +gboolean description_equal(const char *desc1, const char *desc2) +{ + return ((! desc1 && ! desc2) || + (desc1 && desc2 && strcmp(desc1, desc2) == 0)); +} + +/* when checking for the same cylinder we want the size and description to match + but don't compare the start and end pressures */ +static gboolean one_cylinder_equal(cylinder_t *cyl1, cylinder_t *cyl2) +{ + return cyl1->type.size.mliter == cyl2->type.size.mliter && + cyl1->type.workingpressure.mbar == cyl2->type.workingpressure.mbar && + cyl1->gasmix.o2.permille == cyl2->gasmix.o2.permille && + cyl1->gasmix.he.permille == cyl2->gasmix.he.permille && + description_equal(cyl1->type.description, cyl2->type.description); +} + +gboolean cylinders_equal(cylinder_t *cyl1, cylinder_t *cyl2) +{ + int i; + + for (i = 0; i < MAX_CYLINDERS; i++) + if (!one_cylinder_equal(cyl1 + i, cyl2 + i)) + return FALSE; + return TRUE; +} + +static gboolean weightsystem_none(void *_data) { weightsystem_t *ws = _data; return !ws->weight.grams && !ws->description; } +gboolean no_weightsystems(weightsystem_t *ws) +{ + int i; + + for (i = 0; i < MAX_WEIGHTSYSTEMS; i++) + if (!weightsystem_none(ws + i)) + return FALSE; + return TRUE; +} + +static gboolean one_weightsystem_equal(weightsystem_t *ws1, weightsystem_t *ws2) +{ + return ws1->weight.grams == ws2->weight.grams && + description_equal(ws1->description, ws2->description); +} + +gboolean weightsystems_equal(weightsystem_t *ws1, weightsystem_t *ws2) +{ + int i; + + for (i = 0; i < MAX_WEIGHTSYSTEMS; i++) + if (!one_weightsystem_equal(ws1 + i, ws2 + i)) + return FALSE; + return TRUE; +} + static void set_one_cylinder(void *_data, GtkListStore *model, GtkTreeIter *iter) { cylinder_t *cyl = _data; @@ -491,7 +558,7 @@ static void *ws_ptr(struct dive *dive, int idx) static void show_equipment(struct dive *dive, int max, struct equipment_list *equipment_list, void*(*ptr_function)(struct dive*, int), - int(*none_function)(void *), + gboolean(*none_function)(void *), void(*set_one_function)(void*, GtkListStore*, GtkTreeIter *)) { int i, used; @@ -624,6 +691,7 @@ static void record_weightsystem_changes(weightsystem_t *ws, struct ws_widget *we GtkComboBox *box; int grams; double value; + GtkTreeIter iter; /* Ignore uninitialized cylinder widgets */ box = weightsystem_widget->description; @@ -639,6 +707,7 @@ static void record_weightsystem_changes(weightsystem_t *ws, struct ws_widget *we grams = value * 1000; ws->weight.grams = grams; ws->description = desc; + add_weightsystem_type(desc, grams, &iter); } /* @@ -745,8 +814,6 @@ static struct ws_info { const char *name; int grams; } ws_info[100] = { - /* Need an empty entry for the no weight system case */ - { "", }, { "integrated", 0 }, { "belt", 0 }, { "ankle", 0 }, @@ -1395,7 +1462,7 @@ GtkWidget *weightsystem_list_widget(int w_idx) tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model)); gtk_widget_set_can_focus(tree_view, FALSE); - g_signal_connect(tree_view, "row-activated", G_CALLBACK(ws_row_activated_cb), model); + g_signal_connect(tree_view, "row-activated", G_CALLBACK(ws_row_activated_cb), GINT_TO_POINTER(w_idx)); selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view)); gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_BROWSE);