From 7332b4f1d92880e14b2bc11eedda67bcc4f39ca3 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 13 Feb 2021 15:46:00 -0500 Subject: [PATCH] Add a test for popover positioning This is useful for testing the interaction of arrows, shadows or offsets with popover positioning. --- tests/meson.build | 1 + tests/testpopup.c | 131 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 132 insertions(+) create mode 100644 tests/testpopup.c diff --git a/tests/meson.build b/tests/meson.build index 783dd61914..c0e5f836b0 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -1,5 +1,6 @@ gtk_tests = [ # testname, optional extra sources + ['testpopup'], ['testupload'], ['testtransform'], ['testdropdown'], diff --git a/tests/testpopup.c b/tests/testpopup.c new file mode 100644 index 0000000000..265ba10e9b --- /dev/null +++ b/tests/testpopup.c @@ -0,0 +1,131 @@ +#include + +static void +update_offset (GObject *object, + GParamSpec *pspec, + GtkWidget *widget) +{ + if (gtk_check_button_get_active (GTK_CHECK_BUTTON (object))) + gtk_popover_set_offset (GTK_POPOVER (widget), 12, 12); + else + gtk_popover_set_offset (GTK_POPOVER (widget), 0, 0); +} + +static void +update_shadow (GObject *object, + GParamSpec *pspec, + GtkWidget *widget) +{ + const char *classes[] = { + "no-shadow", + "shadow1", + "shadow2", + "shadow3", + "shadow4", + }; + guint selected; + + selected = gtk_drop_down_get_selected (GTK_DROP_DOWN (object)); + g_assert (selected < G_N_ELEMENTS (classes)); + + for (int i = 0; i < G_N_ELEMENTS (classes); i++) + gtk_widget_remove_css_class (widget, classes[i]); + + gtk_widget_add_css_class (widget, classes[selected]); +} + +static const char css[] = + "popover.no-shadow > contents { box-shadow: none; }\n" + "popover.shadow1 > contents { box-shadow: 6px 6px rgba(128,0,255,0.5); }\n" + "popover.shadow2 > contents { box-shadow: -6px -6px rgba(255,0,0,0.5), 6px 6px rgba(128,0,255,0.5); }\n" + "popover.shadow3 > contents { box-shadow: -6px -6px rgba(255,0,0,0.5), 18px 18px rgba(128,0,255,0.5); }\n" + "popover.shadow4 > contents { box-shadow: -18px -18px rgba(255,0,0,0.5), 18px 18px rgba(128,0,255,0.5); }\n"; + +int +main (int argc, char *argv[]) +{ + GtkWidget *window; + GtkWidget *box; + GtkWidget *button; + GtkWidget *popover; + GtkWidget *box2; + GtkWidget *box3; + GtkWidget *checkbox; + GtkWidget *checkbox2; + GtkWidget *dropdown; + GtkWidget *dropdown2; + GtkCssProvider *provider; + + gtk_init (); + + provider = gtk_css_provider_new (); + gtk_css_provider_load_from_data (provider, css, -1); + + gtk_style_context_add_provider_for_display (gdk_display_get_default (), + GTK_STYLE_PROVIDER (provider), + 800); + + window = gtk_window_new (); + box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10); + g_object_set (box, + "margin-top", 20, + "margin-bottom", 20, + "margin-start", 20, + "margin-end", 20, + NULL); + + button = gtk_menu_button_new (); + + gtk_widget_set_halign (button, GTK_ALIGN_CENTER); + gtk_widget_set_valign (button, GTK_ALIGN_CENTER); + + gtk_box_append (GTK_BOX (box), button); + + popover = gtk_popover_new (); + box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10); + gtk_popover_set_child (GTK_POPOVER (popover), box2); + + gtk_box_append (GTK_BOX (box2), gtk_label_new ("First item")); + gtk_box_append (GTK_BOX (box2), gtk_label_new ("Second item")); + gtk_box_append (GTK_BOX (box2), gtk_label_new ("Third item")); + + gtk_menu_button_set_popover (GTK_MENU_BUTTON (button), popover); + + box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10); + dropdown = gtk_drop_down_new_from_strings ((const char*[]){ "Left", "Right", "Top", "Bottom", NULL }); + gtk_drop_down_set_selected (GTK_DROP_DOWN (dropdown), 3); + + checkbox = gtk_check_button_new_with_label ("Arrow"); + + checkbox2 = gtk_check_button_new_with_label ("Offset"); + + dropdown2 = gtk_drop_down_new_from_strings ((const char*[]){ "No Shadow", "Shadow 1", "Shadow 2", "Shadow 3", "Shadow 4", NULL }); + + gtk_box_append (GTK_BOX (box3), checkbox); + gtk_box_append (GTK_BOX (box3), checkbox2); + gtk_box_append (GTK_BOX (box3), dropdown); + gtk_box_append (GTK_BOX (box3), dropdown2); + + gtk_box_append (GTK_BOX (box), box3); + + g_object_bind_property (checkbox, "active", + popover, "has-arrow", + G_BINDING_SYNC_CREATE); + g_signal_connect (checkbox2, "notify::active", + G_CALLBACK (update_offset), popover); + g_object_bind_property (dropdown, "selected", + popover, "position", + G_BINDING_SYNC_CREATE); + g_signal_connect (dropdown2, "notify::selected", + G_CALLBACK (update_shadow), popover); + update_shadow (G_OBJECT (dropdown2), NULL, popover); + + gtk_window_set_child (GTK_WINDOW (window), box); + + gtk_window_present (GTK_WINDOW (window)); + + while (g_list_model_get_n_items (gtk_window_get_toplevels ()) > 0) + g_main_context_iteration (NULL, TRUE); + + return 0; +}