On Tue, 9 Dec 2008 14:32:38 -0500
"Todd Slater" <[EMAIL PROTECTED]> wrote:

[SNIP]

> I'm coming from F-spot, which makes tagging really easy (but changes
> your date/time values for you, too!). I don't know if there's a way to
> implement a drag+drop tagging feature to geeqie or not, but even a way
> to add new keywords to multiple files without reference to current
> keywords of those files would be great.
> 
> Thanks for reading,
> 
> Todd

Try the attached patch against current svn, it allows to drag text from 
anywhere to 
a file icon (in icon view only for now), adding this text as keywords.
Highly experimental but works for me.

-- 
Laurent MONIN aka Zas
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

Reply via email to