]> Pileus Git - ~andy/gtk/blob - demos/gtk-demo/panes.c
gtk-demo: Move resources into the tests they belong
[~andy/gtk] / demos / gtk-demo / panes.c
1 /* Paned Widgets
2  *
3  * The GtkHPaned and GtkVPaned Widgets divide their content
4  * area into two panes with a divider in between that the
5  * user can adjust. A separate child is placed into each
6  * pane.
7  *
8  * There are a number of options that can be set for each pane.
9  * This test contains both a horizontal (HPaned) and a vertical
10  * (VPaned) widget, and allows you to adjust the options for
11  * each side of each widget.
12  */
13
14 #include <gtk/gtk.h>
15
16 void
17 toggle_resize (GtkWidget *widget,
18                GtkWidget *child)
19 {
20   GtkWidget *parent;
21   GtkPaned *paned;
22   gboolean is_child1;
23   gboolean resize, shrink;
24
25   parent = gtk_widget_get_parent (child);
26   paned = GTK_PANED (parent);
27
28   is_child1 = (child == gtk_paned_get_child1 (paned));
29
30   gtk_container_child_get (GTK_CONTAINER (paned), child,
31                            "resize", &resize,
32                            "shrink", &shrink,
33                            NULL);
34
35   g_object_ref (child);
36   gtk_container_remove (GTK_CONTAINER (parent), child);
37   if (is_child1)
38     gtk_paned_pack1 (paned, child, !resize, shrink);
39   else
40     gtk_paned_pack2 (paned, child, !resize, shrink);
41   g_object_unref (child);
42 }
43
44 void
45 toggle_shrink (GtkWidget *widget,
46                GtkWidget *child)
47 {
48   GtkWidget *parent;
49   GtkPaned *paned;
50   gboolean is_child1;
51   gboolean resize, shrink;
52
53   parent = gtk_widget_get_parent (child);
54   paned = GTK_PANED (parent);
55
56   is_child1 = (child == gtk_paned_get_child1 (paned));
57
58   gtk_container_child_get (GTK_CONTAINER (paned), child,
59                            "resize", &resize,
60                            "shrink", &shrink,
61                            NULL);
62
63   g_object_ref (child);
64   gtk_container_remove (GTK_CONTAINER (parent), child);
65   if (is_child1)
66     gtk_paned_pack1 (paned, child, resize, !shrink);
67   else
68     gtk_paned_pack2 (paned, child, resize, !shrink);
69   g_object_unref (child);
70 }
71
72 GtkWidget *
73 create_pane_options (GtkPaned    *paned,
74                      const gchar *frame_label,
75                      const gchar *label1,
76                      const gchar *label2)
77 {
78   GtkWidget *child1, *child2;
79   GtkWidget *frame;
80   GtkWidget *table;
81   GtkWidget *label;
82   GtkWidget *check_button;
83
84   child1 = gtk_paned_get_child1 (paned);
85   child2 = gtk_paned_get_child2 (paned);
86
87   frame = gtk_frame_new (frame_label);
88   gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
89
90   table = gtk_grid_new ();
91   gtk_container_add (GTK_CONTAINER (frame), table);
92
93   label = gtk_label_new (label1);
94   gtk_grid_attach (GTK_GRID (table), label, 0, 0, 1, 1);
95
96   check_button = gtk_check_button_new_with_mnemonic ("_Resize");
97   gtk_grid_attach (GTK_GRID (table), check_button, 0, 1, 1, 1);
98   g_signal_connect (check_button, "toggled",
99                     G_CALLBACK (toggle_resize), child1);
100
101   check_button = gtk_check_button_new_with_mnemonic ("_Shrink");
102   gtk_grid_attach (GTK_GRID (table), check_button, 0, 2, 1, 1);
103   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
104   g_signal_connect (check_button, "toggled",
105                     G_CALLBACK (toggle_shrink), child1);
106
107   label = gtk_label_new (label2);
108   gtk_grid_attach (GTK_GRID (table), label, 1, 0, 1, 1);
109
110   check_button = gtk_check_button_new_with_mnemonic ("_Resize");
111   gtk_grid_attach (GTK_GRID (table), check_button, 1, 1, 1, 1);
112   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
113   g_signal_connect (check_button, "toggled",
114                     G_CALLBACK (toggle_resize), child2);
115
116   check_button = gtk_check_button_new_with_mnemonic ("_Shrink");
117   gtk_grid_attach (GTK_GRID (table), check_button, 1, 2, 1, 1);
118   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
119   g_signal_connect (check_button, "toggled",
120                     G_CALLBACK (toggle_shrink), child2);
121
122   return frame;
123 }
124
125 GtkWidget *
126 do_panes (GtkWidget *do_widget)
127 {
128   static GtkWidget *window = NULL;
129   GtkWidget *frame;
130   GtkWidget *hpaned;
131   GtkWidget *vpaned;
132   GtkWidget *button;
133   GtkWidget *vbox;
134
135   if (!window)
136     {
137       window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
138       gtk_window_set_screen (GTK_WINDOW (window),
139                              gtk_widget_get_screen (do_widget));
140
141       g_signal_connect (window, "destroy",
142                         G_CALLBACK (gtk_widget_destroyed), &window);
143
144       gtk_window_set_title (GTK_WINDOW (window), "Panes");
145       gtk_container_set_border_width (GTK_CONTAINER (window), 0);
146
147       vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
148       gtk_container_add (GTK_CONTAINER (window), vbox);
149
150       vpaned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
151       gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
152       gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
153
154       hpaned = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
155       gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
156
157       frame = gtk_frame_new (NULL);
158       gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
159       gtk_widget_set_size_request (frame, 60, 60);
160       gtk_paned_add1 (GTK_PANED (hpaned), frame);
161
162       button = gtk_button_new_with_mnemonic ("_Hi there");
163       gtk_container_add (GTK_CONTAINER(frame), button);
164
165       frame = gtk_frame_new (NULL);
166       gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
167       gtk_widget_set_size_request (frame, 80, 60);
168       gtk_paned_add2 (GTK_PANED (hpaned), frame);
169
170       frame = gtk_frame_new (NULL);
171       gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
172       gtk_widget_set_size_request (frame, 60, 80);
173       gtk_paned_add2 (GTK_PANED (vpaned), frame);
174
175       /* Now create toggle buttons to control sizing */
176
177       gtk_box_pack_start (GTK_BOX (vbox),
178                           create_pane_options (GTK_PANED (hpaned),
179                                                "Horizontal",
180                                                "Left",
181                                                "Right"),
182                           FALSE, FALSE, 0);
183
184       gtk_box_pack_start (GTK_BOX (vbox),
185                           create_pane_options (GTK_PANED (vpaned),
186                                                "Vertical",
187                                                "Top",
188                                                "Bottom"),
189                           FALSE, FALSE, 0);
190
191       gtk_widget_show_all (vbox);
192     }
193
194   if (!gtk_widget_get_visible (window))
195     {
196       gtk_widget_show (window);
197     }
198   else
199     {
200       gtk_widget_destroy (window);
201       window = NULL;
202     }
203
204   return window;
205 }