changeset 2516:aab55aeb23e0

Fix #282: no support for multi-file actions in the sort bar https://github.com/BestImageViewer/geeqie/issues/282 Sort manager actions operate on file selections Original patch by Glenn Rolland
author Colin Clark <colin.clark@cclark.uk>
date Wed, 28 Jun 2017 16:57:11 +0100
parents 1011f7b73067
children 8057b4b9fe34
files src/bar_sort.c
diffstat 1 files changed, 89 insertions(+), 44 deletions(-) [+]
line wrap: on
line diff
--- a/src/bar_sort.c	Sun Jun 25 22:54:21 2017 +0100
+++ b/src/bar_sort.c	Wed Jun 28 16:57:11 2017 +0100
@@ -85,8 +85,8 @@
 	GtkWidget *undo_button;
 	SortActionType undo_action;
 	GList *undo_src_list;
-	gchar *undo_src;
-	gchar *undo_dest;
+	GList *undo_dest_list;
+	gchar *undo_collection;
 };
 
 
@@ -94,7 +94,7 @@
 #define SORT_KEY_COLLECTIONS "sort_manager_collections"
 
 
-static void bar_sort_undo_set(SortData *sd, GList *src_list, FileData *src, const gchar *dest);
+static void bar_sort_undo_set(SortData *sd, GList *src_list, const gchar *dest);
 static void bar_sort_add_close(SortData *sd);
 
 
@@ -165,7 +165,7 @@
 
 	bar_sort_add_close(sd);
 
-	bar_sort_undo_set(sd, NULL, NULL, NULL);
+	bar_sort_undo_set(sd, NULL, NULL);
 }
 
 static void bar_sort_mode_cb(GtkWidget *combo, gpointer data)
@@ -183,28 +183,42 @@
 }
 
 /* this takes control of src_list */
-static void bar_sort_undo_set(SortData *sd, GList *src_list, FileData *src, const gchar *dest)
+static void bar_sort_undo_set(SortData *sd, GList *src_list, const gchar *dest)
 {
 	string_list_free(sd->undo_src_list);
 	sd->undo_src_list = filelist_to_path_list(src_list);
 
-	g_free(sd->undo_src);
-	sd->undo_src = src ? g_strdup(src->path) : NULL;
-	g_free(sd->undo_dest);
-	sd->undo_dest = g_strdup(dest);
+	if (src_list)
+		{
+		/* we should create the undo_dest_list to use it later... */
+		string_list_free(sd->undo_dest_list);
+		sd->undo_dest_list=NULL;
+
+		GList *work = sd->undo_src_list;
+		while(work)
+			{
+			gchar *filename =  g_strdup(filename_from_path(work->data));
+			gchar *dest_path = g_build_filename(g_strdup(dest), filename, NULL);
+			sd->undo_dest_list = g_list_prepend(sd->undo_dest_list, g_strdup(dest_path));
+			work = work->next;
+			}
+		sd->undo_dest_list = g_list_reverse(sd->undo_dest_list);
+		}
 
 	sd->undo_action = sd->action;
 
 	if (sd->undo_button)
 		{
 		gtk_widget_set_sensitive(sd->undo_button,
-					 ((sd->undo_src_list || sd->undo_src) && sd->undo_dest) );
+					((sd->undo_src_list ) && sd->undo_dest_list));
 		}
 }
 
 static void bar_sort_undo_folder(SortData *sd, GtkWidget *button)
 {
-	if (!sd->undo_src || !sd->undo_dest) return;
+	gchar *origin;
+
+	if (!(sd->undo_src_list && sd->undo_dest_list)) return;
 
 	switch (sd->undo_action)
 		{
@@ -212,30 +226,57 @@
 			{
 			GList *list;
 			gchar *src_dir;
+			gchar *src_path;
 
-			list = g_list_append(NULL, file_data_new_group(sd->undo_dest));
-			src_dir = remove_level_from_path(sd->undo_src);
-			file_util_move_simple(list, src_dir, sd->lw->window);
-			g_free(src_dir);
+			if (sd->undo_src_list)
+				{
+				GList *work = NULL;
+
+				src_path = g_strdup(sd->undo_src_list->data);
+				src_dir = remove_level_from_path(src_path);
+				list = sd->undo_dest_list;
+				while (list)
+					{
+					work = g_list_prepend(work, file_data_new_group(list->data));
+					list=list->next;
+					}
+				file_util_move_simple(work, src_dir, sd->lw->window);
+				g_free(src_dir);
+				g_free(src_path);
+				}
 			}
 			break;
+
 		case BAR_SORT_COPY:
-			file_util_delete(file_data_new_group(sd->undo_dest), NULL, button);
+		case BAR_SORT_FILTER:
+			if (sd->undo_src_list)
+				{
+				GList *delete_list;
+				GList *work = NULL;
+
+				delete_list = sd->undo_dest_list;
+				while (delete_list)
+					{
+					work = g_list_append(work, file_data_new_group(delete_list->data));
+					delete_list = delete_list->next;
+					}
+				file_util_delete(NULL, work, button);
+				}
 			break;
+
 		default:
-			/* undo external command */
-			file_util_delete(file_data_new_group(sd->undo_dest), NULL, button);
 			break;
 		}
 
 	layout_refresh(sd->lw);
+	origin = (sd->undo_src_list)->data;
 
-	if (isfile(sd->undo_src))
+	if (isfile(origin))
 		{
-		layout_image_set_fd(sd->lw, file_data_new_group(sd->undo_src));
+		layout_image_set_fd(sd->lw, file_data_new_group(origin));
 		}
 
-	bar_sort_undo_set(sd, NULL, NULL, NULL);
+	bar_sort_undo_set(sd, NULL, NULL);
 }
 
 static void bar_sort_undo_collection(SortData *sd)
