summaryrefslogtreecommitdiff
path: root/demos/gtk-demo
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2023-02-23 14:44:52 -0500
committerMatthias Clasen <mclasen@redhat.com>2023-02-26 08:28:38 -0500
commit495ca72232158b7ce0333ba0f6261d214a9ce1fa (patch)
treea260f458c7b6b7ccef58f51f7c8394a6e53975e9 /demos/gtk-demo
parent4cf42eb19cdec17ea23409038a34aea5ac316643 (diff)
downloadgtk+-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.c53
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);