From 171612671f6abe19708fa8ef52eb4c12edcf2e13 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 6 Sep 2024 13:46:46 -0400 Subject: [PATCH] demo: Beef up the image scaling demo Add buttons for loading the Portland Rose, and a nameless large png. Make them load the texture in a thread, to demonstrate better handling of large images. --- demos/gtk-demo/demo.gresource.xml | 3 + demos/gtk-demo/image_scaling.c | 164 +++++++++++++++++++-- demos/gtk-demo/large-image-thumbnail.png | Bin 0 -> 16973 bytes demos/gtk-demo/large-image.png | Bin 0 -> 636767 bytes demos/gtk-demo/portland-rose-thumbnail.png | Bin 0 -> 3618 bytes 5 files changed, 153 insertions(+), 14 deletions(-) create mode 100644 demos/gtk-demo/large-image-thumbnail.png create mode 100644 demos/gtk-demo/large-image.png create mode 100644 demos/gtk-demo/portland-rose-thumbnail.png diff --git a/demos/gtk-demo/demo.gresource.xml b/demos/gtk-demo/demo.gresource.xml index 2998560b02..295c056f0b 100644 --- a/demos/gtk-demo/demo.gresource.xml +++ b/demos/gtk-demo/demo.gresource.xml @@ -454,6 +454,9 @@ icons/16x16/categories/applications-other.png icons/48x48/status/starred.png data/scalable/apps/org.gtk.Demo4.svg + portland-rose-thumbnail.png + large-image-thumbnail.png + large-image.png help-overlay.ui diff --git a/demos/gtk-demo/image_scaling.c b/demos/gtk-demo/image_scaling.c index 65c344f8bf..7a541292b9 100644 --- a/demos/gtk-demo/image_scaling.c +++ b/demos/gtk-demo/image_scaling.c @@ -14,6 +14,103 @@ #include #include "demo3widget.h" +static GtkWidget *window = NULL; +static GCancellable *cancellable = NULL; + +static void +load_texture (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cable) +{ + GFile *file = task_data; + GdkTexture *texture; + GError *error = NULL; + + texture = gdk_texture_new_from_file (file, &error); + + if (texture) + g_task_return_pointer (task, texture, g_object_unref); + else + g_task_return_error (task, error); +} + +static void +set_wait_cursor (GtkWidget *widget) +{ + gtk_widget_set_cursor_from_name (GTK_WIDGET (gtk_widget_get_root (widget)), "wait"); +} + +static void +unset_wait_cursor (GtkWidget *widget) +{ + gtk_widget_set_cursor (GTK_WIDGET (gtk_widget_get_root (widget)), NULL); +} + +static void +texture_loaded (GObject *source, + GAsyncResult *result, + gpointer data) +{ + GdkTexture *texture; + GError *error = NULL; + + texture = g_task_propagate_pointer (G_TASK (result), &error); + + if (!texture) + { + g_print ("%s\n", error->message); + g_error_free (error); + return; + } + + if (!window) + { + g_object_unref (texture); + return; + } + + unset_wait_cursor (GTK_WIDGET (data)); + + g_object_set (G_OBJECT (data), "texture", texture, NULL); +} + +static void +open_file_async (GFile *file, + GtkWidget *demo) +{ + GTask *task; + + set_wait_cursor (demo); + + task = g_task_new (demo, cancellable, texture_loaded, demo); + g_task_set_task_data (task, g_object_ref (file), g_object_unref); + g_task_run_in_thread (task, load_texture); + g_object_unref (task); +} + +static void +open_portland_rose (GtkWidget *button, + GtkWidget *demo) +{ + GFile *file; + + file = g_file_new_for_uri ("resource:///transparent/portland-rose.jpg"); + open_file_async (file, demo); + g_object_unref (file); +} + +static void +open_large_image (GtkWidget *button, + GtkWidget *demo) +{ + GFile *file; + + file = g_file_new_for_uri ("resource:///org/gtk/Demo4/large-image.png"); + open_file_async (file, demo); + g_object_unref (file); +} + static void file_opened (GObject *source, GAsyncResult *result, @@ -21,7 +118,6 @@ file_opened (GObject *source, { GFile *file; GError *error = NULL; - GdkTexture *texture; file = gtk_file_dialog_open_finish (GTK_FILE_DIALOG (source), result, &error); @@ -32,17 +128,9 @@ file_opened (GObject *source, return; } - texture = gdk_texture_new_from_file (file, &error); - g_object_unref (file); - if (!texture) - { - g_print ("%s\n", error->message); - g_error_free (error); - return; - } + open_file_async (file, data); - g_object_set (G_OBJECT (data), "texture", texture, NULL); - g_object_unref (texture); + g_object_unref (file); } static void @@ -116,11 +204,26 @@ transform_from (GBinding *binding, return TRUE; } +static void +free_cancellable (gpointer data) +{ + g_cancellable_cancel (cancellable); + g_clear_object (&cancellable); +} + +static gboolean +cancel_load (GtkWidget *widget, + GVariant *args, + gpointer data) +{ + unset_wait_cursor (widget); + g_cancellable_cancel (G_CANCELLABLE (data)); + return TRUE; +} + GtkWidget * do_image_scaling (GtkWidget *do_widget) { - static GtkWidget *window = NULL; - if (!window) { GtkWidget *box; @@ -130,6 +233,7 @@ do_image_scaling (GtkWidget *do_widget) GtkWidget *scale; GtkWidget *dropdown; GtkWidget *button; + GtkEventController *controller; window = gtk_window_new (); gtk_window_set_title (GTK_WINDOW (window), "Image Scaling"); @@ -138,6 +242,20 @@ do_image_scaling (GtkWidget *do_widget) gtk_widget_get_display (do_widget)); g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window); + cancellable = g_cancellable_new (); + g_object_set_data_full (G_OBJECT (window), "cancellable", + cancellable, free_cancellable); + + controller = gtk_shortcut_controller_new (); + gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller), + gtk_shortcut_new ( + gtk_keyval_trigger_new (GDK_KEY_Escape, 0), + gtk_callback_action_new (cancel_load, cancellable, NULL) + )); + gtk_shortcut_controller_set_scope (GTK_SHORTCUT_CONTROLLER (controller), + GTK_SHORTCUT_SCOPE_GLOBAL); + gtk_widget_add_controller (window, controller); + box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_window_set_child (GTK_WINDOW (window), box); @@ -156,6 +274,22 @@ do_image_scaling (GtkWidget *do_widget) g_signal_connect (button, "clicked", G_CALLBACK (open_file), widget); gtk_box_append (GTK_BOX (box2), button); + button = gtk_button_new (); + gtk_button_set_child (GTK_BUTTON (button), + gtk_image_new_from_resource ("/org/gtk/Demo4/portland-rose-thumbnail.png")); + gtk_widget_add_css_class (button, "image-button"); + gtk_widget_set_tooltip_text (button, "Portland Rose"); + g_signal_connect (button, "clicked", G_CALLBACK (open_portland_rose), widget); + gtk_box_append (GTK_BOX (box2), button); + + button = gtk_button_new (); + gtk_button_set_child (GTK_BUTTON (button), + gtk_image_new_from_resource ("/org/gtk/Demo4/large-image-thumbnail.png")); + gtk_widget_add_css_class (button, "image-button"); + gtk_widget_set_tooltip_text (button, "Large image"); + g_signal_connect (button, "clicked", G_CALLBACK (open_large_image), widget); + gtk_box_append (GTK_BOX (box2), button); + button = gtk_button_new_from_icon_name ("object-rotate-right-symbolic"); gtk_widget_set_tooltip_text (button, "Rotate"); g_signal_connect (button, "clicked", G_CALLBACK (rotate), widget); @@ -191,7 +325,9 @@ do_image_scaling (GtkWidget *do_widget) if (!gtk_widget_get_visible (window)) gtk_widget_set_visible (window, TRUE); else - gtk_window_destroy (GTK_WINDOW (window)); + { + gtk_window_destroy (GTK_WINDOW (window)); + } return window; } diff --git a/demos/gtk-demo/large-image-thumbnail.png b/demos/gtk-demo/large-image-thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..d383d8bbf4e3b412cf41e930d185ca58c1a99b7d GIT binary patch literal 16973 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 MN;ecs~4gdfE literal 0 HcmV?d00001 diff --git a/demos/gtk-demo/large-image.png b/demos/gtk-demo/large-image.png new file mode 100644 index 0000000000000000000000000000000000000000..0ddeaef501cde186604b3734bf9dd1d7c84954d3 GIT binary patch literal 636767 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 NKl{Enzn=8W{|6|Y)p-B_ literal 0 HcmV?d00001 diff --git a/demos/gtk-demo/portland-rose-thumbnail.png b/demos/gtk-demo/portland-rose-thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..d3838ddb174b65af37be4166b6d8cc5803c81ea8 GIT binary patch literal 3618 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 Suy6r%14er0y4Bj3qW=dZR}bv~ literal 0 HcmV?d00001