71
/* local function prototypes */
73
static void gimp_display_shell_drop_drawable (GtkWidget *widget,
76
GimpViewable *viewable,
78
static void gimp_display_shell_drop_vectors (GtkWidget *widget,
81
GimpViewable *viewable,
83
static void gimp_display_shell_drop_svg (GtkWidget *widget,
86
const guchar *svg_data,
87
gsize svg_data_length,
89
static void gimp_display_shell_drop_pattern (GtkWidget *widget,
92
GimpViewable *viewable,
94
static void gimp_display_shell_drop_color (GtkWidget *widget,
99
static void gimp_display_shell_drop_buffer (GtkWidget *widget,
102
GimpViewable *viewable,
104
static void gimp_display_shell_drop_uri_list (GtkWidget *widget,
109
static void gimp_display_shell_drop_component (GtkWidget *widget,
113
GimpChannelType component,
115
static void gimp_display_shell_drop_pixbuf (GtkWidget *widget,
122
/* public functions */
125
gimp_display_shell_dnd_init (GimpDisplayShell *shell)
127
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
129
gimp_dnd_uri_list_dest_add (GTK_WIDGET (shell),
130
gimp_display_shell_drop_uri_list,
132
gimp_dnd_viewable_dest_add (GTK_WIDGET (shell), GIMP_TYPE_LAYER,
133
gimp_display_shell_drop_drawable,
135
gimp_dnd_viewable_dest_add (GTK_WIDGET (shell), GIMP_TYPE_LAYER_MASK,
136
gimp_display_shell_drop_drawable,
138
gimp_dnd_viewable_dest_add (GTK_WIDGET (shell), GIMP_TYPE_CHANNEL,
139
gimp_display_shell_drop_drawable,
141
gimp_dnd_viewable_dest_add (GTK_WIDGET (shell), GIMP_TYPE_VECTORS,
142
gimp_display_shell_drop_vectors,
144
gimp_dnd_viewable_dest_add (GTK_WIDGET (shell), GIMP_TYPE_PATTERN,
145
gimp_display_shell_drop_pattern,
147
gimp_dnd_viewable_dest_add (GTK_WIDGET (shell), GIMP_TYPE_BUFFER,
148
gimp_display_shell_drop_buffer,
150
gimp_dnd_color_dest_add (GTK_WIDGET (shell),
151
gimp_display_shell_drop_color,
153
gimp_dnd_svg_dest_add (GTK_WIDGET (shell),
154
gimp_display_shell_drop_svg,
156
gimp_dnd_component_dest_add (GTK_WIDGET (shell),
157
gimp_display_shell_drop_component,
159
gimp_dnd_pixbuf_dest_add (GTK_WIDGET (shell),
160
gimp_display_shell_drop_pixbuf,
165
/* private functions */
68
168
gimp_display_shell_drop_drawable (GtkWidget *widget,
69
171
GimpViewable *viewable,
72
GimpDisplayShell *shell = GIMP_DISPLAY_SHELL (data);
73
GimpImage *gimage = shell->gdisp->gimage;
174
GimpDisplayShell *shell = GIMP_DISPLAY_SHELL (data);
175
GimpImage *image = shell->display->image;
75
177
GimpItem *new_item;
77
179
D (g_print ("drop drawable on canvas\n"));
79
if (gimage->gimp->busy)
181
if (image->gimp->busy)
82
184
if (GIMP_IS_LAYER (viewable))
107
209
gimp_item_translate (new_item, off_x, off_y, FALSE);
109
gimp_image_add_layer (gimage, new_layer, -1);
111
gimp_image_undo_group_end (gimage);
113
gimp_image_flush (gimage);
115
gimp_context_set_display (gimp_get_user_context (gimage->gimp),
211
gimp_image_add_layer (image, new_layer, -1);
213
gimp_image_undo_group_end (image);
215
gimp_image_flush (image);
217
gimp_context_set_display (gimp_get_user_context (image->gimp),
121
223
gimp_display_shell_drop_vectors (GtkWidget *widget,
122
226
GimpViewable *viewable,
125
GimpDisplayShell *shell = GIMP_DISPLAY_SHELL (data);
126
GimpImage *gimage = shell->gdisp->gimage;
229
GimpDisplayShell *shell = GIMP_DISPLAY_SHELL (data);
230
GimpImage *image = shell->display->image;
127
231
GimpItem *new_item;
129
233
D (g_print ("drop vectors on canvas\n"));
131
if (gimage->gimp->busy)
235
if (image->gimp->busy)
134
new_item = gimp_item_convert (GIMP_ITEM (viewable), gimage,
238
new_item = gimp_item_convert (GIMP_ITEM (viewable), image,
135
239
G_TYPE_FROM_INSTANCE (viewable), TRUE);
139
243
GimpVectors *new_vectors = GIMP_VECTORS (new_item);
141
gimp_image_undo_group_start (gimage, GIMP_UNDO_GROUP_EDIT_PASTE,
245
gimp_image_undo_group_start (image, GIMP_UNDO_GROUP_EDIT_PASTE,
142
246
_("Drop New Path"));
144
gimp_image_add_vectors (gimage, new_vectors, -1);
146
gimp_image_undo_group_end (gimage);
148
gimp_image_flush (gimage);
150
gimp_context_set_display (gimp_get_user_context (gimage->gimp),
248
gimp_image_add_vectors (image, new_vectors, -1);
250
gimp_image_undo_group_end (image);
252
gimp_image_flush (image);
254
gimp_context_set_display (gimp_get_user_context (image->gimp),
156
260
gimp_display_shell_drop_svg (GtkWidget *widget,
157
263
const guchar *svg_data,
158
264
gsize svg_data_len,
161
GimpDisplayShell *shell = GIMP_DISPLAY_SHELL (data);
162
GimpImage *gimage = shell->gdisp->gimage;
267
GimpDisplayShell *shell = GIMP_DISPLAY_SHELL (data);
268
GimpImage *image = shell->display->image;
163
269
GError *error = NULL;
165
271
D (g_print ("drop SVG on canvas\n"));
167
if (gimage->gimp->busy)
273
if (image->gimp->busy)
170
if (! gimp_vectors_import_buffer (gimage,
276
if (! gimp_vectors_import_buffer (image,
171
277
(const gchar *) svg_data, svg_data_len,
172
TRUE, TRUE, -1, &error))
278
TRUE, TRUE, -1, NULL, &error))
174
g_message (error->message);
280
gimp_message (image->gimp, G_OBJECT (shell->display), GIMP_MESSAGE_ERROR,
281
"%s", error->message);
175
282
g_clear_error (&error);
179
gimp_image_flush (gimage);
286
gimp_image_flush (image);
181
gimp_context_set_display (gimp_get_user_context (gimage->gimp),
288
gimp_context_set_display (gimp_get_user_context (image->gimp),
273
388
/* FIXME: popup a menu for selecting "Paste Into" */
275
gimp_edit_paste (gimage, gimp_image_active_drawable (gimage),
390
gimp_edit_paste (image, gimp_image_active_drawable (image),
277
392
x, y, width, height);
279
gimp_image_flush (gimage);
394
gimp_image_flush (image);
281
gimp_context_set_display (gimp_get_user_context (gimage->gimp),
396
gimp_context_set_display (gimp_get_user_context (image->gimp),
286
401
gimp_display_shell_drop_uri_list (GtkWidget *widget,
290
GimpDisplayShell *shell = GIMP_DISPLAY_SHELL (data);
291
GimpImage *gimage = shell->gdisp->gimage;
407
GimpDisplayShell *shell = GIMP_DISPLAY_SHELL (data);
408
GimpImage *image = shell->display->image;
292
409
GimpContext *context;
295
412
D (g_print ("drop uri list on canvas\n"));
297
context = gimp_get_user_context (gimage->gimp);
414
context = gimp_get_user_context (image->gimp);
299
416
for (list = uri_list; list; list = g_list_next (list))
301
418
const gchar *uri = list->data;
302
GimpLayer *new_layer;
303
420
GimpPDBStatusType status;
304
421
GError *error = NULL;
306
new_layer = file_open_layer (gimage->gimp, context,
307
GIMP_PROGRESS (shell->statusbar),
423
new_layers = file_open_layers (image->gimp, context,
424
GIMP_PROGRESS (shell->display),
426
uri, GIMP_RUN_INTERACTIVE, NULL,
313
GimpItem *new_item = GIMP_ITEM (new_layer);
318
434
gimp_display_shell_untransform_viewport (shell, &x, &y,
319
435
&width, &height);
321
gimp_item_offsets (new_item, &off_x, &off_y);
323
off_x = x + (width - gimp_item_width (new_item)) / 2 - off_x;
324
off_y = y + (height - gimp_item_height (new_item)) / 2 - off_y;
326
gimp_item_translate (new_item, off_x, off_y, FALSE);
328
gimp_image_add_layer (gimage, new_layer, -1);
437
gimp_image_add_layers (image, new_layers, -1,
441
g_list_free (new_layers);
330
443
else if (status != GIMP_PDB_CANCEL)
332
gchar *filename = file_utils_uri_to_utf8_filename (uri);
445
gchar *filename = file_utils_uri_display_name (uri);
334
g_message (_("Opening '%s' failed:\n\n%s"),
335
filename, error->message);
447
gimp_message (image->gimp, G_OBJECT (shell->display),
449
_("Opening '%s' failed:\n\n%s"),
450
filename, error->message);
337
452
g_clear_error (&error);
338
453
g_free (filename);
342
gimp_image_flush (gimage);
344
gimp_context_set_display (context, shell->gdisp);
457
gimp_image_flush (image);
459
gimp_context_set_display (context, shell->display);
463
gimp_display_shell_drop_component (GtkWidget *widget,
467
GimpChannelType component,
470
GimpDisplayShell *shell = GIMP_DISPLAY_SHELL (data);
471
GimpImage *dest_image = shell->display->image;
472
GimpChannel *channel;
476
D (g_print ("drop component on canvas\n"));
478
if (dest_image->gimp->busy)
481
channel = gimp_channel_new_from_component (image, component, NULL, NULL);
483
new_item = gimp_item_convert (GIMP_ITEM (channel), dest_image,
484
GIMP_TYPE_LAYER, TRUE);
486
g_object_unref (channel);
490
GimpLayer *new_layer = GIMP_LAYER (new_item);
491
gint x, y, width, height;
494
gimp_enum_get_value (GIMP_TYPE_CHANNEL_TYPE, component,
495
NULL, NULL, &desc, NULL);
496
gimp_object_take_name (GIMP_OBJECT (new_layer),
497
g_strdup_printf (_("%s Channel Copy"), desc));
499
gimp_image_undo_group_start (dest_image, GIMP_UNDO_GROUP_EDIT_PASTE,
500
_("Drop New Layer"));
502
gimp_display_shell_untransform_viewport (shell, &x, &y, &width, &height);
504
gimp_item_offsets (new_item, &off_x, &off_y);
506
off_x = x + (width - gimp_item_width (new_item)) / 2 - off_x;
507
off_y = y + (height - gimp_item_height (new_item)) / 2 - off_y;
509
gimp_item_translate (new_item, off_x, off_y, FALSE);
511
gimp_image_add_layer (dest_image, new_layer, -1);
513
gimp_image_undo_group_end (dest_image);
515
gimp_image_flush (dest_image);
517
gimp_context_set_display (gimp_get_user_context (dest_image->gimp),
523
gimp_display_shell_drop_pixbuf (GtkWidget *widget,
529
GimpDisplayShell *shell = GIMP_DISPLAY_SHELL (data);
530
GimpImage *image = shell->display->image;
531
GimpLayer *new_layer;
533
D (g_print ("drop pixbuf on canvas\n"));
535
if (image->gimp->busy)
539
gimp_layer_new_from_pixbuf (pixbuf, image,
540
gimp_image_base_type_with_alpha (image),
542
GIMP_OPACITY_OPAQUE, GIMP_NORMAL_MODE);
547
gint x, y, width, height;
550
new_item = GIMP_ITEM (new_layer);
552
gimp_image_undo_group_start (image, GIMP_UNDO_GROUP_EDIT_PASTE,
553
_("Drop New Layer"));
555
gimp_display_shell_untransform_viewport (shell, &x, &y, &width, &height);
557
gimp_item_offsets (new_item, &off_x, &off_y);
559
off_x = x + (width - gimp_item_width (new_item)) / 2 - off_x;
560
off_y = y + (height - gimp_item_height (new_item)) / 2 - off_y;
562
gimp_item_translate (new_item, off_x, off_y, FALSE);
564
gimp_image_add_layer (image, new_layer, -1);
566
gimp_image_undo_group_end (image);
568
gimp_image_flush (image);
570
gimp_context_set_display (gimp_get_user_context (image->gimp),