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