Gtk.DragSource¶
class — extends GestureSingle
An event controller to initiate Drag-And-Drop operations.
GtkDragSource 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.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
Widget.add_controller.
static void
my_widget_init (MyWidget *self)
{
GtkDragSource *drag_source = gtk_drag_source_new ();
g_signal_connect (drag_source, "prepare", G_CALLBACK (on_drag_prepare), self);
g_signal_connect (drag_source, "drag-begin", G_CALLBACK (on_drag_begin), self);
gtk_widget_add_controller (GTK_WIDGET (self), GTK_EVENT_CONTROLLER (drag_source));
}
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, GtkDragSource has
DragSource.prepare and 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 GdkDrag object has
been created, and can be used to set up the drag icon.
static void
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, GtkDragSource 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.DragAction.MOVE, you need to listen for the
DragSource.drag-end signal and delete the
data after it has been transferred.
Constructors¶
new¶
Creates a new GtkDragSource object.
Methods¶
drag_cancel¶
Cancels a currently ongoing drag operation.
get_actions¶
Gets the actions that are currently set on the GtkDragSource.
get_content¶
Gets the current content provider of a GtkDragSource.
get_drag¶
Returns the underlying GdkDrag object for an ongoing drag.
set_actions¶
Sets the actions on the GtkDragSource.
During a DND operation, the actions are offered to potential
drop targets. If actions include Gdk.DragAction.MOVE, you need
to listen to the DragSource.drag-end signal and
handle delete_data being True.
This function can be called before a drag is started,
or in a handler for the DragSource.prepare signal.
Parameters:
actions— the actions to offer
set_content¶
Sets a content provider on a GtkDragSource.
When the data is requested in the cause of a DND operation, it will be obtained from the content provider.
This function can be called before a drag is started,
or in a handler for the DragSource.prepare signal.
You may consider setting the content provider back to
None in a DragSource.drag-end signal handler.
Parameters:
content— aGdkContentProvider
set_icon¶
Sets a paintable to use as icon during DND operations.
The hotspot coordinates determine the point on the icon that gets aligned with the hotspot of the cursor.
If paintable is None, a default icon is used.
This function can be called before a drag is started, or in
a DragSource.prepare or
DragSource.drag-begin signal handler.
Parameters:
paintable— theGdkPaintableto use as iconhot_x— the hotspot X coordinate on the iconhot_y— the hotspot Y coordinate on the icon
Properties¶
actions¶
The actions that are supported by drag operations from the source.
Note that you must handle the DragSource.drag-end signal
if the actions include Gdk.DragAction.MOVE.
content¶
The data that is offered by drag operations from this source.
Signals¶
drag-begin¶
Emitted on the drag source when a drag is started.
It can be used to e.g. set a custom drag icon with
DragSource.set_icon.
drag-cancel¶
Emitted on the drag source when a drag has failed.
The signal handler may handle a failed drag operation based on
the type of error. It should return True if the failure has been handled
and the default "drag operation failed" animation should not be shown.
drag-end¶
Emitted on the drag source when a drag is finished.
A typical reason to connect to this signal is to undo
things done in DragSource.prepare or
DragSource.drag-begin handlers.
prepare¶
Emitted when a drag is about to be initiated.
It returns the GdkContentProvider to use for the drag that is about
to start. The default handler for this signal returns the value of
the DragSource.content property, so if you set up that
property ahead of time, you don't need to connect to this signal.