[gtk/matthiasc/for-master] gtk-demo: Add a gears demo
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/matthiasc/for-master] gtk-demo: Add a gears demo
- Date: Mon, 13 Apr 2020 02:32:09 +0000 (UTC)
commit ce6c7bae514b040b801dec0a13f1dbde8f6bc753
Author: Matthias Clasen <mclasen redhat com>
Date: Sun Apr 12 20:39:03 2020 -0400
gtk-demo: Add a gears demo
demos/gtk-demo/demo.gresource.xml | 5 ++
demos/gtk-demo/gears.c | 137 ++++++++++++++++++++++++++++++++++++++
demos/gtk-demo/meson.build | 1 +
3 files changed, 143 insertions(+)
---
diff --git a/demos/gtk-demo/demo.gresource.xml b/demos/gtk-demo/demo.gresource.xml
index f6477002ce..3afc75c7db 100644
--- a/demos/gtk-demo/demo.gresource.xml
+++ b/demos/gtk-demo/demo.gresource.xml
@@ -104,6 +104,10 @@
<file>gtkfishbowl.c</file>
<file>gtkfishbowl.h</file>
</gresource>
+ <gresource prefix="/gears">
+ <file>gtkgears.c</file>
+ <file>gtkgears.h</file>
+ </gresource>
<gresource prefix="/iconscroll">
<file>iconscroll.ui</file>
</gresource>
@@ -176,6 +180,7 @@
<file>font_features.c</file>
<file>fontplane.c</file>
<file>fontrendering.c</file>
+ <file>gears.c</file>
<file>gestures.c</file>
<file>glarea.c</file>
<file>headerbar.c</file>
diff --git a/demos/gtk-demo/gears.c b/demos/gtk-demo/gears.c
new file mode 100644
index 0000000000..3be4aa352b
--- /dev/null
+++ b/demos/gtk-demo/gears.c
@@ -0,0 +1,137 @@
+/* Gears
+ *
+ * This is a classic OpenGL demo, running in a GtkGLArea.
+ */
+
+
+#include <stdlib.h>
+#include <gtk/gtk.h>
+
+#include "gtkgears.h"
+
+/************************************************************************
+ * DEMO CODE *
+ ************************************************************************/
+
+static void
+on_axis_value_change (GtkAdjustment *adjustment,
+ gpointer data)
+{
+ GtkGears *gears = GTK_GEARS (data);
+ int axis = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (adjustment), "axis"));
+
+ gtk_gears_set_axis (gears, axis, gtk_adjustment_get_value (adjustment));
+}
+
+
+static GtkWidget *
+create_axis_slider (GtkGears *gears,
+ int axis)
+{
+ GtkWidget *box, *label, *slider;
+ GtkAdjustment *adj;
+ const char *text;
+
+ box = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE);
+
+ switch (axis)
+ {
+ case GTK_GEARS_X_AXIS:
+ text = "X";
+ break;
+
+ case GTK_GEARS_Y_AXIS:
+ text = "Y";
+ break;
+
+ case GTK_GEARS_Z_AXIS:
+ text = "Z";
+ break;
+
+ default:
+ g_assert_not_reached ();
+ }
+
+ label = gtk_label_new (text);
+ gtk_container_add (GTK_CONTAINER (box), label);
+ gtk_widget_show (label);
+
+ adj = gtk_adjustment_new (gtk_gears_get_axis (gears, axis), 0.0, 360.0, 1.0, 12.0, 0.0);
+ g_object_set_data (G_OBJECT (adj), "axis", GINT_TO_POINTER (axis));
+ g_signal_connect (adj, "value-changed",
+ G_CALLBACK (on_axis_value_change),
+ gears);
+ slider = gtk_scale_new (GTK_ORIENTATION_VERTICAL, adj);
+ gtk_scale_set_draw_value (GTK_SCALE (slider), FALSE);
+ gtk_container_add (GTK_CONTAINER (box), slider);
+ gtk_widget_set_vexpand (slider, TRUE);
+ gtk_widget_show (slider);
+
+ gtk_widget_show (box);
+
+ return box;
+}
+
+GtkWidget *
+do_gears (GtkWidget *do_widget)
+{
+ static GtkWidget *window = NULL;
+ GtkWidget *box, *hbox, *fps_label, *gears, *overlay, *frame;
+ int i;
+
+ if (!window)
+ {
+ window = gtk_window_new ();
+ gtk_window_set_title (GTK_WINDOW (window), "Gears");
+ gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
+ gtk_window_set_default_size (GTK_WINDOW (window), 640, 640);
+ g_signal_connect (window, "destroy", G_CALLBACK (gtk_widget_destroyed), &window);
+
+ overlay = gtk_overlay_new ();
+ gtk_widget_set_margin_start (overlay, 12);
+ gtk_widget_set_margin_end (overlay, 12);
+ gtk_widget_set_margin_top (overlay, 12);
+ gtk_widget_set_margin_bottom (overlay, 12);
+
+ gtk_container_add (GTK_CONTAINER (window), overlay);
+
+ frame = gtk_frame_new (NULL);
+ gtk_widget_set_halign (frame, GTK_ALIGN_START);
+ gtk_widget_set_valign (frame, GTK_ALIGN_START);
+ gtk_widget_add_css_class (frame, "app-notification");
+ gtk_overlay_add_overlay (GTK_OVERLAY (overlay), frame);
+
+ fps_label = gtk_label_new ("");
+ gtk_widget_set_halign (fps_label, GTK_ALIGN_START);
+ gtk_container_add (GTK_CONTAINER (frame), fps_label);
+
+ box = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE);
+ gtk_box_set_spacing (GTK_BOX (box), 6);
+ gtk_container_add (GTK_CONTAINER (overlay), box);
+
+ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE);
+ gtk_box_set_spacing (GTK_BOX (box), 6);
+ gtk_container_add (GTK_CONTAINER (box), hbox);
+
+ gears = gtk_gears_new ();
+ gtk_widget_set_hexpand (gears, TRUE);
+ gtk_widget_set_vexpand (gears, TRUE);
+ gtk_container_add (GTK_CONTAINER (hbox), gears);
+
+ for (i = 0; i < GTK_GEARS_N_AXIS; i++)
+ gtk_container_add (GTK_CONTAINER (hbox), create_axis_slider (GTK_GEARS (gears), i));
+
+ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE);
+ gtk_box_set_spacing (GTK_BOX (hbox), 6);
+ gtk_container_add (GTK_CONTAINER (box), hbox);
+
+ gtk_gears_set_fps_label (GTK_GEARS (gears), GTK_LABEL (fps_label));
+ }
+
+ if (!gtk_widget_get_visible (window))
+ gtk_widget_show (window);
+ else
+ gtk_widget_destroy (window);
+
+ return window;
+}
diff --git a/demos/gtk-demo/meson.build b/demos/gtk-demo/meson.build
index 8c2392c29e..8a4ad34d6e 100644
--- a/demos/gtk-demo/meson.build
+++ b/demos/gtk-demo/meson.build
@@ -28,6 +28,7 @@ demos = files([
'fishbowl.c',
'fixed.c',
'fontrendering.c',
+ 'gears.c',
'gestures.c',
'glarea.c',
'headerbar.c',
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]