[gtk/wip/otte/canvas: 2/8] demos: Add a Canvas Hello World demo




commit 2a1e88acbdc06f3c09bb31c557cb3a9669b85285
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]