summaryrefslogtreecommitdiffstats
path: root/divelist.c
diff options
context:
space:
mode:
authorGravatar Lubomir I. Ivanov <neolit123@gmail.com>2012-09-23 01:03:19 +0300
committerGravatar Lubomir I. Ivanov <neolit123@gmail.com>2012-09-23 01:18:25 +0300
commit4d9abf6e8ee465728d1ff1308e18265557dbca42 (patch)
treebfa699979cc974212977a2cc943d5e8a7318be16 /divelist.c
parent6458057599e6b80a8a04a29d2aa975347f69ff8c (diff)
downloadsubsurface-4d9abf6e8ee465728d1ff1308e18265557dbca42.tar.gz
Added the functionality to delete selected (multiple) dives
Moved portion of the code from delete_dive_cb() to a function called delete_single_dive(), that directly accepts a GtkTreeIter pointer. Added the function delete_selected_dives_cb(), which is called when calling "Delete dives" from the combo box for the selected dives. The above function iterates trought the selection calling delete_selected_foreach(), which on its own calls delete_single_dive(). The "for-each" API in this case looks much prettier C code wise, however we do potentially create an extra jump and also do not have anything but the redirection: delete_selected_foreach() -> delete_single_dive() Probably slighly slower than using gtk_tree_selection_get_selected_rows(), performance wise, but less C code. Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
Diffstat (limited to 'divelist.c')
-rw-r--r--divelist.c52
1 files changed, 42 insertions, 10 deletions
diff --git a/divelist.c b/divelist.c
index a62f259d5..b9fe927d6 100644
--- a/divelist.c
+++ b/divelist.c
@@ -1842,19 +1842,15 @@ void merge_trips_cb(GtkWidget *menuitem, GtkTreePath *trippath)
mark_divelist_changed(TRUE);
}
-/* this gets called with path pointing to a dive, either in the top level
- * or as part of a trip */
-static void delete_dive_cb(GtkWidget *menuitem, GtkTreePath *path)
+/* delete a dive by passing a tree iterator */
+static void delete_single_dive(GtkTreeIter *iter)
{
- GtkTreeIter iter;
- int idx, i;
+ int i, idx;
struct dive *dive, *pdive, *ndive;
- GtkTreeView *tree_view = GTK_TREE_VIEW(dive_list.tree_view);
- GtkTreeSelection *selection = gtk_tree_view_get_selection(tree_view);
- gtk_tree_model_get_iter(MODEL(dive_list), &iter, path);
- gtk_tree_model_get(MODEL(dive_list), &iter, DIVE_INDEX, &idx, -1);
+ gtk_tree_model_get(MODEL(dive_list), iter, DIVE_INDEX, &idx, -1);
dive = get_dive(idx);
+
if (dive->divetrip) {
/* we could be displaying the list model, in which case we can't find out
* if this is part of a trip and the only dive in that trip from the model,
@@ -1879,6 +1875,42 @@ static void delete_dive_cb(GtkWidget *menuitem, GtkTreePath *path)
if (dive->selected)
amount_selected--;
free(dive);
+}
+
+/* much simpler to use compared to gtk_tree_selection_get_selected_rows() */
+static void delete_selected_foreach(GtkTreeModel *model, GtkTreePath *path,
+ GtkTreeIter *iter, gpointer userdata)
+{
+ delete_single_dive(iter);
+}
+
+/* called when multiple dives are selected and one of these is right-clicked for delete */
+static void delete_selected_dives_cb(GtkWidget *menuitem, GtkTreePath *path)
+{
+ GtkTreeView *tree_view = GTK_TREE_VIEW(dive_list.tree_view);
+ GtkTreeSelection *selection = gtk_tree_view_get_selection(tree_view);
+ gtk_tree_selection_selected_foreach(selection, delete_selected_foreach, NULL);
+
+ dive_list_update_dives();
+ mark_divelist_changed(TRUE);
+}
+
+/* this gets called with path pointing to a dive, either in the top level
+ * or as part of a trip */
+static void delete_dive_cb(GtkWidget *menuitem, GtkTreePath *path)
+{
+ GtkTreeIter iter;
+ int i, idx;
+ struct dive *dive;
+ GtkTreeView *tree_view = GTK_TREE_VIEW(dive_list.tree_view);
+ GtkTreeSelection *selection = gtk_tree_view_get_selection(tree_view);
+
+ gtk_tree_model_get_iter(MODEL(dive_list), &iter, path);
+ delete_single_dive(&iter);
+
+ gtk_tree_model_get(MODEL(dive_list), &iter, DIVE_INDEX, &idx, -1);
+ dive = get_dive(idx);
+
/* now make sure the correct dive list is displayed, the same
* dives stay selected and if necessary their trips are
* expanded. If no selected dives are left then fill_dive_list()
@@ -1955,7 +1987,7 @@ static void popup_divelist_menu(GtkTreeView *tree_view, GtkTreeModel *model, int
editlabel[strlen(editlabel) - 1] = '\0';
}
menuitem = gtk_menu_item_new_with_label(deletelabel);
- g_signal_connect(menuitem, "activate", G_CALLBACK(NULL), path);
+ g_signal_connect(menuitem, "activate", G_CALLBACK(delete_selected_dives_cb), path);
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
menuitem = gtk_menu_item_new_with_label(editlabel);