]> Pileus Git - ~andy/gtk/blob - tests/testgrid.c
76d1a8cb526ac956413db6544507bf0581fdaa7e
[~andy/gtk] / tests / testgrid.c
1 #include <gtk/gtk.h>
2
3 static GtkWidget *
4 oriented_test_widget (const gchar *label, const gchar *color, gdouble angle)
5 {
6   GtkWidget *box;
7   GtkWidget *widget;
8   GdkColor c;
9
10   widget = gtk_label_new (label);
11   gtk_label_set_angle (GTK_LABEL (widget), angle);
12   box = gtk_event_box_new ();
13   gdk_color_parse (color, &c);
14   gtk_widget_modify_bg (box, GTK_STATE_NORMAL, &c);
15   gtk_container_add (GTK_CONTAINER (box), widget);
16
17   return box;
18 }
19
20 static GtkWidget *
21 test_widget (const gchar *label, const gchar *color)
22 {
23   return oriented_test_widget (label, color, 0.0);
24 }
25
26 static GtkOrientation o;
27
28 static gboolean
29 toggle_orientation (GtkWidget *window, GdkEventButton *event, GtkGrid *grid)
30 {
31   o = 1 - o;
32
33   gtk_orientable_set_orientation (GTK_ORIENTABLE (grid), o);
34
35   return FALSE;
36 }
37
38 static void
39 simple_grid (void)
40 {
41   GtkWidget *window;
42   GtkWidget *grid;
43   GtkWidget *child;
44
45   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
46   gtk_window_set_title (GTK_WINDOW (window), "Orientation");
47   grid = gtk_grid_new ();
48   gtk_container_add (GTK_CONTAINER (window), grid);
49   g_signal_connect (window, "button-press-event", G_CALLBACK (toggle_orientation), grid);
50
51   gtk_grid_set_column_spacing (GTK_GRID (grid), 5);
52   gtk_grid_set_row_spacing (GTK_GRID (grid), 5);
53   gtk_container_add (GTK_CONTAINER (grid), test_widget ("1", "red"));
54   gtk_container_add (GTK_CONTAINER (grid), test_widget ("2", "green"));
55   gtk_container_add (GTK_CONTAINER (grid), test_widget ("3", "blue"));
56   child = test_widget ("4", "green");
57   gtk_grid_attach (GTK_GRID (grid), child, 0, 1, 1, 1);
58   gtk_widget_set_vexpand (child, TRUE);
59   gtk_grid_attach_next_to (GTK_GRID (grid), test_widget ("5", "blue"), child, GTK_POS_RIGHT, 2, 1);
60   child = test_widget ("6", "yellow");
61   gtk_grid_attach (GTK_GRID (grid), child, -1, 0, 1, 2);
62   gtk_widget_set_hexpand (child, TRUE);
63
64   gtk_widget_show_all (window);
65 }
66
67 static void
68 text_grid (void)
69 {
70   GtkWidget *window;
71   GtkWidget *grid;
72   GtkWidget *paned1;
73   GtkWidget *box;
74   GtkWidget *label;
75
76   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
77   gtk_window_set_title (GTK_WINDOW (window), "Height-for-Width");
78   paned1 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
79   gtk_container_add (GTK_CONTAINER (window), paned1);
80
81   box = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
82   gtk_paned_pack1 (GTK_PANED (paned1), box, TRUE, FALSE);
83   gtk_paned_pack2 (GTK_PANED (paned1), gtk_label_new ("Space"), TRUE, FALSE);
84
85   grid = gtk_grid_new ();
86   gtk_orientable_set_orientation (GTK_ORIENTABLE (grid), GTK_ORIENTATION_VERTICAL);
87   gtk_container_add (GTK_CONTAINER (box), gtk_label_new ("Above"));
88   gtk_container_add (GTK_CONTAINER (box), gtk_separator_new (GTK_ORIENTATION_HORIZONTAL));
89   gtk_container_add (GTK_CONTAINER (box), grid);
90   gtk_container_add (GTK_CONTAINER (box), gtk_separator_new (GTK_ORIENTATION_HORIZONTAL));
91   gtk_container_add (GTK_CONTAINER (box), gtk_label_new ("Below"));
92
93   label = gtk_label_new ("Some text that may wrap if it has to");
94   gtk_label_set_width_chars (GTK_LABEL (label), 10);
95   gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
96   gtk_grid_attach (GTK_GRID (grid), label, 0, 0, 1, 1);
97
98   gtk_grid_attach (GTK_GRID (grid), test_widget ("1", "red"), 1, 0, 1, 1);
99   gtk_grid_attach (GTK_GRID (grid), test_widget ("2", "blue"), 0, 1, 1, 1);
100
101   label = gtk_label_new ("Some text that may wrap if it has to");
102   gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
103   gtk_label_set_width_chars (GTK_LABEL (label), 10);
104   gtk_grid_attach (GTK_GRID (grid), label, 1, 1, 1, 1);
105
106   gtk_widget_show_all (window);
107 }
108
109 static void
110 box_comparison (void)
111 {
112   GtkWidget *window;
113   GtkWidget *vbox;
114   GtkWidget *box;
115   GtkWidget *label;
116   GtkWidget *grid;
117
118   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
119   gtk_window_set_title (GTK_WINDOW (window), "Grid vs. Box");
120   vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 5);
121   gtk_container_add (GTK_CONTAINER (window), vbox);
122
123   gtk_container_add (GTK_CONTAINER (vbox), gtk_label_new ("Above"));
124   gtk_container_add (GTK_CONTAINER (vbox), gtk_separator_new (GTK_ORIENTATION_HORIZONTAL));
125
126   box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
127   gtk_container_add (GTK_CONTAINER (vbox), box);
128
129   gtk_box_pack_start (GTK_BOX (box), test_widget ("1", "white"), FALSE, FALSE, 0);
130
131   label = gtk_label_new ("Some ellipsizing text");
132   gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
133   gtk_label_set_width_chars (GTK_LABEL (label), 10);
134   gtk_box_pack_start (GTK_BOX (box), label, TRUE, FALSE, 0);
135
136   gtk_box_pack_start (GTK_BOX (box), test_widget ("2", "green"), FALSE, FALSE, 0);
137
138   label = gtk_label_new ("Some text that may wrap if needed");
139   gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
140   gtk_label_set_width_chars (GTK_LABEL (label), 10);
141   gtk_box_pack_start (GTK_BOX (box), label, TRUE, FALSE, 0);
142
143   gtk_box_pack_start (GTK_BOX (box), test_widget ("3", "red"), FALSE, FALSE, 0);
144
145   grid = gtk_grid_new ();
146   gtk_orientable_set_orientation (GTK_ORIENTABLE (grid), GTK_ORIENTATION_VERTICAL);
147   gtk_container_add (GTK_CONTAINER (vbox), gtk_separator_new (GTK_ORIENTATION_HORIZONTAL));
148   gtk_container_add (GTK_CONTAINER (vbox), grid);
149
150   gtk_grid_attach (GTK_GRID (grid), test_widget ("1", "white"), 0, 0, 1, 1);
151
152   label = gtk_label_new ("Some ellipsizing text");
153   gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
154   gtk_label_set_width_chars (GTK_LABEL (label), 10);
155   gtk_grid_attach (GTK_GRID (grid), label, 1, 0, 1, 1);
156   gtk_widget_set_hexpand (label, TRUE);
157
158   gtk_grid_attach (GTK_GRID (grid), test_widget ("2", "green"), 2, 0, 1, 1);
159
160   label = gtk_label_new ("Some text that may wrap if needed");
161   gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
162   gtk_label_set_width_chars (GTK_LABEL (label), 10);
163   gtk_grid_attach (GTK_GRID (grid), label, 3, 0, 1, 1);
164   gtk_widget_set_hexpand (label, TRUE);
165
166   gtk_grid_attach (GTK_GRID (grid), test_widget ("3", "red"), 4, 0, 1, 1);
167
168   gtk_container_add (GTK_CONTAINER (vbox), gtk_separator_new (GTK_ORIENTATION_HORIZONTAL));
169   gtk_container_add (GTK_CONTAINER (vbox), gtk_label_new ("Below"));
170
171   gtk_widget_show_all (window);
172 }
173
174 static void
175 empty_line (void)
176 {
177   GtkWidget *window;
178   GtkWidget *grid;
179   GtkWidget *child;
180
181   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
182   gtk_window_set_title (GTK_WINDOW (window), "Empty row");
183   grid = gtk_grid_new ();
184   gtk_container_add (GTK_CONTAINER (window), grid);
185
186   gtk_grid_set_row_spacing (GTK_GRID (grid), 10);
187   gtk_grid_set_column_spacing (GTK_GRID (grid), 10);
188
189   child = test_widget ("(0, 0)", "red");
190   gtk_grid_attach (GTK_GRID (grid), child, 0, 0, 1, 1);
191   gtk_widget_set_hexpand (child, TRUE);
192   gtk_widget_set_vexpand (child, TRUE);
193
194   gtk_grid_attach (GTK_GRID (grid), test_widget ("(0, 1)", "blue"), 0, 1, 1, 1);
195
196   gtk_grid_attach (GTK_GRID (grid), test_widget ("(10, 0)", "green"), 10, 0, 1, 1);
197   gtk_grid_attach (GTK_GRID (grid), test_widget ("(10, 1)", "magenta"), 10, 1, 1, 1);
198
199   gtk_widget_show_all (window);
200 }
201
202 static void
203 scrolling (void)
204 {
205   GtkWidget *window;
206   GtkWidget *sw;
207   GtkWidget *viewport;
208   GtkWidget *grid;
209   GtkWidget *child;
210   gint i;
211
212   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
213   gtk_window_set_title (GTK_WINDOW (window), "Scrolling");
214   sw = gtk_scrolled_window_new (NULL, NULL);
215   viewport = gtk_viewport_new (NULL, NULL);
216   grid = gtk_grid_new ();
217
218   gtk_container_add (GTK_CONTAINER (window), sw);
219   gtk_container_add (GTK_CONTAINER (sw), viewport);
220   gtk_container_add (GTK_CONTAINER (viewport), grid);
221
222   child = oriented_test_widget ("#800080", "#800080", -45.0);
223   gtk_grid_attach (GTK_GRID (grid), child, 0, 0, 1, 1);
224   gtk_widget_set_hexpand (child, TRUE);
225   gtk_widget_set_vexpand (child, TRUE);
226
227   for (i = 1; i < 16; i++)
228     {
229       gchar *color;
230       color = g_strdup_printf ("#%02x00%02x", 128 + 8*i, 128 - 8*i);
231       child = test_widget (color, color);
232       gtk_grid_attach (GTK_GRID (grid), child, 0, i, i + 1, 1);
233       gtk_widget_set_hexpand (child, TRUE);
234       g_free (color);
235     }
236
237   for (i = 1; i < 16; i++)
238     {
239       gchar *color;
240       color = g_strdup_printf ("#%02x00%02x", 128 - 8*i, 128 + 8*i);
241       child = oriented_test_widget (color, color, -90.0);
242       gtk_grid_attach (GTK_GRID (grid), child, i, 0, 1, i);
243       gtk_widget_set_vexpand (child, TRUE);
244       g_free (color);
245     }
246
247   gtk_widget_show_all (window);
248 }
249
250 int
251 main (int argc, char *argv[])
252 {
253   gtk_init (NULL, NULL);
254
255   simple_grid ();
256   text_grid ();
257   box_comparison ();
258   empty_line ();
259   scrolling ();
260
261   gtk_main ();
262
263   return 0;
264 }