@@ -246,13 +287,12 @@
 	while (work)
 		{
 		gchar *source;
-
 		source = work->data;
 		work = work->next;
-		collect_manager_remove(file_data_new_group(source), sd->undo_dest);
+		collect_manager_remove(file_data_new_group(source), sd->undo_collection);
 		}
 
-	bar_sort_undo_set(sd, NULL, NULL, NULL);
+	bar_sort_undo_set(sd, NULL,  NULL);
 }
 
 static void bar_sort_undo_cb(GtkWidget *button, gpointer data)
@@ -271,38 +311,40 @@
 
 static void bar_sort_bookmark_select_folder(SortData *sd, FileData *source, const gchar *path)
 {
-	GList *list;
-	gchar *dest_path;
+	GList *orig_list;
+	GList *action_list;
+	GList *undo_src_list;
 
 	if (!isdir(path)) return;
 
-	dest_path = g_build_filename(path, source->name, NULL);
-	bar_sort_undo_set(sd, NULL, source, dest_path);
+	orig_list = layout_selection_list(sd->lw);
+	action_list = orig_list;
+	undo_src_list = orig_list;
+	orig_list = NULL;
 
-	list = g_list_append(NULL, file_data_ref(source));
+	bar_sort_undo_set(sd, undo_src_list, path);
 
 	switch (sd->action)
 		{
 		case BAR_SORT_COPY:
-			file_util_copy_simple(list, path, sd->lw->window);
-			list = NULL;
+			file_util_copy_simple(action_list, path, sd->lw->window);
+			action_list = NULL;
 			layout_image_next(sd->lw);
 			break;
+
 		case BAR_SORT_MOVE:
-			file_util_move_simple(list, path, sd->lw->window);
-			list = NULL;
+			file_util_move_simple(action_list, path, sd->lw->window);
+			action_list = NULL;
 			break;
+
 		case BAR_SORT_FILTER:
-			file_util_start_filter_from_filelist(sd->filter_key, list, path, sd->lw->window);
-			list = NULL;
+			file_util_start_filter_from_filelist(sd->filter_key, action_list, path, sd->lw->window);
 			layout_image_next(sd->lw);
 			break;
+
 		default:
 			break;
 		}
-
-	g_list_free(list);
-	g_free(dest_path);
 }
 
 static void bar_sort_bookmark_select_collection(SortData *sd, FileData *source, const gchar *path)
@@ -323,11 +365,12 @@
 
 	if (!list)
 		{
-		bar_sort_undo_set(sd, NULL, NULL, NULL);
+		bar_sort_undo_set(sd, NULL, NULL);
 		return;
 		}
 
-	bar_sort_undo_set(sd, list, NULL, path);
+	bar_sort_undo_set(sd, list, path);
+	sd->undo_collection = g_strdup(path);
 
 	while (list)
 		{
@@ -558,8 +601,9 @@
 	bar_sort_add_close(sd);
 
 	g_free(sd->filter_key);
-	g_free(sd->undo_src);
-	g_free(sd->undo_dest);
+	string_list_free(sd->undo_src_list);
+	string_list_free(sd->undo_dest_list);
+	g_free(sd->undo_collection);
 	g_free(sd);
 }
 
@@ -594,8 +638,9 @@
 		}
 
 	sd->selection = selection;
-	sd->undo_src = NULL;
-	sd->undo_dest = NULL;
+	sd->undo_src_list = NULL;
+	sd->undo_dest_list = NULL;
+	sd->undo_collection = NULL;
 
 	sd->vbox = gtk_vbox_new(FALSE, PREF_PAD_GAP);
 	g_object_set_data(G_OBJECT(sd->vbox), "bar_sort_data", sd);