dnd: Port the TreeModel machinery to GValue DND

This commit is contained in:
Benjamin Otte
2020-02-18 01:41:42 +01:00
parent 1145da3ea5
commit b8cf7ea1c6
16 changed files with 272 additions and 381 deletions

View File

@@ -22,20 +22,20 @@ my_model_init (MyModel *object)
gtk_list_store_set_column_types (GTK_LIST_STORE (object), G_N_ELEMENTS (types), types);
}
static gboolean
static GdkContentProvider *
my_model_drag_data_get (GtkTreeDragSource *source,
GtkTreePath *path,
GtkSelectionData *data)
GtkTreePath *path)
{
GdkContentProvider *content;
GtkTreeIter iter;
gchar *text;
gtk_tree_model_get_iter (GTK_TREE_MODEL (source), &iter, path);
gtk_tree_model_get (GTK_TREE_MODEL (source), &iter, 0, &text, -1);
gtk_selection_data_set_text (data, text, -1);
content = gdk_content_provider_new_typed (G_TYPE_STRING, text);
g_free (text);
return TRUE;
return content;
}
static void
@@ -63,10 +63,6 @@ get_model (void)
return GTK_TREE_MODEL (model);
}
static const char *entries[] = {
"text/plain"
};
static GtkWidget *
get_dragsource (void)
{
@@ -81,7 +77,7 @@ get_dragsource (void)
gtk_tree_view_append_column (tv, column);
gtk_tree_view_set_model (tv, get_model ());
targets = gdk_content_formats_new (entries, G_N_ELEMENTS (entries));
targets = gdk_content_formats_new_for_gtype (G_TYPE_STRING);
gtk_tree_view_enable_model_drag_source (tv, GDK_BUTTON1_MASK, targets, GDK_ACTION_COPY);
gdk_content_formats_unref (targets);
@@ -93,18 +89,15 @@ got_text (GObject *source,
GAsyncResult *result,
gpointer data)
{
GtkDropTarget *dest = GTK_DROP_TARGET (source);
GtkWidget *widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (dest));
gchar *text;
GtkSelectionData *selda;
GdkDrop *drop = GDK_DROP (source);
GtkWidget *widget = data;
const GValue *value;
selda = gtk_drop_target_read_selection_finish (dest, result, NULL);
value = gdk_drop_read_value_finish (drop, result, NULL);
if (value == NULL)
return;
text = (gchar*) gtk_selection_data_get_text (selda);
gtk_label_set_label (GTK_LABEL (widget), text);
g_free (text);
gtk_selection_data_free (selda);
gtk_label_set_label (GTK_LABEL (widget), g_value_get_string (value));
}
static void
@@ -114,7 +107,9 @@ drag_drop (GtkDropTarget *dest,
int y,
gpointer dada)
{
gtk_drop_target_read_selection (dest, "text/plain", NULL, got_text, dada);
GtkWidget *widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (dest));
gdk_drop_read_value_async (drop, G_TYPE_STRING, G_PRIORITY_DEFAULT, NULL, got_text, widget);
}
static GtkWidget *
@@ -124,7 +119,7 @@ get_droptarget (void)
GtkDropTarget *dest;
label = gtk_label_new ("Drop here");
dest = gtk_drop_target_new (gdk_content_formats_new (entries, G_N_ELEMENTS (entries)), GDK_ACTION_COPY);
dest = gtk_drop_target_new (gdk_content_formats_new_for_gtype (G_TYPE_STRING), GDK_ACTION_COPY);
g_signal_connect (dest, "drag-drop", G_CALLBACK (drag_drop), NULL);
gtk_widget_add_controller (label, GTK_EVENT_CONTROLLER (dest));