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