gtk.drag_source.DragSource can be set up with the necessary
ingredients for a DND operation ahead of time. This includes
the source for the data that is being transferred, in the form
of a gdk.content_provider.ContentProvider, the desired action, and the icon to
use during the drag operation. After setting it up, the drag
source must be added to a widget as an event controller, using
gtk.widget.Widget.addController.
Setting up the content provider and icon ahead of time only makes
sense when the data does not change. More commonly, you will want
to set them up just in time. To do so, gtk.drag_source.DragSource has
gtk.drag_source.DragSource.prepare and signal@Gtk.DragSource::drag-begin
signals.
The ::prepare signal is emitted before a drag is started, and
can be used to set the content provider and actions that the
drag should be started with.
static GdkContentProvider *
on_drag_prepare (GtkDragSource *source,
double x,
double y,
MyWidget *self)
{
// This widget supports two types of content: GFile objects// and GdkPixbuf objects; GTK will handle the serialization// of these types automatically
GFile *file = my_widget_get_file (self);
GdkPixbuf *pixbuf = my_widget_get_pixbuf (self);
return gdk_content_provider_new_union ((GdkContentProvider *[2]) {
gdk_content_provider_new_typed (G_TYPE_FILE, file),
gdk_content_provider_new_typed (GDK_TYPE_PIXBUF, pixbuf),
}, 2);
}
The ::drag-begin signal is emitted after the gdk.drag.Drag object has
been created, and can be used to set up the drag icon.
staticvoid
on_drag_begin (GtkDragSource *source,
GdkDrag *drag,
MyWidget *self)
{
// Set the widget as the drag icon
GdkPaintable *paintable = gtk_widget_paintable_new (GTK_WIDGET (self));
gtk_drag_source_set_icon (source, paintable, 0, 0);
g_object_unref (paintable);
}
During the DND operation, gtk.drag_source.DragSource emits signals that
can be used to obtain updates about the status of the operation,
but it is not normally necessary to connect to any signals,
except for one case: when the supported actions include
gdk.types.DragAction.Move, you need to listen for the
signal@Gtk.DragSource::drag-end signal and delete the
data after it has been transferred.
gtk.drag_source.DragSource is an event controller to initiate Drag-And-Drop operations.
gtk.drag_source.DragSource can be set up with the necessary ingredients for a DND operation ahead of time. This includes the source for the data that is being transferred, in the form of a gdk.content_provider.ContentProvider, the desired action, and the icon to use during the drag operation. After setting it up, the drag source must be added to a widget as an event controller, using gtk.widget.Widget.addController.
Setting up the content provider and icon ahead of time only makes sense when the data does not change. More commonly, you will want to set them up just in time. To do so, gtk.drag_source.DragSource has gtk.drag_source.DragSource.prepare and signal@Gtk.DragSource::drag-begin signals.
The ::prepare signal is emitted before a drag is started, and can be used to set the content provider and actions that the drag should be started with.
The ::drag-begin signal is emitted after the gdk.drag.Drag object has been created, and can be used to set up the drag icon.
During the DND operation, gtk.drag_source.DragSource emits signals that can be used to obtain updates about the status of the operation, but it is not normally necessary to connect to any signals, except for one case: when the supported actions include gdk.types.DragAction.Move, you need to listen for the signal@Gtk.DragSource::drag-end signal and delete the data after it has been transferred.