]> Pileus Git - ~andy/gtk/blob - demos/gtk-demo/css_accordion.c
gtk-demo: Add a CSS shadows demo
[~andy/gtk] / demos / gtk-demo / css_accordion.c
1 /* CSS Theming/CSS Accordion :: css_accordion.css
2  *
3  * A simple accordion demo written using CSS transitions and multiple backgrounds
4  *
5  */
6
7 #include <gtk/gtk.h>
8
9 static GtkWidget *window = NULL;
10
11 static void
12 apply_css (GtkWidget *widget, GtkStyleProvider *provider)
13 {
14   gtk_style_context_add_provider (gtk_widget_get_style_context (widget), provider, G_MAXUINT);
15   if (GTK_IS_CONTAINER (widget))
16     gtk_container_forall (GTK_CONTAINER (widget), (GtkCallback) apply_css, provider);
17 }
18
19 GtkWidget *
20 do_css_accordion (GtkWidget *do_widget)
21 {
22   if (!window)
23     {
24       GtkWidget *container, *child;
25       GtkStyleProvider *provider;
26       GBytes *bytes;
27       gsize data_size;
28       const guint8 *data;
29
30       window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
31       gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
32       gtk_window_set_default_size (GTK_WINDOW (window), 600, 300);
33       g_signal_connect (window, "destroy",
34                         G_CALLBACK (gtk_widget_destroyed), &window);
35       
36       container = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
37       gtk_widget_set_halign (container, GTK_ALIGN_CENTER);
38       gtk_widget_set_valign (container, GTK_ALIGN_CENTER);
39       gtk_container_add (GTK_CONTAINER (window), container);
40
41       child = gtk_button_new_with_label ("This");
42       gtk_container_add (GTK_CONTAINER (container), child);
43
44       child = gtk_button_new_with_label ("Is");
45       gtk_container_add (GTK_CONTAINER (container), child);
46
47       child = gtk_button_new_with_label ("A");
48       gtk_container_add (GTK_CONTAINER (container), child);
49
50       child = gtk_button_new_with_label ("CSS");
51       gtk_container_add (GTK_CONTAINER (container), child);
52
53       child = gtk_button_new_with_label ("Accordion");
54       gtk_container_add (GTK_CONTAINER (container), child);
55
56       child = gtk_button_new_with_label (":-)");
57       gtk_container_add (GTK_CONTAINER (container), child);
58
59       provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
60       bytes = g_resources_lookup_data ("/css_accordion/gtk.css", 0, NULL);
61       data = g_bytes_get_data (bytes, &data_size);
62
63       gtk_css_provider_load_from_data (GTK_CSS_PROVIDER (provider), (gchar *)data, data_size, NULL);
64       g_bytes_unref (bytes);
65
66       apply_css (window, provider);
67     }
68
69   if (!gtk_widget_get_visible (window))
70     gtk_widget_show_all (window);
71   else
72     {
73       gtk_widget_destroy (window);
74       window = NULL;
75     }
76
77   return window;
78 }