diff options
author | Matthias Clasen <mclasen@redhat.com> | 2023-02-23 14:44:52 -0500 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2023-02-26 08:28:38 -0500 |
commit | 495ca72232158b7ce0333ba0f6261d214a9ce1fa (patch) | |
tree | a260f458c7b6b7ccef58f51f7c8394a6e53975e9 /demos/gtk-demo | |
parent | 4cf42eb19cdec17ea23409038a34aea5ac316643 (diff) | |
download | gtk+-495ca72232158b7ce0333ba0f6261d214a9ce1fa.tar.gz |
gtk4-demo: Accept file dnd in the pickers demo
Easy to add and expected of a file picker.
Diffstat (limited to 'demos/gtk-demo')
-rw-r--r-- | demos/gtk-demo/pickers.c | 53 |
1 files changed, 44 insertions, 9 deletions
diff --git a/demos/gtk-demo/pickers.c b/demos/gtk-demo/pickers.c index 99bc93f662..edf6ecbfa6 100644 --- a/demos/gtk-demo/pickers.c +++ b/demos/gtk-demo/pickers.c @@ -13,20 +13,13 @@ static GtkWidget *app_picker; static void -file_opened (GObject *source, - GAsyncResult *result, - void *data) +set_file (GFile *file, + gpointer data) { - GFile *file; - GError *error = NULL; char *name; - file = gtk_file_dialog_open_finish (GTK_FILE_DIALOG (source), result, &error); - if (!file) { - g_print ("%s\n", error->message); - g_error_free (error); gtk_widget_set_sensitive (app_picker, FALSE); g_object_set_data (G_OBJECT (app_picker), "file", NULL); return; @@ -40,6 +33,25 @@ file_opened (GObject *source, g_object_set_data_full (G_OBJECT (app_picker), "file", g_object_ref (file), g_object_unref); } +static void +file_opened (GObject *source, + GAsyncResult *result, + void *data) +{ + GFile *file; + GError *error = NULL; + + file = gtk_file_dialog_open_finish (GTK_FILE_DIALOG (source), result, &error); + + if (!file) + { + g_print ("%s\n", error->message); + g_error_free (error); + } + + set_file (file, data); +} + static gboolean abort_mission (gpointer data) { @@ -130,11 +142,28 @@ launch_uri (GtkButton *picker) g_object_unref (launcher); } +static gboolean +on_drop (GtkDropTarget *target, + const GValue *value, + double x, + double y, + gpointer data) +{ + if (G_VALUE_HOLDS (value, G_TYPE_FILE)) + { + set_file (g_value_get_object (value), data); + return TRUE; + } + + return FALSE; +} + GtkWidget * do_pickers (GtkWidget *do_widget) { static GtkWidget *window = NULL; GtkWidget *table, *label, *picker, *button; + GtkDropTarget *drop_target; if (!window) { @@ -179,7 +208,13 @@ do_pickers (GtkWidget *do_widget) picker = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); button = gtk_button_new_from_icon_name ("document-open-symbolic"); + label = gtk_label_new ("None"); + + drop_target = gtk_drop_target_new (G_TYPE_FILE, GDK_ACTION_COPY); + g_signal_connect (drop_target, "drop", G_CALLBACK (on_drop), label); + gtk_widget_add_controller (button, GTK_EVENT_CONTROLLER (drop_target)); + gtk_label_set_xalign (GTK_LABEL (label), 0.); gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_MIDDLE); gtk_widget_set_hexpand (label, TRUE); |