Hi
File copy and file move operations in GQview showed a thumbnail of a
target file if there was going to be a conflict during the operation. I
found this very useful.
I have attached a patch to utilops.c that shows thumbnails when there is
a conflict, and also allows files to be renamed during the operation.
This seems to be ok for copy, but not for move. The problem is in
generic_dialog_image_set where I try to create a FileData structure to
an existing target file. A hit in file_data_planned_change_hash in
file_data_new results in the FileData structure of the source file being
modified and returned.
I was unable to find function that uses that piece of code, and the
second patch I have attached comments it out. After applying that patch
the move operation then seems to be ok.
I would greatly appreciate it if someone could let me know :-
what is the section of code at line 405 in filedata.c used for?
and, if it used,
how should I create a FileData structure to an existing file during a
move operation?
Thanks
Colin Clark
diff --git a/src/utilops.c b/src/utilops.c
index e32a18d..0ae0f7a 100644
--- a/src/utilops.c
+++ b/src/utilops.c
@@ -49,6 +49,7 @@ static GdkPixbuf *file_util_get_error_icon(FileData *fd, GtkWidget *widget);
static void generic_dialog_add_image(GenericDialog *gd, GtkWidget *box,
FileData *fd1, const gchar *header1,
+ gboolean second_image,
FileData *fd2, const gchar *header2,
gboolean show_filename)
{
@@ -59,7 +60,7 @@ static void generic_dialog_add_image(GenericDialog *gd, GtkWidget *box,
if (!box) box = gd->vbox;
- if (fd2)
+ if (second_image)
{
hbox = pref_box_new(box, TRUE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
}
@@ -111,7 +112,7 @@ static void generic_dialog_add_image(GenericDialog *gd, GtkWidget *box,
/* image 2 */
- if (hbox && fd2)
+ if (hbox)
{
vbox = pref_box_new(hbox, TRUE, GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP);
@@ -128,26 +129,19 @@ static void generic_dialog_add_image(GenericDialog *gd, GtkWidget *box,
g_object_set(G_OBJECT(imd->pr), "zoom_expand", FALSE, NULL);
gtk_widget_set_size_request(imd->widget, DIALOG_DEF_IMAGE_DIM_X, DIALOG_DEF_IMAGE_DIM_Y);
gtk_box_pack_start(GTK_BOX(vbox), imd->widget, TRUE, TRUE, 0);
- image_change_fd(imd, fd2, 0.0);
+ if (fd2) image_change_fd(imd, fd2, 0.0);
gtk_widget_show(imd->widget);
- pref_label_new(vbox, fd2->name);
+
+ if (show_filename)
+ {
+ label = pref_label_new(vbox, (fd2 == NULL) ? "" : fd2->name);
+ }
+ g_object_set_data(G_OBJECT(gd->dialog), "img_image2", imd);
+ g_object_set_data(G_OBJECT(gd->dialog), "img_label2", label);
}
}
-static void generic_dialog_image_set(GenericDialog *gd, FileData *fd)
-{
- ImageWindow *imd;
- GtkWidget *label;
-
- imd = g_object_get_data(G_OBJECT(gd->dialog), "img_image");
- label = g_object_get_data(G_OBJECT(gd->dialog), "img_label");
-
- if (!imd) return;
-
- image_change_fd(imd, fd, 0.0);
- if (label) gtk_label_set_text(GTK_LABEL(label), fd->name);
-}
/*
*--------------------------------------------------------------------------
@@ -251,6 +245,7 @@ typedef enum {
typedef enum {
UTILITY_PHASE_START = 0,
+ UTILITY_PHASE_INTERMEDIATE,
UTILITY_PHASE_ENTERING,
UTILITY_PHASE_CHECKED,
UTILITY_PHASE_DONE,
@@ -352,6 +347,48 @@ struct _UtilityDelayData {
static gboolean file_util_write_metadata_first(UtilityType type, UtilityPhase phase, GList *flist, const gchar *dest_path, const gchar *editor_key, GtkWidget *parent);
+static void generic_dialog_image_set(UtilityData *ud, FileData *fd)
+{
+ ImageWindow *imd;
+ GtkWidget *label;
+ FileData *fd2 = NULL;
+ gchar *buf;
+
+ imd = g_object_get_data(G_OBJECT(ud->gd->dialog), "img_image");
+ label = g_object_get_data(G_OBJECT(ud->gd->dialog), "img_label");
+
+ if (!imd) return;
+
+ image_change_fd(imd, fd, 0.0);
+ buf = g_strjoin("\n", text_from_time(fd->date), text_from_size(fd->size), NULL);
+ if (label) gtk_label_set_text(GTK_LABEL(label), buf);
+ g_free(buf);
+
+ if (ud->type == UTILITY_TYPE_COPY || ud->type == UTILITY_TYPE_MOVE)
+ {
+ imd = g_object_get_data(G_OBJECT(ud->gd->dialog), "img_image2");
+ label = g_object_get_data(G_OBJECT(ud->gd->dialog), "img_label2");
+
+ if (imd)
+ {
+ if (isfile(fd->change->dest))
+ {
+ fd2 = file_data_new_simple(fd->change->dest);
+ image_change_fd(imd, fd2, 0.0);
+ buf = g_strjoin("\n", text_from_time(fd2->date), text_from_size(fd2->size), NULL);
+ if (label && fd->change->dest) gtk_label_set_text(GTK_LABEL(label), buf);
+ file_data_unref(fd2);
+ g_free(buf);
+ }
+ else
+ {
+ image_change_fd(imd, NULL, 0.0);
+ if (label) gtk_label_set_text(GTK_LABEL(label), "");
+ }
+ }
+ }
+}
+
#define UTILITY_LIST_MIN_WIDTH 250
#define UTILITY_LIST_MIN_HEIGHT 150
@@ -1179,6 +1216,8 @@ static void file_util_rename_preview_update(UtilityData *ud)
gint padding;
gint n;
gint mode;
+ gchar *dirname;
+ gchar *destname;
mode = gtk_notebook_get_current_page(GTK_NOTEBOOK(ud->notebook));
@@ -1192,12 +1231,33 @@ static void file_util_rename_preview_update(UtilityData *ud)
gtk_tree_model_get(store, &iter, UTILITY_COLUMN_FD, &fd, -1);
g_assert(ud->with_sidecars); /* sidecars must be renamed too, it would break the pairing otherwise */
- file_data_sc_update_ci_rename(fd, dest);
+
+ dirname = g_path_get_dirname(fd->change->dest);
+ destname = g_build_filename(dirname, dest, NULL);
+
+ switch (ud->type)
+ {
+ case UTILITY_TYPE_RENAME:
+ file_data_sc_update_ci_rename(fd, dest);
+ break;
+ case UTILITY_TYPE_COPY:
+ file_data_sc_update_ci_copy(fd, destname);
+ break;
+ case UTILITY_TYPE_MOVE:
+ file_data_sc_update_ci_move(fd, destname);
+ break;
+ default:;
+ }
+ generic_dialog_image_set(ud, fd);
+
gtk_list_store_set(GTK_LIST_STORE(store), &iter,
UTILITY_COLUMN_PIXBUF, file_util_get_error_icon(fd, ud->listview),
UTILITY_COLUMN_DEST_PATH, fd->change->dest,
UTILITY_COLUMN_DEST_NAME, filename_from_path(fd->change->dest),
-1);
+
+ g_free(dirname);
+ g_free(destname);
}
return;
}
@@ -1237,13 +1297,32 @@ static void file_util_rename_preview_update(UtilityData *ud)
}
g_assert(ud->with_sidecars); /* sidecars must be renamed too, it would break the pairing otherwise */
- file_data_sc_update_ci_rename(fd, dest);
+ dirname = g_path_get_dirname(fd->change->dest);
+ destname = g_build_filename(dirname, dest, NULL);
+
+ switch (ud->type)
+ {
+ case UTILITY_TYPE_RENAME:
+ file_data_sc_update_ci_rename(fd, dest);
+ break;
+ case UTILITY_TYPE_COPY:
+ file_data_sc_update_ci_copy(fd, destname);
+ break;
+ case UTILITY_TYPE_MOVE:
+ file_data_sc_update_ci_move(fd, destname);
+ break;
+ default:;
+ }
+ generic_dialog_image_set(ud, fd);
+
gtk_list_store_set(GTK_LIST_STORE(store), &iter,
UTILITY_COLUMN_PIXBUF, file_util_get_error_icon(fd, ud->listview),
UTILITY_COLUMN_DEST_PATH, fd->change->dest,
UTILITY_COLUMN_DEST_NAME, filename_from_path(fd->change->dest),
-1);
g_free(dest);
+ g_free(dirname);
+ g_free(destname);
n++;
valid = gtk_tree_model_iter_next(store, &iter);
@@ -1296,11 +1375,11 @@ static gboolean file_util_preview_cb(GtkTreeSelection *selection, GtkTreeModel *
!gtk_tree_model_get_iter(store, &iter, tpath)) return TRUE;
gtk_tree_model_get(store, &iter, UTILITY_COLUMN_FD, &fd, -1);
- generic_dialog_image_set(ud->gd, fd);
+ generic_dialog_image_set(ud, fd);
ud->sel_fd = fd;
- if (ud->type == UTILITY_TYPE_RENAME)
+ if (ud->type == UTILITY_TYPE_RENAME || ud->type == UTILITY_TYPE_COPY || ud->type == UTILITY_TYPE_MOVE)
{
const gchar *name = filename_from_path(fd->change->dest);
@@ -1392,7 +1471,7 @@ static void file_util_dialog_init_simple_list(UtilityData *ud)
gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
gtk_tree_selection_set_select_function(selection, file_util_preview_cb, ud, NULL);
- generic_dialog_add_image(ud->gd, box, NULL, NULL, NULL, NULL, FALSE);
+ generic_dialog_add_image(ud->gd, box, NULL, NULL, FALSE, NULL, NULL, FALSE);
if (ud->type == UTILITY_TYPE_DELETE ||
ud->type == UTILITY_TYPE_DELETE_LINK ||
@@ -1458,7 +1537,7 @@ static GtkWidget *furm_simple_vlabel(GtkWidget *box, const gchar *text, gboolean
}
-static void file_util_dialog_init_source_dest(UtilityData *ud)
+static void file_util_dialog_init_source_dest(UtilityData *ud, gboolean second_image)
{
GtkTreeModel *store;
GtkTreeSelection *selection;
@@ -1501,7 +1580,14 @@ static void file_util_dialog_init_source_dest(UtilityData *ud)
G_CALLBACK(file_util_rename_preview_order_cb), ud);
gtk_widget_set_size_request(ud->listview, 300, 150);
- generic_dialog_add_image(ud->gd, box, NULL, NULL, NULL, NULL, FALSE);
+ if (second_image)
+ {
+ generic_dialog_add_image(ud->gd, box, NULL, "Source", TRUE, NULL, "Destination", TRUE);
+ }
+ else
+ {
+ generic_dialog_add_image(ud->gd, box, NULL, NULL, FALSE, NULL, NULL, FALSE);
+ }
// gtk_container_add(GTK_CONTAINER(scrolled), view);
gtk_widget_show(ud->gd->dialog);
@@ -1657,21 +1743,37 @@ void file_util_dialog_run(UtilityData *ud)
case UTILITY_TYPE_EDITOR:
case UTILITY_TYPE_WRITE_METADATA:
file_util_dialog_init_simple_list(ud);
+ ud->phase = UTILITY_PHASE_ENTERING;
break;
case UTILITY_TYPE_RENAME:
- file_util_dialog_init_source_dest(ud);
+ file_util_dialog_init_source_dest(ud, FALSE);
+ ud->phase = UTILITY_PHASE_ENTERING;
break;
case UTILITY_TYPE_COPY:
case UTILITY_TYPE_MOVE:
+ file_util_dialog_init_dest_folder(ud);
+ ud->phase = UTILITY_PHASE_INTERMEDIATE;
+ break;
case UTILITY_TYPE_FILTER:
case UTILITY_TYPE_CREATE_FOLDER:
file_util_dialog_init_dest_folder(ud);
+ ud->phase = UTILITY_PHASE_ENTERING;
break;
case UTILITY_TYPE_RENAME_FOLDER:
ud->phase = UTILITY_PHASE_CANCEL; /* FIXME - not handled for now */
file_util_dialog_run(ud);
return;
}
+ break;
+ case UTILITY_PHASE_INTERMEDIATE:
+ switch (ud->type)
+ {
+ case UTILITY_TYPE_COPY:
+ case UTILITY_TYPE_MOVE:
+ file_util_dialog_init_source_dest(ud, TRUE);
+ break;
+ default:;
+ }
ud->phase = UTILITY_PHASE_ENTERING;
break;
case UTILITY_PHASE_ENTERING:
@@ -1768,6 +1870,7 @@ static gchar *file_util_details_get_message(UtilityData *ud, FileData *fd, const
GString *message = g_string_new("");
gint error;
g_string_append_printf(message, _("File: '%s'\n"), fd->path);
+ if (fd->change->dest) g_string_append_printf(message, _("Destination: '%s'\n"), fd->change->dest);
if (ud->with_sidecars && fd->sidecar_files)
{
@@ -1826,7 +1929,7 @@ static void file_util_details_dialog(UtilityData *ud, FileData *fd)
box = generic_dialog_add_message(gd, stock_id, _("File details"), message);
- generic_dialog_add_image(gd, box, fd, NULL, NULL, NULL, FALSE);
+ generic_dialog_add_image(gd, box, fd, NULL, FALSE, NULL, NULL, FALSE);
gtk_widget_show(gd->dialog);
@@ -1923,7 +2026,7 @@ static void file_util_write_metadata_details_dialog(UtilityData *ud, FileData *f
i++;
}
- generic_dialog_add_image(gd, box, fd, NULL, NULL, NULL, FALSE);
+ generic_dialog_add_image(gd, box, fd, NULL, FALSE, NULL, NULL, FALSE);
gtk_widget_set_size_request(gd->dialog, DIALOG_WIDTH, -1);
gtk_widget_show(gd->dialog);
@@ -2069,6 +2172,7 @@ static void file_util_move_full(FileData *source_fd, GList *flist, const gchar *
ud->flist = flist;
ud->content_list = NULL;
ud->parent = parent;
+ ud->details_func = file_util_details_dialog;
if (dest_path) ud->dest_path = g_strdup(dest_path);
@@ -2118,6 +2222,7 @@ static void file_util_copy_full(FileData *source_fd, GList *flist, const gchar *
ud->flist = flist;
ud->content_list = NULL;
ud->parent = parent;
+ ud->details_func = file_util_details_dialog;
if (dest_path) ud->dest_path = g_strdup(dest_path);
diff --git a/src/filedata.c b/src/filedata.c
index 388037f..8a3af2c 100644
--- a/src/filedata.c
+++ b/src/filedata.c
@@ -402,16 +402,16 @@ static FileData *file_data_new(const gchar *path_utf8, struct stat *st, gboolean
file_data_ref(fd);
}
- if (!fd && file_data_planned_change_hash)
- {
- fd = g_hash_table_lookup(file_data_planned_change_hash, path_utf8);
- if (fd)
- {
- DEBUG_1("planned change: using %s -> %s", path_utf8, fd->path);
- file_data_ref(fd);
- file_data_apply_ci(fd);
- }
- }
+ //if (!fd && file_data_planned_change_hash)
+ //{
+ //fd = g_hash_table_lookup(file_data_planned_change_hash, path_utf8);
+ //if (fd)
+ //{
+ //DEBUG_1("planned change: using %s -> %s", path_utf8, fd->path);
+ //file_data_ref(fd);
+ //file_data_apply_ci(fd);
+ //}
+ //}
if (fd)
{
------------------------------------------------------------------------------
Protect Your Site and Customers from Malware Attacks
Learn about various malware tactics and how to avoid them. Understand
malware threats, the impact they can have on your business, and how you
can protect your company and customers by using code signing.
http://p.sf.net/sfu/oracle-sfdevnl
_______________________________________________
Geeqie-devel mailing list
Geeqie-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/geeqie-devel