]> Pileus Git - ~andy/gtk/blob - demos/gtk-demo/panes.c
Use accessor functions to access GtkPaned
[~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   GtkPaned *paned = GTK_PANED (child->parent);
21   gboolean is_child1 = (child == gtk_paned_get_child1 (paned));
22   gboolean resize, shrink;
23
24   gtk_container_child_get (GTK_CONTAINER (paned), child,
25                            "resize", &resize,
26                            "shrink", &shrink,
27                            NULL);
28
29   g_object_ref (child);
30   gtk_container_remove (GTK_CONTAINER (child->parent), child);
31   if (is_child1)
32     gtk_paned_pack1 (paned, child, !resize, shrink);
33   else
34     gtk_paned_pack2 (paned, child, !resize, shrink);
35   g_object_unref (child);
36 }
37
38 void
39 toggle_shrink (GtkWidget *widget,
40                GtkWidget *child)
41 {
42   GtkPaned *paned = GTK_PANED (child->parent);
43   gboolean is_child1 = (child == gtk_paned_get_child1 (paned));
44   gboolean resize, shrink;
45
46   gtk_container_child_get (GTK_CONTAINER (paned), child,
47                            "resize", &resize,
48                            "shrink", &shrink,
49                            NULL);
50
51   g_object_ref (child);
52   gtk_container_remove (GTK_CONTAINER (child->parent), child);
53   if (is_child1)
54     gtk_paned_pack1 (paned, child, resize, !shrink);
55   else
56     gtk_paned_pack2 (paned, child, resize, !shrink);
57   g_object_unref (child);
58 }
59
60 GtkWidget *
61 create_pane_options (GtkPaned    *paned,
62                      const gchar *frame_label,
63                      const gchar *label1,
64                      const gchar *label2)
65 {
66   GtkWidget *child1, *child2;
67   GtkWidget *frame;
68   GtkWidget *table;
69   GtkWidget *label;
70   GtkWidget *check_button;
71
72   child1 = gtk_paned_get_child1 (paned);
73   child2 = gtk_paned_get_child2 (paned);
74
75   frame = gtk_frame_new (frame_label);
76   gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
77   
78   table = gtk_table_new (3, 2, TRUE);
79   gtk_container_add (GTK_CONTAINER (frame), table);
80   
81   label = gtk_label_new (label1);
82   gtk_table_attach_defaults (GTK_TABLE (table), label,
83                              0, 1, 0, 1);
84   
85   check_button = gtk_check_button_new_with_mnemonic ("_Resize");
86   gtk_table_attach_defaults (GTK_TABLE (table), check_button,
87                              0, 1, 1, 2);
88   g_signal_connect (check_button, "toggled",
89                     G_CALLBACK (toggle_resize), child1);
90
91   check_button = gtk_check_button_new_with_mnemonic ("_Shrink");
92   gtk_table_attach_defaults (GTK_TABLE (table), check_button,
93                              0, 1, 2, 3);
94   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
95                                TRUE);
96   g_signal_connect (check_button, "toggled",
97                     G_CALLBACK (toggle_shrink), child1);
98
99   label = gtk_label_new (label2);
100   gtk_table_attach_defaults (GTK_TABLE (table), label,
101                              1, 2, 0, 1);
102   
103   check_button = gtk_check_button_new_with_mnemonic ("_Resize");
104   gtk_table_attach_defaults (GTK_TABLE (table), check_button,
105                              1, 2, 1, 2);
106   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
107                                TRUE);
108   g_signal_connect (check_button, "toggled",
109                     G_CALLBACK (toggle_resize), child2);
110
111   check_button = gtk_check_button_new_with_mnemonic ("_Shrink");
112   gtk_table_attach_defaults (GTK_TABLE (table), check_button,
113                              1, 2, 2, 3);
114   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
115                                TRUE);
116   g_signal_connect (check_button, "toggled",
117                     G_CALLBACK (toggle_shrink), child2);
118
119   return frame;
120 }
121
122 GtkWidget *
123 do_panes (GtkWidget *do_widget)
124 {
125   static GtkWidget *window = NULL;
126   GtkWidget *frame;
127   GtkWidget *hpaned;
128   GtkWidget *vpaned;
129   GtkWidget *button;
130   GtkWidget *vbox;
131
132   if (!window)
133     {
134       window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
135       gtk_window_set_screen (GTK_WINDOW (window),
136                              gtk_widget_get_screen (do_widget));
137
138       g_signal_connect (window, "destroy",
139                         G_CALLBACK (gtk_widget_destroyed), &window);
140
141       gtk_window_set_title (GTK_WINDOW (window), "Panes");
142       gtk_container_set_border_width (GTK_CONTAINER (window), 0);
143
144       vbox = gtk_vbox_new (FALSE, 0);
145       gtk_container_add (GTK_CONTAINER (window), vbox);
146       
147       vpaned = gtk_vpaned_new ();
148       gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
149       gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
150
151       hpaned = gtk_hpaned_new ();
152       gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
153
154       frame = gtk_frame_new (NULL);
155       gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
156       gtk_widget_set_size_request (frame, 60, 60);
157       gtk_paned_add1 (GTK_PANED (hpaned), frame);
158       
159       button = gtk_button_new_with_mnemonic ("_Hi there");
160       gtk_container_add (GTK_CONTAINER(frame), button);
161
162       frame = gtk_frame_new (NULL);
163       gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
164       gtk_widget_set_size_request (frame, 80, 60);
165       gtk_paned_add2 (GTK_PANED (hpaned), frame);
166
167       frame = gtk_frame_new (NULL);
168       gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
169       gtk_widget_set_size_request (frame, 60, 80);
170       gtk_paned_add2 (GTK_PANED (vpaned), frame);
171
172       /* Now create toggle buttons to control sizing */
173
174       gtk_box_pack_start (GTK_BOX (vbox),
175                           create_pane_options (GTK_PANED (hpaned),
176                                                "Horizontal",
177                                                "Left",
178                                                "Right"),
179                           FALSE, FALSE, 0);
180
181       gtk_box_pack_start (GTK_BOX (vbox),
182                           create_pane_options (GTK_PANED (vpaned),
183                                                "Vertical",
184                                                "Top",
185                                                "Bottom"),
186                           FALSE, FALSE, 0);
187
188       gtk_widget_show_all (vbox);
189     }
190
191   if (!gtk_widget_get_visible (window))
192     {
193       gtk_widget_show (window);
194     }
195   else
196     {
197       gtk_widget_destroy (window);
198       window = NULL;
199     }
200
201   return window;
202 }