[gtk/wip/otte/canvas: 17/36] demos: Add a Canvas Hello World demo
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/otte/canvas: 17/36] demos: Add a Canvas Hello World demo
- Date: Tue, 5 Jul 2022 05:41:41 +0000 (UTC)
commit 0ff8c77568db2a39ca006dee902e032367c09a82
Author: Benjamin Otte <otte redhat com>
Date: Tue Jun 28 13:55:52 2022 +0200
demos: Add a Canvas Hello World demo
demos/gtk-demo/canvas_intro.c | 79 +++++++++++++++++++++++++++++++++++++++
demos/gtk-demo/demo.gresource.xml | 1 +
demos/gtk-demo/meson.build | 1 +
3 files changed, 81 insertions(+)
---
diff --git a/demos/gtk-demo/canvas_intro.c b/demos/gtk-demo/canvas_intro.c
new file mode 100644
index 0000000000..3d3de59760
--- /dev/null
+++ b/demos/gtk-demo/canvas_intro.c
@@ -0,0 +1,79 @@
+/* Canvas/Intro
+ *
+ * GtkCanvas is a very powerful canvas widget. Here is
+ * a simple Hello World demo to get accustomed to how
+ * it works.
+ */
+
+#include <gtk/gtk.h>
+
+#define WIDTH 400
+#define HEIGHT 300
+
+static void
+bind_item (GtkListItemFactory *factory,
+ GtkCanvasItem *ci)
+{
+ GtkCanvasPoint *point;
+ GtkCanvasSize *size;
+ GtkCanvasBox *box;
+
+ gtk_canvas_item_set_widget (ci, gtk_canvas_item_get_item (ci));
+
+ /* Also center the item, so we do something interesting */
+ point = gtk_canvas_point_new (WIDTH / 2.0, HEIGHT / 2.0);
+ size = gtk_canvas_size_new_measure_item (ci, GTK_CANVAS_ITEM_MEASURE_MIN_FOR_MIN);
+ box = gtk_canvas_box_new (point, size, 0.5, 0.5);
+ gtk_canvas_item_set_bounds (ci, box);
+ gtk_canvas_box_free (box);
+ gtk_canvas_size_free (size);
+ gtk_canvas_point_free (point);
+}
+
+GtkWidget *
+do_canvas_intro (GtkWidget *do_widget)
+{
+ static GtkWidget *window = NULL;
+
+ if (!window)
+ {
+ GtkWidget *canvas, *widget;
+ GListStore *store;
+ GtkListItemFactory *factory;
+
+ window = gtk_window_new ();
+ gtk_window_set_display (GTK_WINDOW (window),
+ gtk_widget_get_display (do_widget));
+ gtk_window_set_default_size (GTK_WINDOW (window), WIDTH, HEIGHT);
+ g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
+
+ /* GtkCanvas manages its items using an external list.
+ * We do a very simple thing and put the widgets in the list
+ * that the canvas should display.
+ */
+ store = g_list_store_new (GTK_TYPE_WIDGET);
+ widget = gtk_label_new ("Hello World");
+ gtk_label_set_wrap (GTK_LABEL (widget), TRUE);
+ g_list_store_append (store, widget);
+
+ /* GtkCanvas maps the items from the list to the canvas using factories.
+ * Set up a simple factory here that just maps the widget directly
+ * onto the canvas.
+ */
+ factory = gtk_signal_list_item_factory_new ();
+ g_signal_connect (factory, "bind", G_CALLBACK (bind_item), NULL);
+
+ /* Create the canvas.
+ * We hand it the factory and the model, and then everything happens by itself.
+ */
+ canvas = gtk_canvas_new (G_LIST_MODEL (store), factory);
+ gtk_window_set_child (GTK_WINDOW (window), canvas);
+ }
+
+ if (!gtk_widget_get_visible (window))
+ gtk_widget_show (window);
+ else
+ gtk_window_destroy (GTK_WINDOW (window));
+
+ return window;
+}
diff --git a/demos/gtk-demo/demo.gresource.xml b/demos/gtk-demo/demo.gresource.xml
index 849ef462dc..ef3cb889b6 100644
--- a/demos/gtk-demo/demo.gresource.xml
+++ b/demos/gtk-demo/demo.gresource.xml
@@ -254,6 +254,7 @@
<file>application_demo.c</file>
<file>assistant.c</file>
<file>builder.c</file>
+ <file>canvas_intro.c</file>
<file>clipboard.c</file>
<file>combobox.c</file>
<file>constraints.c</file>
diff --git a/demos/gtk-demo/meson.build b/demos/gtk-demo/meson.build
index ef89fbc7d2..20c1b9e25f 100644
--- a/demos/gtk-demo/meson.build
+++ b/demos/gtk-demo/meson.build
@@ -4,6 +4,7 @@ demos = files([
'application_demo.c',
'assistant.c',
'builder.c',
+ 'canvas_intro.c',
'clipboard.c',
'combobox.c',
'constraints.c',
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]