]> Pileus Git - ~andy/gtk/blob - demos/gtk-demo/panes.c
gtk: remove "gboolean homogeneous" from gtk_box_new()
[~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_table_new (3, 2, TRUE);
91   gtk_container_add (GTK_CONTAINER (frame), table);
92   
93   label = gtk_label_new (label1);
94   gtk_table_attach_defaults (GTK_TABLE (table), label,
95                              0, 1, 0, 1);
96   
97   check_button = gtk_check_button_new_with_mnemonic ("_Resize");
98   gtk_table_attach_defaults (GTK_TABLE (table), check_button,
99                              0, 1, 1, 2);
100   g_signal_connect (check_button, "toggled",
101                     G_CALLBACK (toggle_resize), child1);
102
103   check_button = gtk_check_button_new_with_mnemonic ("_Shrink");
104   gtk_table_attach_defaults (GTK_TABLE (table), check_button,
105                              0, 1, 2, 3);
106   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
107                                TRUE);
108   g_signal_connect (check_button, "toggled",
109                     G_CALLBACK (toggle_shrink), child1);
110
111   label = gtk_label_new (label2);
112   gtk_table_attach_defaults (GTK_TABLE (table), label,
113                              1, 2, 0, 1);
114   
115   check_button = gtk_check_button_new_with_mnemonic ("_Resize");
116   gtk_table_attach_defaults (GTK_TABLE (table), check_button,
117                              1, 2, 1, 2);
118   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
119                                TRUE);
120   g_signal_connect (check_button, "toggled",
121                     G_CALLBACK (toggle_resize), child2);
122
123   check_button = gtk_check_button_new_with_mnemonic ("_Shrink");
124   gtk_table_attach_defaults (GTK_TABLE (table), check_button,
125                              1, 2, 2, 3);
126   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
127                                TRUE);
128   g_signal_connect (check_button, "toggled",
129                     G_CALLBACK (toggle_shrink), child2);
130
131   return frame;
132 }
133
134 GtkWidget *
135 do_panes (GtkWidget *do_widget)
136 {
137   static GtkWidget *window = NULL;
138   GtkWidget *frame;
139   GtkWidget *hpaned;
140   GtkWidget *vpaned;
141   GtkWidget *button;
142   GtkWidget *vbox;
143
144   if (!window)
145     {
146       window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
147       gtk_window_set_screen (GTK_WINDOW (window),
148                              gtk_widget_get_screen (do_widget));
149
150       g_signal_connect (window, "destroy",
151                         G_CALLBACK (gtk_widget_destroyed), &window);
152
153       gtk_window_set_title (GTK_WINDOW (window), "Panes");
154       gtk_container_set_border_width (GTK_CONTAINER (window), 0);
155
156       vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
157       gtk_container_add (GTK_CONTAINER (window), vbox);
158
159       vpaned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
160       gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
161       gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
162
163       hpaned = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
164       gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
165
166       frame = gtk_frame_new (NULL);
167       gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
168       gtk_widget_set_size_request (frame, 60, 60);
169       gtk_paned_add1 (GTK_PANED (hpaned), frame);
170       
171       button = gtk_button_new_with_mnemonic ("_Hi there");
172       gtk_container_add (GTK_CONTAINER(frame), button);
173
174       frame = gtk_frame_new (NULL);
175       gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
176       gtk_widget_set_size_request (frame, 80, 60);
177       gtk_paned_add2 (GTK_PANED (hpaned), frame);
178
179       frame = gtk_frame_new (NULL);
180       gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
181       gtk_widget_set_size_request (frame, 60, 80);
182       gtk_paned_add2 (GTK_PANED (vpaned), frame);
183
184       /* Now create toggle buttons to control sizing */
185
186       gtk_box_pack_start (GTK_BOX (vbox),
187                           create_pane_options (GTK_PANED (hpaned),
188                                                "Horizontal",
189                                                "Left",
190                                                "Right"),
191                           FALSE, FALSE, 0);
192
193       gtk_box_pack_start (GTK_BOX (vbox),
194                           create_pane_options (GTK_PANED (vpaned),
195                                                "Vertical",
196                                                "Top",
197                                                "Bottom"),
198                           FALSE, FALSE, 0);
199
200       gtk_widget_show_all (vbox);
201     }
202
203   if (!gtk_widget_get_visible (window))
204     {
205       gtk_widget_show (window);
206     }
207   else
208     {
209       gtk_widget_destroy (window);
210       window = NULL;
211     }
212
213   return window;
214 }