show a label instead of the default drag icon
authorVladimir Nadvornik <nadvornik@suse.cz>
Sun, 8 Mar 2009 10:25:24 +0000 (10:25 +0000)
committerVladimir Nadvornik <nadvornik@suse.cz>
Sun, 8 Mar 2009 10:25:24 +0000 (10:25 +0000)
src/advanced_exif.c
src/bar_exif.c
src/bar_keywords.c
src/dnd.c
src/dnd.h

index 667f332..96b6758 100644 (file)
@@ -250,11 +250,6 @@ static void advanced_exif_dnd_get(GtkWidget *listview, GdkDragContext *context,
 
 }
 
-static void advanced_exif_dnd_end(GtkWidget *widget, GdkDragContext *context, gpointer data)
-{
-       GtkWidget *window = data;
-       gtk_widget_destroy(window);
-}
 
 static void advanced_exif_dnd_begin(GtkWidget *listview, GdkDragContext *context, gpointer data)
 {
@@ -266,21 +261,10 @@ static void advanced_exif_dnd_begin(GtkWidget *listview, GdkDragContext *context
                {
                GtkTreeModel *store = gtk_tree_view_get_model(GTK_TREE_VIEW(listview));
                gchar *key;
-               GtkWidget *window;
-               GtkWidget *label;
 
                gtk_tree_model_get(store, &iter, EXIF_ADVCOL_NAME, &key, -1);
 
-               window = gtk_window_new(GTK_WINDOW_POPUP);
-               gtk_widget_realize (window);
-
-               label = gtk_label_new(key);
-               gtk_container_add(GTK_CONTAINER (window), label);
-               gtk_widget_show(label);
-               gtk_drag_set_icon_widget(context, window, -15, 10);
-               g_signal_connect(G_OBJECT(listview), "drag_end",
-                                G_CALLBACK(advanced_exif_dnd_end), window);
-
+               dnd_set_drag_label(listview, context, key);
                g_free(key);
                }
 }
index 03b68ce..c67e49b 100644 (file)
@@ -320,9 +320,11 @@ static void bar_pane_exif_dnd_receive(GtkWidget *pane, GdkDragContext *context,
        gtk_box_reorder_child(GTK_BOX(ped->vbox), new_entry, pos);
 }
 
-static void bar_pane_exif_entry_dnd_begin(GtkWidget *widget, GdkDragContext *context, gpointer data)
+static void bar_pane_exif_entry_dnd_begin(GtkWidget *entry, GdkDragContext *context, gpointer data)
 {
-//     gtk_drag_set_icon_default(context);
+       ExifEntry *ee = g_object_get_data(G_OBJECT(entry), "entry_data");
+       if (!ee) return;
+       dnd_set_drag_label(entry, context, ee->key);
 }
 
 static void bar_pane_exif_entry_dnd_end(GtkWidget *widget, GdkDragContext *context, gpointer data)
index a5dade2..672d163 100644 (file)
@@ -490,15 +490,32 @@ static void bar_pane_keywords_dnd_get(GtkWidget *tree_view, GdkDragContext *cont
                        {
                        gchar *name = keyword_get_name(keyword_tree, &child_iter);
                        gtk_selection_data_set_text(selection_data, name, -1);
-printf("name %s\n", name);
                        g_free(name);
                        }
                        break;
                }
 }
 
-static void bar_pane_keywords_dnd_begin(GtkWidget *treeview, GdkDragContext *context, gpointer data)
+static void bar_pane_keywords_dnd_begin(GtkWidget *tree_view, GdkDragContext *context, gpointer data)
 {
+       GtkTreeIter iter;
+       GtkTreeModel *model;
+       GtkTreeIter child_iter;
+       GtkTreeModel *keyword_tree;
+       gchar *name;
+
+       GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view)); 
+
+        if (!gtk_tree_selection_get_selected(sel, &model, &iter)) return;
+
+       keyword_tree = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(model));
+       gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(model), &child_iter, &iter);
+
+       name = keyword_get_name(keyword_tree, &child_iter);
+
+       dnd_set_drag_label(tree_view, context, name);
+       g_free(name);
+
 }
 
 static void bar_pane_keywords_dnd_end(GtkWidget *widget, GdkDragContext *context, gpointer data)
index e1cea2d..2cae9f2 100644 (file)
--- a/src/dnd.c
+++ b/src/dnd.c
@@ -167,4 +167,29 @@ void dnd_set_drag_icon(GtkWidget *widget, GdkDragContext *context, GdkPixbuf *pi
        g_object_unref(pixmap);
        if (mask) g_object_unref(mask);
 }
+
+static void dnd_set_drag_label_end_cb(GtkWidget *widget, GdkDragContext *context, gpointer data)
+{
+       GtkWidget *window = data;
+       g_signal_handlers_disconnect_by_func(widget, dnd_set_drag_label_end_cb, data);
+       gtk_widget_destroy(window);
+}
+
+void dnd_set_drag_label(GtkWidget *widget, GdkDragContext *context, const gchar *text)
+{
+       GtkWidget *window;
+       GtkWidget *label;
+
+       window = gtk_window_new(GTK_WINDOW_POPUP);
+       gtk_widget_realize (window);
+
+       label = gtk_label_new(text);
+       gtk_container_add(GTK_CONTAINER (window), label);
+       gtk_widget_show(label);
+       gtk_drag_set_icon_widget(context, window, -15, 10);
+       g_signal_connect(G_OBJECT(widget), "drag_end",
+                        G_CALLBACK(dnd_set_drag_label_end_cb), window);
+}
+
+
 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
index 17ccfcd..234fd89 100644 (file)
--- a/src/dnd.h
+++ b/src/dnd.h
@@ -37,6 +37,7 @@ extern gint dnd_file_drop_types_count;
 /* sets a drag icon to pixbuf, if items is > 1, text is drawn onto icon to indicate value */
 void dnd_set_drag_icon(GtkWidget *widget, GdkDragContext *context, GdkPixbuf *pixbuf, gint items);
 
+void dnd_set_drag_label(GtkWidget *widget, GdkDragContext *context, const gchar *text);
 
 #endif
 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */