mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
More trip manipulations: remove selected dives from trip
There are a few obvious trip manipulations on multiple dives that haven't been implemented, yet. This commit handles the case when we have multiple dives selected and right click on one of them. It now removes all of those dives from their trips (instead of just the one that we clicked on). Still todo is the inverse operation. Select a group of consecutive dives and turn them into a trip. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
parent
b9d74580d0
commit
6d0af91398
1 changed files with 65 additions and 3 deletions
68
divelist.c
68
divelist.c
|
@ -1396,7 +1396,7 @@ static void insert_trip_before_cb(GtkWidget *menuitem, GtkTreePath *path)
|
|||
turn_dive_into_trip(path);
|
||||
}
|
||||
|
||||
static void remove_from_trip_cb(GtkWidget *menuitem, GtkTreePath *path)
|
||||
static void remove_from_trip(GtkTreePath *path)
|
||||
{
|
||||
GtkTreeIter iter, nextiter, *newiter, parent;
|
||||
GtkTreePath *nextpath;
|
||||
|
@ -1406,7 +1406,6 @@ static void remove_from_trip_cb(GtkWidget *menuitem, GtkTreePath *path)
|
|||
gtk_tree_model_get_iter(MODEL(dive_list), &iter, path);
|
||||
if (!gtk_tree_model_iter_parent(MODEL(dive_list), &parent, &iter))
|
||||
return;
|
||||
|
||||
/* if this isn't the last dive in a trip we simply split the trip
|
||||
in two right after this dive */
|
||||
nextpath = gtk_tree_path_copy(path);
|
||||
|
@ -1435,6 +1434,66 @@ static void remove_from_trip_cb(GtkWidget *menuitem, GtkTreePath *path)
|
|||
#endif
|
||||
}
|
||||
|
||||
static void remove_rowref_from_trip(gpointer data, gpointer user_data)
|
||||
{
|
||||
GtkTreeRowReference *rowref = data;
|
||||
GtkTreePath *path = gtk_tree_row_reference_get_path(rowref);
|
||||
if (path)
|
||||
remove_from_trip(path);
|
||||
}
|
||||
|
||||
static gboolean add_rowref_if_selected(GtkTreeModel *model, GtkTreePath *path,
|
||||
GtkTreeIter *iter, gpointer data)
|
||||
{
|
||||
GList **rowref_list = data;
|
||||
int idx;
|
||||
struct dive *dive;
|
||||
|
||||
gtk_tree_model_get(MODEL(dive_list), iter, DIVE_INDEX, &idx, -1);
|
||||
if (idx >=0 ) {
|
||||
dive = get_dive(idx);
|
||||
if (dive->selected) {
|
||||
/* we need to store the Row References as those
|
||||
stay valid across modifications of the model */
|
||||
GtkTreeRowReference *rowref;
|
||||
rowref = gtk_tree_row_reference_new(TREEMODEL(dive_list), path);
|
||||
*rowref_list = g_list_append(*rowref_list, rowref);
|
||||
}
|
||||
}
|
||||
return FALSE; /* continue foreach loop */
|
||||
}
|
||||
|
||||
static void remove_from_trip_cb(GtkWidget *menuitem, GtkTreePath *path)
|
||||
{
|
||||
GtkTreeIter iter, parent;
|
||||
struct dive *dive;
|
||||
int idx;
|
||||
|
||||
gtk_tree_model_get_iter(MODEL(dive_list), &iter, path);
|
||||
if (!gtk_tree_model_iter_parent(MODEL(dive_list), &parent, &iter))
|
||||
return;
|
||||
gtk_tree_model_get(MODEL(dive_list), &iter, DIVE_INDEX, &idx, -1);
|
||||
if (idx < 0 )
|
||||
return;
|
||||
dive = get_dive(idx);
|
||||
if (dive->selected) {
|
||||
/* remove all the selected dives
|
||||
since removing the dives from trips changes the model we need to
|
||||
take the extra step of acquiring rowrefs before actually moving dives */
|
||||
GList *rowref_list = NULL;
|
||||
gtk_tree_model_foreach(MODEL(dive_list), add_rowref_if_selected, &rowref_list);
|
||||
/* We need to walk that list backwards as otherwise
|
||||
the newly insered trips below dives that were
|
||||
removed also mess with the validity */
|
||||
rowref_list = g_list_reverse(rowref_list);
|
||||
g_list_foreach(rowref_list, remove_rowref_from_trip, NULL);
|
||||
|
||||
} else {
|
||||
/* just remove the dive the mouse pointer is on */
|
||||
remove_from_trip(path);
|
||||
}
|
||||
}
|
||||
|
||||
void remove_trip(GtkTreePath *trippath, gboolean force_no_trip)
|
||||
{
|
||||
GtkTreeIter newiter, parent, child, *lastiter = &parent;
|
||||
|
@ -1588,7 +1647,10 @@ static void popup_divelist_menu(GtkTreeView *tree_view, GtkTreeModel *model, int
|
|||
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
|
||||
}
|
||||
if (DIVE_IN_TRIP(dive)) {
|
||||
menuitem = gtk_menu_item_new_with_label("Remove from trip");
|
||||
if (dive->selected && amount_selected > 1)
|
||||
menuitem = gtk_menu_item_new_with_label("Remove selected dives from trip");
|
||||
else
|
||||
menuitem = gtk_menu_item_new_with_label("Remove dive from trip");
|
||||
g_signal_connect(menuitem, "activate", G_CALLBACK(remove_from_trip_cb), path);
|
||||
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue