1 /*
2  * Copyright (C) 2006 Nokia Corporation.
3  * Author: Xan Lopez <xan.lopez@nokia.com>
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public License
7  * version 2.1 as published by the Free Software Foundation.
8  *
9  * This library is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library. If not, see <http://www.gnu.org/licenses/>.
16  *
17  */
18 
19 #include <gtk/gtk.h>
20 
21 static char *baseline_pos_str[] = {
22   "BASELINE_POSITION_TOP",
23   "BASELINE_POSITION_CENTER",
24   "BASELINE_POSITION_BOTTOM"
25 };
26 
27 static void
baseline_row_value_changed(GtkSpinButton * spin_button,GtkGrid * grid)28 baseline_row_value_changed (GtkSpinButton *spin_button,
29 			    GtkGrid *grid)
30 {
31   gint row = gtk_spin_button_get_value_as_int (spin_button);
32 
33   gtk_grid_set_baseline_row (grid, row);
34 }
35 
36 static void
homogeneous_changed(GtkToggleButton * toggle_button,GtkGrid * grid)37 homogeneous_changed (GtkToggleButton *toggle_button,
38 		    GtkGrid *grid)
39 {
40   gtk_grid_set_row_homogeneous (grid, gtk_toggle_button_get_active (toggle_button));
41 }
42 
43 static void
baseline_position_changed(GtkComboBox * combo,GtkBox * hbox)44 baseline_position_changed (GtkComboBox *combo,
45 			   GtkBox *hbox)
46 {
47   int i = gtk_combo_box_get_active (combo);
48 
49   gtk_box_set_baseline_position (hbox, i);
50 }
51 
52 static void
image_size_value_changed(GtkSpinButton * spin_button,GtkImage * image)53 image_size_value_changed (GtkSpinButton *spin_button,
54 			  GtkImage *image)
55 {
56   gint size = gtk_spin_button_get_value_as_int (spin_button);
57 
58   gtk_image_set_pixel_size (GTK_IMAGE (image), size);
59 }
60 
61 static void
set_font_size(GtkWidget * widget,gint size)62 set_font_size (GtkWidget *widget, gint size)
63 {
64   const gchar *class[3] = { "small-font", "medium-font", "large-font" };
65 
66   gtk_style_context_add_class (gtk_widget_get_style_context (widget), class[size]);
67 }
68 
69 int
main(int argc,char ** argv)70 main (int    argc,
71       char **argv)
72 {
73   GtkWidget *window, *label, *entry, *button, *grid, *notebook;
74   GtkWidget *vbox, *hbox, *grid_hbox, *spin, *spin2, *toggle, *combo, *image, *ebox;
75   GtkAdjustment *adjustment;
76   int i, j;
77   GtkCssProvider *provider;
78 
79   gtk_init (&argc, &argv);
80 
81   provider = gtk_css_provider_new ();
82   gtk_css_provider_load_from_data (provider,
83     ".small-font { font-size: 5px; }"
84     ".medium-font { font-size: 10px; }"
85     ".large-font { font-size: 15px; }", -1, NULL);
86   gtk_style_context_add_provider_for_screen (gdk_screen_get_default (),
87                                              GTK_STYLE_PROVIDER (provider),
88                                              GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
89   g_object_unref (provider);
90   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
91   g_signal_connect (G_OBJECT (window), "delete-event", G_CALLBACK (gtk_main_quit), NULL);
92 
93   notebook = gtk_notebook_new ();
94   gtk_container_add (GTK_CONTAINER (window), notebook);
95 
96   vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
97   gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
98 			    vbox, gtk_label_new ("hboxes"));
99 
100   for (j = 0; j < 2; j++)
101     {
102       char *aligns_names[] = { "FILL", "BASELINE" };
103       GtkAlign aligns[] = { GTK_ALIGN_FILL, GTK_ALIGN_BASELINE};
104 
105       hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
106       gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
107 
108       label = gtk_label_new (aligns_names[j]);
109       gtk_container_add (GTK_CONTAINER (hbox), label);
110 
111       for (i = 0; i < 3; i++) {
112 	label = gtk_label_new ("│XYyj,Ö...");
113 
114         set_font_size (label, i);
115 
116 	gtk_widget_set_valign (label, aligns[j]);
117 
118 	gtk_container_add (GTK_CONTAINER (hbox), label);
119       }
120 
121       for (i = 0; i < 3; i++) {
122 	entry = gtk_entry_new ();
123 	gtk_entry_set_text (GTK_ENTRY (entry), "│XYyj,Ö...");
124 
125         set_font_size (entry, i);
126 
127 	gtk_widget_set_valign (entry, aligns[j]);
128 
129 	gtk_container_add (GTK_CONTAINER (hbox), entry);
130       }
131 
132       spin = gtk_spin_button_new (NULL, 0, 1);
133       gtk_orientable_set_orientation (GTK_ORIENTABLE (spin), GTK_ORIENTATION_VERTICAL);
134       gtk_widget_set_valign (spin, aligns[j]);
135       gtk_container_add (GTK_CONTAINER (hbox), spin);
136     }
137 
138   grid_hbox = hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
139   gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
140 
141   combo = gtk_combo_box_text_new ();
142   gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), baseline_pos_str[0]);
143   gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), baseline_pos_str[1]);
144   gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), baseline_pos_str[2]);
145   gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 1);
146   gtk_container_add (GTK_CONTAINER (hbox), combo);
147 
148   for (j = 0; j < 2; j++)
149     {
150       hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
151       gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
152 
153       g_signal_connect (G_OBJECT (combo), "changed",
154 			G_CALLBACK (baseline_position_changed), hbox);
155 
156       if (j == 0)
157 	label = gtk_label_new ("Baseline:");
158       else
159 	label = gtk_label_new ("Normal:");
160       gtk_container_add (GTK_CONTAINER (hbox), label);
161 
162       for (i = 0; i < 3; i++)
163 	{
164 	  button = gtk_button_new_with_label ("│Xyj,Ö");
165 
166           set_font_size (button, i);
167 
168 	  if (j == 0)
169 	    gtk_widget_set_valign (button, GTK_ALIGN_BASELINE);
170 
171 	  gtk_container_add (GTK_CONTAINER (hbox), button);
172 	}
173 
174       for (i = 0; i < 3; i++)
175 	{
176 	  button = gtk_button_new_with_label ("│Xyj,Ö");
177 
178 	  gtk_button_set_image (GTK_BUTTON (button),
179 				gtk_image_new_from_icon_name ("face-sad", GTK_ICON_SIZE_BUTTON));
180 	  gtk_button_set_always_show_image (GTK_BUTTON (button), TRUE);
181 
182           set_font_size (button, i);
183 
184 	  if (j == 0)
185 	    gtk_widget_set_valign (button, GTK_ALIGN_BASELINE);
186 
187 	  gtk_container_add (GTK_CONTAINER (hbox), button);
188 	}
189 
190       ebox = gtk_event_box_new ();
191       if (j == 0)
192 	gtk_widget_set_valign (ebox, GTK_ALIGN_BASELINE);
193       gtk_container_add (GTK_CONTAINER (hbox), ebox);
194 
195       image = gtk_image_new_from_icon_name ("face-sad", GTK_ICON_SIZE_BUTTON);
196       gtk_image_set_pixel_size (GTK_IMAGE (image), 34);
197       if (j == 0)
198 	gtk_widget_set_valign (image, GTK_ALIGN_BASELINE);
199       gtk_container_add (GTK_CONTAINER (ebox), image);
200 
201       button = gtk_toggle_button_new_with_label ("│Xyj,Ö");
202       if (j == 0)
203 	gtk_widget_set_valign (button, GTK_ALIGN_BASELINE);
204       gtk_container_add (GTK_CONTAINER (hbox), button);
205 
206       button = gtk_toggle_button_new_with_label ("│Xyj,Ö");
207       gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), TRUE);
208       if (j == 0)
209 	gtk_widget_set_valign (button, GTK_ALIGN_BASELINE);
210       gtk_container_add (GTK_CONTAINER (hbox), button);
211 
212       button = gtk_check_button_new_with_label ("│Xyj,Ö");
213       if (j == 0)
214 	gtk_widget_set_valign (button, GTK_ALIGN_BASELINE);
215       gtk_container_add (GTK_CONTAINER (hbox), button);
216 
217       button = gtk_radio_button_new_with_label (NULL, "│Xyj,Ö");
218       if (j == 0)
219 	gtk_widget_set_valign (button, GTK_ALIGN_BASELINE);
220       gtk_container_add (GTK_CONTAINER (hbox), button);
221     }
222 
223 
224   vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
225   gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
226 			    vbox, gtk_label_new ("grid"));
227 
228   grid_hbox = hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
229   gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
230 
231   label = gtk_label_new ("Align me:");
232   gtk_widget_set_valign (label, GTK_ALIGN_BASELINE);
233 
234   gtk_container_add (GTK_CONTAINER (hbox), label);
235 
236   grid = gtk_grid_new ();
237   gtk_widget_set_valign (grid, GTK_ALIGN_BASELINE);
238   gtk_grid_set_column_spacing (GTK_GRID (grid), 8);
239   gtk_grid_set_row_spacing (GTK_GRID (grid), 8);
240 
241   for (j = 0; j < 4; j++)
242     {
243       char *labels[] = { "Normal:", "Baseline (top):", "Baseline (center):", "Baseline (bottom):"};
244       label = gtk_label_new (labels[j]);
245 
246       gtk_grid_attach (GTK_GRID (grid),
247 		       label,
248 		       0, j,
249 		       1, 1);
250       gtk_widget_set_vexpand (label, TRUE);
251 
252       if (j != 0)
253 	gtk_grid_set_row_baseline_position (GTK_GRID (grid),
254 					    j, (GtkBaselinePosition)(j-1));
255 
256       for (i = 0; i < 3; i++)
257 	{
258 	  label = gtk_label_new ("Xyjg,Ö.");
259 
260           set_font_size (label, i);
261 
262 	  if (j != 0)
263 	    gtk_widget_set_valign (label, GTK_ALIGN_BASELINE);
264 
265 	  gtk_grid_attach (GTK_GRID (grid),
266 			   label,
267 			   i+1, j,
268 			   1, 1);
269 	}
270 
271       for (i = 0; i < 3; i++)
272 	{
273 	  button = gtk_button_new_with_label ("│Xyj,Ö");
274 
275 	  gtk_button_set_image (GTK_BUTTON (button),
276 				gtk_image_new_from_icon_name ("face-sad", GTK_ICON_SIZE_BUTTON));
277 	  gtk_button_set_always_show_image (GTK_BUTTON (button), TRUE);
278 
279           set_font_size (button, i);
280 
281 	  if (j != 0)
282 	    gtk_widget_set_valign (button, GTK_ALIGN_BASELINE);
283 
284 	  gtk_grid_attach (GTK_GRID (grid),
285 			   button,
286 			   i+4, j,
287 			   1, 1);
288 	}
289 
290     }
291 
292   gtk_container_add (GTK_CONTAINER (hbox), grid);
293 
294   hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
295   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
296 
297   adjustment = gtk_adjustment_new (0.0, -1.0, 5.0, 1.0, 1.0, 0.0);
298   spin = gtk_spin_button_new (adjustment, 1.0, 0);
299   g_signal_connect (spin, "value-changed", (GCallback)baseline_row_value_changed, grid);
300   gtk_container_add (GTK_CONTAINER (hbox), spin);
301 
302   toggle = gtk_toggle_button_new_with_label ("Homogeneous");
303   g_signal_connect (toggle, "toggled", (GCallback)homogeneous_changed, grid);
304   gtk_container_add (GTK_CONTAINER (hbox), toggle);
305 
306   combo = gtk_combo_box_text_new ();
307   gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), baseline_pos_str[0]);
308   gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), baseline_pos_str[1]);
309   gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), baseline_pos_str[2]);
310   gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 1);
311   g_signal_connect (G_OBJECT (combo), "changed",
312 		    G_CALLBACK (baseline_position_changed), grid_hbox);
313   gtk_container_add (GTK_CONTAINER (hbox), combo);
314 
315   vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
316   gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
317 			    vbox, gtk_label_new ("button box"));
318 
319   hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
320   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
321 
322   adjustment = gtk_adjustment_new (34.0, 1.0, 64.0, 1.0, 1.0, 0.0);
323   spin = gtk_spin_button_new (adjustment, 1.0, 0);
324   gtk_container_add (GTK_CONTAINER (hbox), spin);
325 
326   adjustment = gtk_adjustment_new (16.0, 1.0, 64.0, 1.0, 1.0, 0.0);
327   spin2 = gtk_spin_button_new (adjustment, 1.0, 0);
328   gtk_container_add (GTK_CONTAINER (hbox), spin2);
329 
330   for (j = 0; j < 3; j++)
331     {
332       hbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
333       gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
334 
335       gtk_box_set_baseline_position (GTK_BOX (hbox), j);
336 
337       label = gtk_label_new (baseline_pos_str[j]);
338       gtk_container_add (GTK_CONTAINER (hbox), label);
339       gtk_widget_set_vexpand (label, TRUE);
340 
341       image = gtk_image_new_from_icon_name ("face-sad", GTK_ICON_SIZE_BUTTON);
342       gtk_image_set_pixel_size (GTK_IMAGE (image), 34);
343       gtk_container_add (GTK_CONTAINER (hbox), image);
344 
345       g_signal_connect (spin, "value-changed", (GCallback)image_size_value_changed, image);
346 
347       for (i = 0; i < 3; i++)
348 	{
349 	  button = gtk_button_new_with_label ("│Xyj,Ö");
350 
351           set_font_size (button, i);
352 
353 	  if (i != 0)
354 	    gtk_widget_set_valign (button, GTK_ALIGN_BASELINE);
355 
356 	  gtk_container_add (GTK_CONTAINER (hbox), button);
357 	}
358 
359       for (i = 0; i < 3; i++)
360 	{
361 	  button = gtk_button_new_with_label ("│Xyj,Ö");
362 
363 	  image = gtk_image_new_from_icon_name ("face-sad", GTK_ICON_SIZE_BUTTON);
364 	  gtk_image_set_pixel_size (GTK_IMAGE (image), 16);
365 	  gtk_button_set_image (GTK_BUTTON (button), image);
366 	  if (i == 0)
367 	    g_signal_connect (spin2, "value-changed", (GCallback)image_size_value_changed, image);
368 	  gtk_button_set_always_show_image (GTK_BUTTON (button), TRUE);
369 
370           set_font_size (button, i);
371 
372 	  gtk_widget_set_valign (button, GTK_ALIGN_BASELINE);
373 
374 	  gtk_container_add (GTK_CONTAINER (hbox), button);
375 	}
376     }
377 
378   gtk_widget_show_all (window);
379 
380   gtk_main ();
381 
382   return 0;
383 }
384