Fixed dnd with scrolled positioning
[tbo.git] / src / dnd.c
1 #include <string.h>
2 #include <gtk/gtk.h>
3 #include "dnd.h"
4 #include "ui-drawing.h"
5 #include "frame.h"
6 #include "svgimage.h"
7 #include "tbo-window.h"
8
9 static GtkWidget *DND_IMAGE = NULL;
10
11 void
12 drag_data_received_handl (GtkWidget *widget,
13                           GdkDragContext *context,
14                           gint x, gint y,
15                           GtkSelectionData *selection_data,
16                           guint target_type,
17                           guint time,
18                           TboWindow *tbo)
19 {
20     GtkAdjustment *adj;
21     float zoom = tbo_drawing_get_zoom ();
22     glong   *_idata;
23     gchar   *_sdata;
24
25     gboolean dnd_success = FALSE;
26     gboolean delete_selection_data = FALSE;
27
28     const gchar *name = gtk_widget_get_name (widget);
29
30     /* Deal with what we are given from source */
31     if ((selection_data != NULL) && (selection_data->length >= 0))
32     {
33         if (context-> action == GDK_ACTION_ASK)
34         {
35             /* Ask the user to move or copy, then set the context action. */
36         }
37
38         if (context-> action == GDK_ACTION_MOVE)
39             delete_selection_data = TRUE;
40
41         /* Check that we got the format we can use */
42         switch (target_type)
43         {
44             case TARGET_STRING:
45                 _sdata = (gchar*)selection_data->data;
46
47                 Frame *frame = get_frame_view ();
48                 adj = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (tbo->dw_scroll));
49                 int rx = tbo_frame_get_base_x ((x + gtk_adjustment_get_value(adj)) / zoom);
50                 adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (tbo->dw_scroll));
51                 int ry = tbo_frame_get_base_y ((y + gtk_adjustment_get_value(adj)) / zoom);
52
53                 SVGImage *svgimage = tbo_svgimage_new_width_params (rx, ry, 0, 0, _sdata);
54                 update_drawing (tbo);
55                 tbo_frame_add_obj (frame, svgimage);
56
57                 dnd_success = TRUE;
58                 break;
59
60             default:
61                 g_print ("nothing good");
62         }
63     }
64
65     if (dnd_success == FALSE)
66     {
67         g_print ("DnD data transfer failed!\n");
68     }
69
70     gtk_drag_finish (context, dnd_success, delete_selection_data, time);
71 }
72
73 void
74 drag_data_get_handl (GtkWidget *widget,
75                      GdkDragContext *context,
76                      GtkSelectionData *selection_data,
77                      guint target_type,
78                      guint time,
79                      char *svg)
80 {
81     g_assert (selection_data != NULL);
82     switch (target_type)
83     {
84         case TARGET_STRING:
85             gtk_selection_data_set (selection_data,
86                                     selection_data->target,
87                                     8*sizeof(char),
88                                     (guchar*) svg,
89                                     strlen (svg));
90             break;
91         default:
92             /* Default to some a safe target instead of fail. */
93             g_assert_not_reached ();
94     }
95 }
96
97 void
98 drag_begin_handl (GtkWidget *widget,
99                   GdkDragContext *context,
100                   char *svg)
101 {
102     DND_IMAGE = gtk_image_new_from_file (svg);
103     GdkPixbuf *pix = gtk_image_get_pixbuf (GTK_IMAGE (DND_IMAGE));
104     gtk_drag_set_icon_pixbuf (context, pix, 0, 0);
105 }
106
107 void
108 drag_end_handl (GtkWidget *widget,
109                 GdkDragContext *context,
110                 gpointer user_data)
111 {
112     if (DND_IMAGE)
113     {
114         gtk_widget_destroy (GTK_WIDGET (DND_IMAGE));
115         DND_IMAGE = NULL;
116     }
117 }