mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-12-26 13:41:07 +00:00
entry: Port icon dnd to GtkDragSource
This requires a small change in the api, since we need to provide a GdkContentProvider now.
This commit is contained in:
parent
2803a15a51
commit
337057eb35
@ -70,6 +70,8 @@
|
||||
#include "gtkwindow.h"
|
||||
#include "gtknative.h"
|
||||
#include "gtkgestureclick.h"
|
||||
#include "gtkdragsource.h"
|
||||
#include "gtkwidgetpaintable.h"
|
||||
|
||||
#include "a11y/gtkentryaccessible.h"
|
||||
|
||||
@ -172,7 +174,7 @@ struct _EntryIconInfo
|
||||
guint in_drag : 1;
|
||||
|
||||
GdkDragAction actions;
|
||||
GdkContentFormats *target_list;
|
||||
GdkContentProvider *content;
|
||||
};
|
||||
|
||||
enum {
|
||||
@ -1320,8 +1322,7 @@ gtk_entry_finalize (GObject *object)
|
||||
if (icon_info == NULL)
|
||||
continue;
|
||||
|
||||
if (icon_info->target_list != NULL)
|
||||
gdk_content_formats_unref (icon_info->target_list);
|
||||
g_clear_object (&icon_info->content);
|
||||
|
||||
gtk_widget_unparent (icon_info->widget);
|
||||
|
||||
@ -1462,17 +1463,21 @@ icon_drag_update_cb (GtkGestureDrag *gesture,
|
||||
pos = get_icon_position_from_controller (entry, GTK_EVENT_CONTROLLER (gesture));
|
||||
icon_info = priv->icons[pos];
|
||||
|
||||
if (icon_info->target_list != NULL &&
|
||||
gtk_drag_check_threshold (icon_info->widget,
|
||||
start_x, start_y,
|
||||
x, y))
|
||||
if (icon_info->content != NULL &&
|
||||
gtk_drag_check_threshold (icon_info->widget, start_x, start_y, x, y))
|
||||
{
|
||||
GtkDragSource *source;
|
||||
GdkPaintable *paintable;
|
||||
GdkDevice *device;
|
||||
|
||||
icon_info->in_drag = TRUE;
|
||||
gtk_drag_begin (GTK_WIDGET (entry),
|
||||
gtk_gesture_get_device (GTK_GESTURE (gesture)),
|
||||
icon_info->target_list,
|
||||
icon_info->actions,
|
||||
start_x, start_y);
|
||||
source = gtk_drag_source_new (icon_info->content, icon_info->actions);
|
||||
paintable = gtk_widget_paintable_new (icon_info->widget);
|
||||
gtk_drag_source_set_icon (source, paintable, -2, -2);
|
||||
g_object_unref (paintable);
|
||||
device = gtk_gesture_get_device (GTK_GESTURE (gesture));
|
||||
gtk_drag_source_drag_begin (source, GTK_WIDGET (entry), device, start_x, start_y);
|
||||
g_object_unref (source);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2742,7 +2747,7 @@ gtk_entry_get_icon_at_pos (GtkEntry *entry,
|
||||
void
|
||||
gtk_entry_set_icon_drag_source (GtkEntry *entry,
|
||||
GtkEntryIconPosition icon_pos,
|
||||
GdkContentFormats *formats,
|
||||
GdkContentProvider *provider,
|
||||
GdkDragAction actions)
|
||||
{
|
||||
GtkEntryPrivate *priv = gtk_entry_get_instance_private (entry);
|
||||
@ -2754,12 +2759,7 @@ gtk_entry_set_icon_drag_source (GtkEntry *entry,
|
||||
if ((icon_info = priv->icons[icon_pos]) == NULL)
|
||||
icon_info = construct_icon_info (GTK_WIDGET (entry), icon_pos);
|
||||
|
||||
if (icon_info->target_list)
|
||||
gdk_content_formats_unref (icon_info->target_list);
|
||||
icon_info->target_list = formats;
|
||||
if (icon_info->target_list)
|
||||
gdk_content_formats_ref (icon_info->target_list);
|
||||
|
||||
g_set_object (&icon_info->content, provider);
|
||||
icon_info->actions = actions;
|
||||
}
|
||||
|
||||
|
@ -266,7 +266,7 @@ gchar * gtk_entry_get_icon_tooltip_markup (GtkEntry *
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_entry_set_icon_drag_source (GtkEntry *entry,
|
||||
GtkEntryIconPosition icon_pos,
|
||||
GdkContentFormats *formats,
|
||||
GdkContentProvider *content,
|
||||
GdkDragAction actions);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gint gtk_entry_get_current_icon_drag_source (GtkEntry *entry);
|
||||
|
@ -20,33 +20,6 @@ drag_begin_cb (GtkWidget *widget,
|
||||
gtk_drag_set_icon_name (drag, "dialog-information", 2, 2);
|
||||
}
|
||||
|
||||
static void
|
||||
drag_data_get_cb (GtkWidget *widget,
|
||||
GdkDrag *drag,
|
||||
GtkSelectionData *data,
|
||||
gpointer user_data)
|
||||
{
|
||||
gint pos;
|
||||
|
||||
pos = gtk_entry_get_current_icon_drag_source (GTK_ENTRY (widget));
|
||||
|
||||
if (pos == GTK_ENTRY_ICON_PRIMARY)
|
||||
{
|
||||
gint start, end;
|
||||
|
||||
if (gtk_editable_get_selection_bounds (GTK_EDITABLE (widget), &start, &end))
|
||||
{
|
||||
gchar *str;
|
||||
|
||||
str = gtk_editable_get_chars (GTK_EDITABLE (widget), start, end);
|
||||
gtk_selection_data_set_text (data, str, -1);
|
||||
g_free (str);
|
||||
}
|
||||
else
|
||||
gtk_selection_data_set_text (data, "XXX", -1);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
set_blank (GtkWidget *button,
|
||||
GtkEntry *entry)
|
||||
@ -127,7 +100,8 @@ main (int argc, char **argv)
|
||||
GtkWidget *button3;
|
||||
GtkWidget *button4;
|
||||
GIcon *icon;
|
||||
GdkContentFormats *tlist;
|
||||
GdkContentProvider *content;
|
||||
GValue value = G_VALUE_INIT;
|
||||
|
||||
gtk_init ();
|
||||
|
||||
@ -190,16 +164,17 @@ main (int argc, char **argv)
|
||||
gtk_entry_set_icon_tooltip_text (GTK_ENTRY (entry),
|
||||
GTK_ENTRY_ICON_PRIMARY,
|
||||
"Save a file");
|
||||
tlist = gdk_content_formats_new (NULL, 0);
|
||||
tlist = gtk_content_formats_add_text_targets (tlist);
|
||||
|
||||
g_value_init (&value, G_TYPE_STRING);
|
||||
g_value_set_string (&value, "Amazing");
|
||||
content = gdk_content_provider_new_for_value (&value);
|
||||
g_value_unset (&value);
|
||||
gtk_entry_set_icon_drag_source (GTK_ENTRY (entry),
|
||||
GTK_ENTRY_ICON_PRIMARY,
|
||||
tlist, GDK_ACTION_COPY);
|
||||
content, GDK_ACTION_COPY);
|
||||
g_signal_connect_after (entry, "drag-begin",
|
||||
G_CALLBACK (drag_begin_cb), NULL);
|
||||
g_signal_connect (entry, "drag-data-get",
|
||||
G_CALLBACK (drag_data_get_cb), NULL);
|
||||
gdk_content_formats_unref (tlist);
|
||||
g_object_unref (content);
|
||||
|
||||
/*
|
||||
* Search - Uses a helper function
|
||||
|
Loading…
Reference in New Issue
Block a user