mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-12-25 21:21:21 +00:00
Merge branch 'dnd-fixes' into 'master'
dnd: Add another assertion See merge request GNOME/gtk!3689
This commit is contained in:
commit
6a29b64850
@ -1,7 +1,7 @@
|
|||||||
/* Peg Solitaire
|
/* Peg Solitaire
|
||||||
* #Keywords: GtkGridView, game
|
* #Keywords: GtkGridView, game
|
||||||
*
|
*
|
||||||
* This demo demonstrates how to use drag'n'drop to implement peg solitaire.
|
* This demo demonstrates how to use drag-and-drop to implement peg solitaire.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -98,7 +98,7 @@ solitaire_peg_init (SolitairePeg *peg)
|
|||||||
|
|
||||||
/* Add a little setter for the peg's position.
|
/* Add a little setter for the peg's position.
|
||||||
* We want to track those so that we can check for legal moves
|
* We want to track those so that we can check for legal moves
|
||||||
* during drag'n'drop operations.
|
* during drag-and-drop operations.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
solitaire_peg_set_position (SolitairePeg *peg,
|
solitaire_peg_set_position (SolitairePeg *peg,
|
||||||
|
54
docs/reference/gtk/drag-and-drop.md
Normal file
54
docs/reference/gtk/drag-and-drop.md
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
Title: Drag-and-Drop in GTK
|
||||||
|
|
||||||
|
Drag-and-Drop (DND) is a user interaction pattern where users drag a UI element
|
||||||
|
from one place to another, either inside a single application or between
|
||||||
|
different application windows.
|
||||||
|
|
||||||
|
When the element is 'dropped', data is transferred from the source to the
|
||||||
|
destination, according to the drag action that is negotiated between both
|
||||||
|
sides. Most commonly, that is a _copy_, but it can also be a _move_ or a
|
||||||
|
_link_, depending on the kind of data and how the drag operation has been
|
||||||
|
set up.
|
||||||
|
|
||||||
|
This chapter gives an overview over how Drag-and-Drop is handled with event
|
||||||
|
controllers in GTK.
|
||||||
|
|
||||||
|
## Drag sources
|
||||||
|
|
||||||
|
To make data available via DND, you create a [class@Gtk.DragSource]. Drag sources
|
||||||
|
are event controllers, which initiate a Drag-and-Drop operation when the user clicks
|
||||||
|
and drags the widget.
|
||||||
|
|
||||||
|
A drag source can be set up ahead of time, with the desired drag action(s) and the data
|
||||||
|
to be transferred. But it is also possible to provide the data when a drag operation
|
||||||
|
is about to begin, by connecting to the [signal@Gtk.DragSource::prepare] signal.
|
||||||
|
|
||||||
|
The GtkDragSource emits the [signal@Gtk.DragSource::drag-begin] signal when the DND
|
||||||
|
operation starts, and the [signal@Gtk.DragSource::drag-end] signal when it is done.
|
||||||
|
But it is not normally necessary to handle these signals. One case in which a ::drag-end
|
||||||
|
handler is necessary is to implement `GDK_ACTION_MOVE`.
|
||||||
|
|
||||||
|
## Drop targets
|
||||||
|
|
||||||
|
To receive data via DND, you create a [class@Gtk.DropTarget], and tell it what kind of
|
||||||
|
data to accept. You need to connect to the [signal@Gtk.DropTarget::drop] signal to receive
|
||||||
|
the data when a DND operation occurs.
|
||||||
|
|
||||||
|
While a DND operation is ongoing, GTK provides updates when the pointer moves over
|
||||||
|
the widget to which the drop target is associated. The [signal@Gtk.DropTarget::enter],
|
||||||
|
[signal@Gtk.DropTarget::leave] and [signal@Gtk.DropTarget::motion] signals get emitted
|
||||||
|
for this purpose.
|
||||||
|
|
||||||
|
GtkDropTarget provides a simple API, and only provides the data when it has been completely
|
||||||
|
transferred. If you need to handle the data transfer yourself (for example to provide progress
|
||||||
|
information during the transfer), you can use the more complicated [class@Gtk.DropTargetAsync].
|
||||||
|
|
||||||
|
## Other considerations
|
||||||
|
|
||||||
|
It is sometimes necessary to update the UI of the destination while a DND operation is ongoing,
|
||||||
|
say to scroll or expand a view, or to switch pages. Typically, such UI changes are triggered
|
||||||
|
by hovering over the widget in question.
|
||||||
|
|
||||||
|
[class@Gtk.DropControllerMotion] is an event controller that can help with implementing such
|
||||||
|
behaviors. It is very similar to [class@Gtk.EventControllerMotion], but provides events during
|
||||||
|
a DND operation.
|
@ -57,6 +57,7 @@ content_files = [
|
|||||||
"initialization.md",
|
"initialization.md",
|
||||||
"actions.md",
|
"actions.md",
|
||||||
"input-handling.md",
|
"input-handling.md",
|
||||||
|
"drag-and-drop.md",
|
||||||
"drawing-model.md",
|
"drawing-model.md",
|
||||||
"css-overview.md",
|
"css-overview.md",
|
||||||
"css-properties.md",
|
"css-properties.md",
|
||||||
|
@ -294,8 +294,11 @@ gdk_drop_finalize (GObject *object)
|
|||||||
|
|
||||||
/* someone forgot to send a LEAVE signal */
|
/* someone forgot to send a LEAVE signal */
|
||||||
g_warn_if_fail (!priv->entered);
|
g_warn_if_fail (!priv->entered);
|
||||||
|
|
||||||
/* Should we emit finish() here if necessary?
|
/* Should we emit finish() here if necessary?
|
||||||
* For now that's the backends' job */
|
* For now that's the backends' job
|
||||||
|
*/
|
||||||
|
g_warn_if_fail (priv->state != GDK_DROP_STATE_DROPPING);
|
||||||
|
|
||||||
g_clear_object (&priv->device);
|
g_clear_object (&priv->device);
|
||||||
g_clear_object (&priv->drag);
|
g_clear_object (&priv->drag);
|
||||||
@ -571,7 +574,7 @@ gdk_drop_get_drag (GdkDrop *self)
|
|||||||
* the ones provided by [method@Gdk.Drop.get_actions]. Those actions may
|
* the ones provided by [method@Gdk.Drop.get_actions]. Those actions may
|
||||||
* change in the future, even depending on the actions you provide here.
|
* change in the future, even depending on the actions you provide here.
|
||||||
*
|
*
|
||||||
* The @preferred action is a hint to the drag'n'drop mechanism about which
|
* The @preferred action is a hint to the drag-and-drop mechanism about which
|
||||||
* action to use when multiple actions are possible.
|
* action to use when multiple actions are possible.
|
||||||
*
|
*
|
||||||
* This function should be called by drag destinations in response to
|
* This function should be called by drag destinations in response to
|
||||||
@ -862,7 +865,7 @@ gdk_drop_read_value_internal (GdkDrop *self,
|
|||||||
* then call [method@Gdk.Drop.read_value_finish] to get the resulting
|
* then call [method@Gdk.Drop.read_value_finish] to get the resulting
|
||||||
* `GValue`.
|
* `GValue`.
|
||||||
*
|
*
|
||||||
* For local drag'n'drop operations that are available in the given
|
* For local drag-and-drop operations that are available in the given
|
||||||
* `GType`, the value will be copied directly. Otherwise, GDK will
|
* `GType`, the value will be copied directly. Otherwise, GDK will
|
||||||
* try to use [func@Gdk.content_deserialize_async] to convert the data.
|
* try to use [func@Gdk.content_deserialize_async] to convert the data.
|
||||||
*/
|
*/
|
||||||
|
@ -163,6 +163,7 @@ gdk_wayland_drag_cancel (GdkDrag *drag,
|
|||||||
GdkDragCancelReason reason)
|
GdkDragCancelReason reason)
|
||||||
{
|
{
|
||||||
gdk_drag_set_cursor (drag, NULL);
|
gdk_drag_set_cursor (drag, NULL);
|
||||||
|
gdk_drag_drop_done (drag, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -290,6 +291,7 @@ data_source_dnd_finished (void *data,
|
|||||||
GdkDrag *drag = data;
|
GdkDrag *drag = data;
|
||||||
|
|
||||||
g_signal_emit_by_name (drag, "dnd-finished");
|
g_signal_emit_by_name (drag, "dnd-finished");
|
||||||
|
gdk_drag_drop_done (drag, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -512,7 +512,7 @@ gtk_drag_icon_get_child (GtkDragIcon *self)
|
|||||||
* If GTK does not know how to create a widget for a given value,
|
* If GTK does not know how to create a widget for a given value,
|
||||||
* it will return %NULL.
|
* it will return %NULL.
|
||||||
*
|
*
|
||||||
* This method is used to set the default drag icon on drag'n'drop
|
* This method is used to set the default drag icon on drag-and-drop
|
||||||
* operations started by `GtkDragSource`, so you don't need to set
|
* operations started by `GtkDragSource`, so you don't need to set
|
||||||
* a drag icon using this function there.
|
* a drag icon using this function there.
|
||||||
*
|
*
|
||||||
|
@ -824,7 +824,7 @@ gtk_drop_target_class_init (GtkDropTargetClass *class)
|
|||||||
* and no further processing is necessary.
|
* and no further processing is necessary.
|
||||||
*
|
*
|
||||||
* Otherwise, the handler returns %TRUE. In this case, this handler will
|
* Otherwise, the handler returns %TRUE. In this case, this handler will
|
||||||
* accept the drop. The handler is responsible for rading the given @value
|
* accept the drop. The handler is responsible for using the given @value
|
||||||
* and performing the drop operation.
|
* and performing the drop operation.
|
||||||
*
|
*
|
||||||
* Returns: whether the drop was accepted at the given pointer position
|
* Returns: whether the drop was accepted at the given pointer position
|
||||||
|
Loading…
Reference in New Issue
Block a user