Here is a more complete patch: drag'n drop of keywords will work on icon or
file list view.
Give it a try.
--
Laurent MONIN aka Zas
Index: view_file_list.c
===================================================================
--- view_file_list.c (révision 1296)
+++ view_file_list.c (copie de travail)
@@ -13,6 +13,7 @@
#include "main.h"
#include "view_file_list.h"
+#include "bar_info.h"
#include "cache_maint.h"
#include "dnd.h"
#include "editors.h"
@@ -21,6 +22,7 @@
#include "layout.h"
#include "layout_image.h"
#include "menu.h"
+#include "metadata.h"
#include "thumb.h"
#include "utilops.h"
#include "ui_fileops.h"
@@ -109,7 +111,29 @@
return -1;
}
+static FileData *vflist_find_data_by_coord(ViewFile *vf, gint x, gint y, GtkTreeIter *iter)
+{
+ GtkTreePath *tpath;
+ GtkTreeViewColumn *column;
+ if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(vf->listview), x, y,
+ &tpath, &column, NULL, NULL))
+ {
+ GtkTreeModel *store;
+ GtkTreeIter row;
+ FileData *fd;
+
+ store = gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview));
+ gtk_tree_model_get_iter(store, &row, tpath);
+ gtk_tree_path_free(tpath);
+ gtk_tree_model_get(store, &row, FILE_COLUMN_POINTER, &fd, -1);
+
+ return fd;
+ }
+
+ return NULL;
+}
+
#if 0
static gint vflist_find_sidecar_list_idx(GList *work, FileData *fd)
{
@@ -285,17 +309,47 @@
}
}
+static void vflist_drag_data_received(GtkWidget *entry_widget, GdkDragContext *context,
+ int x, int y, GtkSelectionData *selection,
+ guint info, guint time, gpointer data)
+{
+ ViewFile *vf = data;
+
+ if (info == TARGET_TEXT_PLAIN) {
+ FileData *fd = vflist_find_data_by_coord(vf, x, y, NULL);
+
+ if (fd) {
+ /* Add keywords to file */
+ gchar *str = g_strndup(selection->data, selection->length);
+ GList *kw_list = string_to_keywords_list(str);
+
+ metadata_set(fd, kw_list, NULL, TRUE);
+ string_list_free(kw_list);
+ g_free(str);
+ if (vf->layout && vf->layout->bar_info) {
+ bar_info_set(vf->layout->bar_info, fd);
+ }
+ }
+ }
+}
+
void vflist_dnd_init(ViewFile *vf)
{
gtk_drag_source_set(vf->listview, GDK_BUTTON1_MASK | GDK_BUTTON2_MASK,
dnd_file_drag_types, dnd_file_drag_types_count,
GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
+ gtk_drag_dest_set(vf->listview, GTK_DEST_DEFAULT_ALL,
+ dnd_file_drag_types, dnd_file_drag_types_count,
+ GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
+
g_signal_connect(G_OBJECT(vf->listview), "drag_data_get",
G_CALLBACK(vflist_dnd_get), vf);
g_signal_connect(G_OBJECT(vf->listview), "drag_begin",
G_CALLBACK(vflist_dnd_begin), vf);
g_signal_connect(G_OBJECT(vf->listview), "drag_end",
G_CALLBACK(vflist_dnd_end), vf);
+ g_signal_connect(G_OBJECT(vf->listview), "drag_data_received",
+ G_CALLBACK(vflist_drag_data_received), vf);
}
/*
Index: dnd.c
===================================================================
--- dnd.c (révision 1296)
+++ dnd.c (copie de travail)
@@ -27,9 +27,10 @@
GtkTargetEntry dnd_file_drop_types[] = {
{ TARGET_APP_COLLECTION_MEMBER_STRING, 0, TARGET_APP_COLLECTION_MEMBER },
- { "text/uri-list", 0, TARGET_URI_LIST }
+ { "text/uri-list", 0, TARGET_URI_LIST },
+ { "text/plain", 0, TARGET_TEXT_PLAIN },
};
-gint dnd_file_drop_types_count = 2;
+gint dnd_file_drop_types_count = 3;
#define DND_ICON_SIZE (options->dnd_icon_size)
Index: view_file_icon.c
===================================================================
--- view_file_icon.c (révision 1296)
+++ view_file_icon.c (copie de travail)
@@ -13,6 +13,7 @@
#include "main.h"
#include "view_file_icon.h"
+#include "bar_info.h"
#include "cellrenderericon.h"
#include "collect.h"
#include "collect-io.h"
@@ -25,6 +26,7 @@
#include "layout.h"
#include "layout_image.h"
#include "menu.h"
+#include "metadata.h"
#include "thumb.h"
#include "utilops.h"
#include "ui_fileops.h"
@@ -551,6 +553,31 @@
g_free(uri_text);
}
+static void vficon_drag_data_received(GtkWidget *entry_widget, GdkDragContext *context,
+ int x, int y, GtkSelectionData *selection,
+ guint info, guint time, gpointer data)
+{
+ ViewFile *vf = data;
+
+ if (info == TARGET_TEXT_PLAIN) {
+ IconData *id = vficon_find_data_by_coord(vf, x, y, NULL);
+
+ if (id && id->fd) {
+ /* Add keywords to file */
+ FileData *fd = id->fd;
+ gchar *str = g_strndup(selection->data, selection->length);
+ GList *kw_list = string_to_keywords_list(str);
+
+ metadata_set(fd, kw_list, NULL, TRUE);
+ string_list_free(kw_list);
+ g_free(str);
+ if (vf->layout && vf->layout->bar_info) {
+ bar_info_set(vf->layout->bar_info, id->fd);
+ }
+ }
+ }
+}
+
static void vficon_dnd_begin(GtkWidget *widget, GdkDragContext *context, gpointer data)
{
ViewFile *vf = data;
@@ -589,12 +616,18 @@
gtk_drag_source_set(vf->listview, GDK_BUTTON1_MASK | GDK_BUTTON2_MASK,
dnd_file_drag_types, dnd_file_drag_types_count,
GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
+ gtk_drag_dest_set(vf->listview, GTK_DEST_DEFAULT_ALL,
+ dnd_file_drag_types, dnd_file_drag_types_count,
+ GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
+
g_signal_connect(G_OBJECT(vf->listview), "drag_data_get",
G_CALLBACK(vficon_dnd_get), vf);
g_signal_connect(G_OBJECT(vf->listview), "drag_begin",
G_CALLBACK(vficon_dnd_begin), vf);
g_signal_connect(G_OBJECT(vf->listview), "drag_end",
G_CALLBACK(vficon_dnd_end), vf);
+ g_signal_connect(G_OBJECT(vf->listview), "drag_data_received",
+ G_CALLBACK(vficon_drag_data_received), vf);
}
/*
------------------------------------------------------------------------------
SF.Net email is Sponsored by MIX09, March 18-20, 2009 in Las Vegas, Nevada.
The future of the web can't happen without you. Join us at MIX09 to help
pave the way to the Next Web now. Learn more and register at
http://ad.doubleclick.net/clk;208669438;13503038;i?http://2009.visitmix.com/
_______________________________________________
Geeqie-devel mailing list
Geeqie-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/geeqie-devel