[gtk] Add a test for the grid layout manager
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk] Add a test for the grid layout manager
- Date: Fri, 28 Jun 2019 13:30:31 +0000 (UTC)
commit c4fd786866a2d8e757499f3f2d35f221d416de04
Author: Matthias Clasen <mclasen redhat com>
Date: Fri Jun 28 13:28:46 2019 +0000
Add a test for the grid layout manager
Test some obvious conditions. This is mainly
to test the waters for more intesting tests
with other layout managers later.
testsuite/gtk/grid-layout.c | 312 ++++++++++++++++++++++++++++++++++++++++++++
testsuite/gtk/meson.build | 1 +
2 files changed, 313 insertions(+)
---
diff --git a/testsuite/gtk/grid-layout.c b/testsuite/gtk/grid-layout.c
new file mode 100644
index 0000000000..134766bef1
--- /dev/null
+++ b/testsuite/gtk/grid-layout.c
@@ -0,0 +1,312 @@
+/* Copyright (C) 2019 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+#include <gtk/gtk.h>
+
+#define GTK_TYPE_GIZMO (gtk_gizmo_get_type ())
+#define GTK_GIZMO(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_GIZMO, GtkGizmo))
+#define GTK_GIZMO_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_GIZMO, GtkGizmoClass))
+#define GTK_IS_GIZMO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_GIZMO))
+#define GTK_IS_GIZMO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_GIZMO))
+#define GTK_GIZMO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_GIZMO, GtkGizmoClass))
+
+typedef struct _GtkGizmo GtkGizmo;
+
+struct _GtkGizmo {
+ GtkWidget parent;
+
+ const char *name;
+ int min_width;
+ int min_height;
+ int nat_width;
+ int nat_height;
+ int width;
+ int height;
+};
+
+typedef GtkWidgetClass GtkGizmoClass;
+
+G_DEFINE_TYPE (GtkGizmo, gtk_gizmo, GTK_TYPE_WIDGET);
+
+static void
+gtk_gizmo_measure (GtkWidget *widget,
+ GtkOrientation orientation,
+ int for_size,
+ int *minimum,
+ int *natural,
+ int *minimum_baseline,
+ int *natural_baseline)
+{
+ GtkGizmo *self = GTK_GIZMO (widget);
+
+ if (orientation == GTK_ORIENTATION_HORIZONTAL)
+ {
+ *minimum = self->min_width;
+ *natural = self->nat_width;
+ }
+ else
+ {
+ *minimum = self->min_height;
+ *natural = self->nat_height;
+ }
+}
+
+static void
+gtk_gizmo_size_allocate (GtkWidget *widget,
+ int width,
+ int height,
+ int baseline)
+{
+ GtkGizmo *self = GTK_GIZMO (widget);
+
+ self->width = width;
+ self->height = height;
+}
+
+static void
+gtk_gizmo_class_init (GtkGizmoClass *klass)
+{
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+ widget_class->measure = gtk_gizmo_measure;
+ widget_class->size_allocate = gtk_gizmo_size_allocate;
+}
+
+static void
+gtk_gizmo_init (GtkGizmo *self)
+{
+}
+
+/* Create a grid with three children in row
+ *
+ * +--------+--------+--------+
+ * | child1 | child2 | child3 |
+ * +--------+--------+--------+
+ *
+ * Verify that
+ * - the layout has the expected min and nat sizes
+ * - the children get their nat width when the layout does
+ * - they all get the same height
+ */
+static void
+test_simple_row (void)
+{
+ GtkWidget *window;
+ GtkWidget *parent;
+ GtkLayoutManager *layout;
+ GtkGizmo *child1;
+ GtkGizmo *child2;
+ GtkGizmo *child3;
+ GtkLayoutChild *lc;
+ int minimum, natural;
+
+ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ parent = g_object_new (GTK_TYPE_GIZMO, NULL);
+ gtk_container_add (GTK_CONTAINER (window), parent);
+
+ layout = gtk_grid_layout_new ();
+ gtk_widget_set_layout_manager (parent, layout);
+
+ child1 = g_object_new (GTK_TYPE_GIZMO, NULL);
+ child2 = g_object_new (GTK_TYPE_GIZMO, NULL);
+ child3 = g_object_new (GTK_TYPE_GIZMO, NULL);
+
+ child1->name = "child1";
+ child1->min_width = 10;
+ child1->min_height = 10;
+ child1->nat_width = 20;
+ child1->nat_height = 20;
+ child2->name = "child2";
+ child2->min_width = 20;
+ child2->min_height = 20;
+ child2->nat_width = 30;
+ child2->nat_height = 30;
+ child3->name = "child3";
+ child3->min_width = 30;
+ child3->min_height = 30;
+ child3->nat_width = 40;
+ child3->nat_height = 40;
+
+ gtk_widget_set_parent (GTK_WIDGET (child1), parent);
+ gtk_widget_set_parent (GTK_WIDGET (child2), parent);
+ gtk_widget_set_parent (GTK_WIDGET (child3), parent);
+
+ lc = gtk_layout_manager_get_layout_child (layout, GTK_WIDGET (child1));
+ gtk_grid_layout_child_set_left_attach (GTK_GRID_LAYOUT_CHILD (lc), 0);
+ lc = gtk_layout_manager_get_layout_child (layout, GTK_WIDGET (child2));
+ gtk_grid_layout_child_set_left_attach (GTK_GRID_LAYOUT_CHILD (lc), 1);
+ lc = gtk_layout_manager_get_layout_child (layout, GTK_WIDGET (child3));
+ gtk_grid_layout_child_set_left_attach (GTK_GRID_LAYOUT_CHILD (lc), 2);
+
+#if 0
+ gtk_widget_show (window);
+
+ g_timeout_add (1000, (GSourceFunc)gtk_main_quit, NULL);
+ gtk_main ();
+#endif
+
+ gtk_layout_manager_measure (layout,
+ parent,
+ GTK_ORIENTATION_HORIZONTAL,
+ -1,
+ &minimum,
+ &natural,
+ NULL,
+ NULL);
+
+ g_assert (minimum == 10 + 20 + 30);
+ g_assert (natural == 20 + 30 + 40);
+
+ gtk_layout_manager_measure (layout,
+ parent,
+ GTK_ORIENTATION_VERTICAL,
+ -1,
+ &minimum,
+ &natural,
+ NULL,
+ NULL);
+
+ g_assert (minimum == 30);
+ g_assert (natural == 40);
+
+ gtk_layout_manager_allocate (layout, parent, 90, 40, 0);
+
+ g_assert (child1->width == 20);
+ g_assert (child2->width == 30);
+ g_assert (child3->width == 40);
+
+ g_assert (child1->height == 40);
+ g_assert (child2->height == 40);
+ g_assert (child3->height == 40);
+
+ gtk_widget_unparent (GTK_WIDGET (child1));
+ gtk_widget_unparent (GTK_WIDGET (child2));
+ gtk_widget_unparent (GTK_WIDGET (child3));
+
+ gtk_widget_destroy (parent);
+}
+
+/* same as the previous test, with a column
+ */
+static void
+test_simple_column (void)
+{
+ GtkWidget *window;
+ GtkWidget *parent;
+ GtkLayoutManager *layout;
+ GtkGizmo *child1;
+ GtkGizmo *child2;
+ GtkGizmo *child3;
+ GtkLayoutChild *lc;
+ int minimum, natural;
+
+ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ parent = g_object_new (GTK_TYPE_GIZMO, NULL);
+ gtk_container_add (GTK_CONTAINER (window), parent);
+
+ layout = gtk_grid_layout_new ();
+ gtk_widget_set_layout_manager (parent, layout);
+
+ child1 = g_object_new (GTK_TYPE_GIZMO, NULL);
+ child2 = g_object_new (GTK_TYPE_GIZMO, NULL);
+ child3 = g_object_new (GTK_TYPE_GIZMO, NULL);
+
+ child1->name = "child1";
+ child1->min_width = 10;
+ child1->min_height = 10;
+ child1->nat_width = 20;
+ child1->nat_height = 20;
+ child2->name = "child2";
+ child2->min_width = 20;
+ child2->min_height = 20;
+ child2->nat_width = 30;
+ child2->nat_height = 30;
+ child3->name = "child3";
+ child3->min_width = 30;
+ child3->min_height = 30;
+ child3->nat_width = 40;
+ child3->nat_height = 40;
+
+ gtk_widget_set_parent (GTK_WIDGET (child1), parent);
+ gtk_widget_set_parent (GTK_WIDGET (child2), parent);
+ gtk_widget_set_parent (GTK_WIDGET (child3), parent);
+
+ lc = gtk_layout_manager_get_layout_child (layout, GTK_WIDGET (child1));
+ gtk_grid_layout_child_set_top_attach (GTK_GRID_LAYOUT_CHILD (lc), 0);
+ lc = gtk_layout_manager_get_layout_child (layout, GTK_WIDGET (child2));
+ gtk_grid_layout_child_set_top_attach (GTK_GRID_LAYOUT_CHILD (lc), 1);
+ lc = gtk_layout_manager_get_layout_child (layout, GTK_WIDGET (child3));
+ gtk_grid_layout_child_set_top_attach (GTK_GRID_LAYOUT_CHILD (lc), 2);
+
+#if 0
+ gtk_widget_show (window);
+
+ g_timeout_add (1000, (GSourceFunc)gtk_main_quit, NULL);
+ gtk_main ();
+#endif
+
+ gtk_layout_manager_measure (layout,
+ parent,
+ GTK_ORIENTATION_HORIZONTAL,
+ -1,
+ &minimum,
+ &natural,
+ NULL,
+ NULL);
+
+ g_assert (minimum == 30);
+ g_assert (natural == 40);
+
+ gtk_layout_manager_measure (layout,
+ parent,
+ GTK_ORIENTATION_VERTICAL,
+ -1,
+ &minimum,
+ &natural,
+ NULL,
+ NULL);
+
+ g_assert (minimum == 10 + 20 + 30);
+ g_assert (natural == 20 + 30 + 40);
+
+ gtk_layout_manager_allocate (layout, parent, 40, 90, 0);
+
+ g_assert (child1->width == 40);
+ g_assert (child2->width == 40);
+ g_assert (child3->width == 40);
+
+ g_assert (child1->height == 20);
+ g_assert (child2->height == 30);
+ g_assert (child3->height == 40);
+
+ gtk_widget_unparent (GTK_WIDGET (child1));
+ gtk_widget_unparent (GTK_WIDGET (child2));
+ gtk_widget_unparent (GTK_WIDGET (child3));
+
+ gtk_widget_destroy (parent);
+}
+
+int
+main (int argc,
+ char *argv[])
+{
+ gtk_test_init (&argc, &argv);
+
+ g_test_add_func ("/grid-layout/row", test_simple_row);
+ g_test_add_func ("/grid-layout/column", test_simple_column);
+
+
+ return g_test_run();
+}
diff --git a/testsuite/gtk/meson.build b/testsuite/gtk/meson.build
index 88016781ed..afa5c3c7dd 100644
--- a/testsuite/gtk/meson.build
+++ b/testsuite/gtk/meson.build
@@ -28,6 +28,7 @@ tests = [
['focus'],
['gestures'],
['grid'],
+ ['grid-layout'],
['gtkmenu'],
['icontheme'],
['keyhash', ['../../gtk/gtkkeyhash.c', gtkresources, '../../gtk/gtkprivate.c'], gtk_cargs],
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]