]> Pileus Git - ~andy/gtk/blob - tests/testtreemenu.c
Added orientation control to the treemenu test.
[~andy/gtk] / tests / testtreemenu.c
1 #include <gtk/gtk.h>
2 #include "cellareascaffold.h"
3
4
5 /*******************************************************
6  *                       Grid Test                     *
7  *******************************************************/
8 static GdkPixbuf *
9 create_color_pixbuf (const char *color)
10 {
11   GdkPixbuf *pixbuf;
12   GdkColor col;
13
14   int x;
15   int num;
16   int rowstride;
17   guchar *pixels, *p;
18   
19   if (!gdk_color_parse (color, &col))
20     return NULL;
21   
22   pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
23                            FALSE, 8,
24                            16, 16);
25   
26   rowstride = gdk_pixbuf_get_rowstride (pixbuf);
27   p = pixels = gdk_pixbuf_get_pixels (pixbuf);
28   
29   num = gdk_pixbuf_get_width (pixbuf) *
30     gdk_pixbuf_get_height (pixbuf);
31   
32   for (x = 0; x < num; x++) {
33     p[0] = col.red / 65535 * 255;
34     p[1] = col.green / 65535 * 255;
35     p[2] = col.blue / 65535 * 255;
36     p += 3;
37   }
38   
39   return pixbuf;
40 }
41
42 static GtkWidget *
43 create_menu_grid_demo (void)
44 {
45   GtkWidget *menu;
46   GtkTreeIter iter;
47   GdkPixbuf *pixbuf;
48   GtkCellRenderer *cell = gtk_cell_renderer_pixbuf_new ();
49   GtkListStore *store;
50   
51   store = gtk_list_store_new (1, GDK_TYPE_PIXBUF);
52
53   menu = gtk_tree_menu_new_full (NULL, GTK_TREE_MODEL (store), NULL);
54   gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (menu), cell, TRUE);
55   gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (menu), cell, "pixbuf", 0, NULL);
56   
57   gtk_tree_menu_set_wrap_width (GTK_TREE_MENU (menu), 3);
58
59   /* first row */
60   pixbuf = create_color_pixbuf ("red");
61   gtk_list_store_append (store, &iter);
62   gtk_list_store_set (store, &iter,
63                       0, pixbuf,
64                       -1);
65   g_object_unref (pixbuf);
66   
67   pixbuf = create_color_pixbuf ("green");
68   gtk_list_store_append (store, &iter);
69   gtk_list_store_set (store, &iter,
70                       0, pixbuf,
71                       -1);
72   g_object_unref (pixbuf);
73   
74   pixbuf = create_color_pixbuf ("blue");
75   gtk_list_store_append (store, &iter);
76   gtk_list_store_set (store, &iter,
77                       0, pixbuf,
78                       -1);
79   g_object_unref (pixbuf);
80   
81   /* second row */
82   pixbuf = create_color_pixbuf ("yellow");
83   gtk_list_store_append (store, &iter);
84   gtk_list_store_set (store, &iter,
85                       0, pixbuf,
86                       -1);
87   g_object_unref (pixbuf);
88   
89   pixbuf = create_color_pixbuf ("black");
90   gtk_list_store_append (store, &iter);
91   gtk_list_store_set (store, &iter,
92                       0, pixbuf,
93                       -1);
94   g_object_unref (pixbuf);
95   
96   pixbuf = create_color_pixbuf ("white");
97   gtk_list_store_append (store, &iter);
98   gtk_list_store_set (store, &iter,
99                       0, pixbuf,
100                       -1);
101   g_object_unref (pixbuf);
102   
103   /* third row */
104   pixbuf = create_color_pixbuf ("gray");
105   gtk_list_store_append (store, &iter);
106   gtk_list_store_set (store, &iter,
107                       0, pixbuf,
108                       -1);
109   g_object_unref (pixbuf);
110   
111   pixbuf = create_color_pixbuf ("snow");
112   gtk_list_store_append (store, &iter);
113   gtk_list_store_set (store, &iter,
114                       0, pixbuf,
115                       -1);
116   g_object_unref (pixbuf);
117   
118   pixbuf = create_color_pixbuf ("magenta");
119   gtk_list_store_append (store, &iter);
120   gtk_list_store_set (store, &iter,
121                       0, pixbuf,
122                       -1);
123   g_object_unref (pixbuf);
124
125   g_object_unref (store);
126   
127   return menu;
128 }
129
130 /*******************************************************
131  *                      Simple Test                    *
132  *******************************************************/
133 enum {
134   SIMPLE_COLUMN_NAME,
135   SIMPLE_COLUMN_ICON,
136   SIMPLE_COLUMN_DESCRIPTION,
137   N_SIMPLE_COLUMNS
138 };
139
140 static GtkCellRenderer *cell_1 = NULL, *cell_2 = NULL, *cell_3 = NULL;
141
142 static GtkTreeModel *
143 simple_tree_model (void)
144 {
145   GtkTreeIter   iter, parent, child;
146   GtkTreeStore *store = 
147     gtk_tree_store_new (N_SIMPLE_COLUMNS,
148                         G_TYPE_STRING,  /* name text */
149                         G_TYPE_STRING,  /* icon name */
150                         G_TYPE_STRING); /* description text */
151
152
153   gtk_tree_store_append (store, &parent, NULL);
154   gtk_tree_store_set (store, &parent, 
155                       SIMPLE_COLUMN_NAME, "Alice in wonderland",
156                       SIMPLE_COLUMN_ICON, "gtk-execute",
157                       SIMPLE_COLUMN_DESCRIPTION, 
158                       "Twas brillig, and the slithy toves "
159                       "did gyre and gimble in the wabe",
160                       -1);
161
162   gtk_tree_store_append (store, &iter, &parent);
163   gtk_tree_store_set (store, &iter, 
164                       SIMPLE_COLUMN_NAME, "Go ask",
165                       SIMPLE_COLUMN_ICON, "gtk-zoom-out",
166                       SIMPLE_COLUMN_DESCRIPTION, "One pill makes you shorter",
167                       -1);
168
169   gtk_tree_store_append (store, &iter, &parent);
170   gtk_tree_store_set (store, &iter, 
171                       SIMPLE_COLUMN_NAME, "Alice",
172                       SIMPLE_COLUMN_ICON, "gtk-zoom-in",
173                       SIMPLE_COLUMN_DESCRIPTION, "Another one makes you tall",
174                       -1);
175
176   gtk_tree_store_append (store, &iter, &parent);
177   gtk_tree_store_set (store, &iter, 
178                       SIMPLE_COLUMN_NAME, "Jefferson Airplane",
179                       SIMPLE_COLUMN_ICON, "gtk-zoom-fit",
180                       SIMPLE_COLUMN_DESCRIPTION, "The one's that mother gives you dont do anything at all",
181                       -1);
182
183   gtk_tree_store_append (store, &iter, NULL);
184   gtk_tree_store_set (store, &iter, 
185                       SIMPLE_COLUMN_NAME, "Marry Poppins",
186                       SIMPLE_COLUMN_ICON, "gtk-yes",
187                       SIMPLE_COLUMN_DESCRIPTION, "Supercalifragilisticexpialidocious",
188                       -1);
189
190   gtk_tree_store_append (store, &iter, NULL);
191   gtk_tree_store_set (store, &iter, 
192                       SIMPLE_COLUMN_NAME, "George Bush",
193                       SIMPLE_COLUMN_ICON, "gtk-dialog-question",
194                       SIMPLE_COLUMN_DESCRIPTION, "It's a very good question, very direct, "
195                       "and I'm not going to answer it",
196                       -1);
197
198   gtk_tree_store_append (store, &parent, NULL);
199   gtk_tree_store_set (store, &parent, 
200                       SIMPLE_COLUMN_NAME, "Whinnie the pooh",
201                       SIMPLE_COLUMN_ICON, "gtk-stop",
202                       SIMPLE_COLUMN_DESCRIPTION, "The most wonderful thing about tiggers, "
203                       "is tiggers are wonderful things",
204                       -1);
205
206   gtk_tree_store_append (store, &iter, &parent);
207   gtk_tree_store_set (store, &iter, 
208                       SIMPLE_COLUMN_NAME, "Tigger",
209                       SIMPLE_COLUMN_ICON, "gtk-yes",
210                       SIMPLE_COLUMN_DESCRIPTION, "Eager",
211                       -1);
212
213   gtk_tree_store_append (store, &child, &iter);
214   gtk_tree_store_set (store, &child, 
215                       SIMPLE_COLUMN_NAME, "Jump",
216                       SIMPLE_COLUMN_ICON, "gtk-yes",
217                       SIMPLE_COLUMN_DESCRIPTION, "Very High",
218                       -1);
219
220   gtk_tree_store_append (store, &child, &iter);
221   gtk_tree_store_set (store, &child, 
222                       SIMPLE_COLUMN_NAME, "Pounce",
223                       SIMPLE_COLUMN_ICON, "gtk-no",
224                       SIMPLE_COLUMN_DESCRIPTION, "On Pooh",
225                       -1);
226
227   gtk_tree_store_append (store, &child, &iter);
228   gtk_tree_store_set (store, &child, 
229                       SIMPLE_COLUMN_NAME, "Bounce",
230                       SIMPLE_COLUMN_ICON, "gtk-cancel",
231                       SIMPLE_COLUMN_DESCRIPTION, "Around",
232                       -1);
233
234   gtk_tree_store_append (store, &iter, &parent);
235   gtk_tree_store_set (store, &iter, 
236                       SIMPLE_COLUMN_NAME, "Owl",
237                       SIMPLE_COLUMN_ICON, "gtk-stop",
238                       SIMPLE_COLUMN_DESCRIPTION, "Wise",
239                       -1);
240
241   gtk_tree_store_append (store, &iter, &parent);
242   gtk_tree_store_set (store, &iter, 
243                       SIMPLE_COLUMN_NAME, "Eor",
244                       SIMPLE_COLUMN_ICON, "gtk-no",
245                       SIMPLE_COLUMN_DESCRIPTION, "Depressed",
246                       -1);
247
248   gtk_tree_store_append (store, &iter, &parent);
249   gtk_tree_store_set (store, &iter, 
250                       SIMPLE_COLUMN_NAME, "Piglet",
251                       SIMPLE_COLUMN_ICON, "gtk-media-play",
252                       SIMPLE_COLUMN_DESCRIPTION, "Insecure",
253                       -1);
254
255   gtk_tree_store_append (store, &iter, NULL);
256   gtk_tree_store_set (store, &iter, 
257                       SIMPLE_COLUMN_NAME, "Aleister Crowley",
258                       SIMPLE_COLUMN_ICON, "gtk-about",
259                       SIMPLE_COLUMN_DESCRIPTION, 
260                       "Thou shalt do what thou wilt shall be the whole of the law",
261                       -1);
262
263   gtk_tree_store_append (store, &iter, NULL);
264   gtk_tree_store_set (store, &iter, 
265                       SIMPLE_COLUMN_NAME, "Mark Twain",
266                       SIMPLE_COLUMN_ICON, "gtk-quit",
267                       SIMPLE_COLUMN_DESCRIPTION, 
268                       "Giving up smoking is the easiest thing in the world. "
269                       "I know because I've done it thousands of times.",
270                       -1);
271
272
273   return (GtkTreeModel *)store;
274 }
275
276 static GtkWidget *
277 simple_tree_menu (void)
278 {
279   GtkTreeModel *model;
280   GtkWidget *menu;
281   GtkCellArea *area;
282   GtkCellRenderer *renderer;
283
284   model = simple_tree_model ();
285
286   menu = gtk_tree_menu_new ();
287   gtk_tree_menu_set_model (GTK_TREE_MENU (menu), model);
288   gtk_tree_menu_set_root (GTK_TREE_MENU (menu), NULL);
289
290   area = gtk_cell_layout_get_area (GTK_CELL_LAYOUT (menu));
291
292   cell_1 = renderer = gtk_cell_renderer_text_new ();
293   gtk_cell_area_box_pack_start (GTK_CELL_AREA_BOX (area), renderer, FALSE, FALSE);
294   gtk_cell_area_attribute_connect (area, renderer, "text", SIMPLE_COLUMN_NAME);
295
296   cell_2 = renderer = gtk_cell_renderer_pixbuf_new ();
297   g_object_set (G_OBJECT (renderer), "xalign", 0.0F, NULL);
298   gtk_cell_area_box_pack_start (GTK_CELL_AREA_BOX (area), renderer, TRUE, FALSE);
299   gtk_cell_area_attribute_connect (area, renderer, "stock-id", SIMPLE_COLUMN_ICON);
300
301   cell_3 = renderer = gtk_cell_renderer_text_new ();
302   g_object_set (G_OBJECT (renderer), 
303                 "wrap-mode", PANGO_WRAP_WORD,
304                 "wrap-width", 215,
305                 NULL);
306   gtk_cell_area_box_pack_start (GTK_CELL_AREA_BOX (area), renderer, FALSE, TRUE);
307   gtk_cell_area_attribute_connect (area, renderer, "text", SIMPLE_COLUMN_DESCRIPTION);
308
309   return menu;
310 }
311
312 static void
313 orientation_changed (GtkComboBox  *combo,
314                      GtkCellArea  *area)
315 {
316   GtkOrientation orientation = gtk_combo_box_get_active (combo);
317
318   gtk_orientable_set_orientation (GTK_ORIENTABLE (area), orientation);
319 }
320
321 static void
322 align_cell_2_toggled (GtkToggleButton  *toggle,
323                       GtkTreeMenu    *menu)
324 {
325   GtkCellArea *area = gtk_cell_layout_get_area (GTK_CELL_LAYOUT (menu));
326   gboolean     align = gtk_toggle_button_get_active (toggle);
327
328   gtk_cell_area_cell_set (area, cell_2, "align", align, NULL);
329 }
330
331 static void
332 align_cell_3_toggled (GtkToggleButton  *toggle,
333                       GtkTreeMenu    *menu)
334 {
335   GtkCellArea *area = gtk_cell_layout_get_area (GTK_CELL_LAYOUT (menu));
336   gboolean     align = gtk_toggle_button_get_active (toggle);
337
338   gtk_cell_area_cell_set (area, cell_3, "align", align, NULL);
339 }
340
341 static void
342 expand_cell_1_toggled (GtkToggleButton  *toggle,
343                        GtkTreeMenu      *menu)
344 {
345   GtkCellArea *area = gtk_cell_layout_get_area (GTK_CELL_LAYOUT (menu));
346   gboolean     expand = gtk_toggle_button_get_active (toggle);
347
348   gtk_cell_area_cell_set (area, cell_1, "expand", expand, NULL);
349 }
350
351 static void
352 expand_cell_2_toggled (GtkToggleButton  *toggle,
353                        GtkTreeMenu      *menu)
354 {
355   GtkCellArea *area = gtk_cell_layout_get_area (GTK_CELL_LAYOUT (menu));
356   gboolean     expand = gtk_toggle_button_get_active (toggle);
357
358   gtk_cell_area_cell_set (area, cell_2, "expand", expand, NULL);
359 }
360
361 static void
362 expand_cell_3_toggled (GtkToggleButton  *toggle,
363                        GtkTreeMenu      *menu)
364 {
365   GtkCellArea *area = gtk_cell_layout_get_area (GTK_CELL_LAYOUT (menu));
366   gboolean     expand = gtk_toggle_button_get_active (toggle);
367
368   gtk_cell_area_cell_set (area, cell_3, "expand", expand, NULL);
369 }
370
371 static void
372 menu_activated_cb (GtkTreeMenu *menu,
373                    const gchar *path,
374                    gpointer     unused)
375 {
376   GtkTreeModel *model = gtk_tree_menu_get_model (menu);
377   GtkTreeIter   iter;
378   gchar        *row_name;
379
380   if (!gtk_tree_model_get_iter_from_string (model, &iter, path))
381     return;
382
383   gtk_tree_model_get (model, &iter, SIMPLE_COLUMN_NAME, &row_name, -1);
384
385   g_print ("Item activated: %s\n", row_name);
386
387   g_free (row_name);
388 }
389
390 gboolean 
391 enable_submenu_headers (GtkTreeModel      *model,
392                         GtkTreeIter       *iter,
393                         gpointer           data)
394 {
395   return TRUE;
396 }
397
398
399 static void
400 submenu_headers_toggled (GtkToggleButton  *toggle,
401                          GtkTreeMenu      *menu)
402 {
403   if (gtk_toggle_button_get_active (toggle))
404     gtk_tree_menu_set_header_func (menu, enable_submenu_headers, NULL, NULL);
405   else
406     gtk_tree_menu_set_header_func (menu, NULL, NULL, NULL);
407 }
408
409 static void
410 tearoff_toggled (GtkToggleButton *toggle,
411                  GtkTreeMenu     *menu)
412 {
413   gtk_tree_menu_set_tearoff (menu, gtk_toggle_button_get_active (toggle));
414 }
415
416 static void
417 tree_menu (void)
418 {
419   GtkWidget *window, *widget;
420   GtkWidget *menu, *menubar, *vbox, *menuitem;
421   GtkCellArea *area;
422
423   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
424
425   gtk_window_set_title (GTK_WINDOW (window), "GtkTreeMenu");
426
427   vbox  = gtk_vbox_new (FALSE, 4);
428   gtk_widget_show (vbox);
429
430   menubar = gtk_menu_bar_new ();
431   gtk_widget_show (menubar);
432
433   menuitem = gtk_menu_item_new_with_label ("Grid");
434   menu = create_menu_grid_demo ();
435   gtk_widget_show (menu);
436   gtk_widget_show (menuitem);
437   gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
438   gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
439
440   menuitem = gtk_menu_item_new_with_label ("Tree");
441   menu = simple_tree_menu ();
442   gtk_widget_show (menu);
443   gtk_widget_show (menuitem);
444   gtk_menu_shell_prepend (GTK_MENU_SHELL (menubar), menuitem);
445   gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
446
447   g_signal_connect (menu, "menu-activate", G_CALLBACK (menu_activated_cb), NULL);
448
449   gtk_box_pack_start (GTK_BOX (vbox), menubar, FALSE, FALSE, 0);
450
451   /* Now add some controls */
452   widget = gtk_combo_box_text_new ();
453   gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "Horizontal");
454   gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "Vertical");
455   gtk_combo_box_set_active (GTK_COMBO_BOX (widget), 0);
456   gtk_widget_show (widget);
457   gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
458
459   area = gtk_tree_menu_get_area (GTK_TREE_MENU (menu));
460   g_signal_connect (G_OBJECT (widget), "changed",
461                     G_CALLBACK (orientation_changed), area);
462
463   widget = gtk_check_button_new_with_label ("Align 2nd Cell");
464   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE);
465   gtk_widget_show (widget);
466   gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
467   
468   g_signal_connect (G_OBJECT (widget), "toggled",
469                     G_CALLBACK (align_cell_2_toggled), menu);
470
471   widget = gtk_check_button_new_with_label ("Align 3rd Cell");
472   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
473   gtk_widget_show (widget);
474   gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
475   
476   g_signal_connect (G_OBJECT (widget), "toggled",
477                     G_CALLBACK (align_cell_3_toggled), menu);
478
479   widget = gtk_check_button_new_with_label ("Expand 1st Cell");
480   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE);
481   gtk_widget_show (widget);
482   gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
483   
484   g_signal_connect (G_OBJECT (widget), "toggled",
485                     G_CALLBACK (expand_cell_1_toggled), menu);
486
487   widget = gtk_check_button_new_with_label ("Expand 2nd Cell");
488   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
489   gtk_widget_show (widget);
490   gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
491   
492   g_signal_connect (G_OBJECT (widget), "toggled",
493                     G_CALLBACK (expand_cell_2_toggled), menu);
494
495   widget = gtk_check_button_new_with_label ("Expand 3rd Cell");
496   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE);
497   gtk_widget_show (widget);
498   gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
499   
500   g_signal_connect (G_OBJECT (widget), "toggled",
501                     G_CALLBACK (expand_cell_3_toggled), menu);
502
503   widget = gtk_check_button_new_with_label ("Submenu Headers");
504   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE);
505   gtk_widget_show (widget);
506   gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
507   
508   g_signal_connect (G_OBJECT (widget), "toggled",
509                     G_CALLBACK (submenu_headers_toggled), menu);
510
511   widget = gtk_check_button_new_with_label ("Tearoff menu");
512   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE);
513   gtk_widget_show (widget);
514   gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
515   
516   g_signal_connect (G_OBJECT (widget), "toggled",
517                     G_CALLBACK (tearoff_toggled), menu);
518
519   gtk_container_add (GTK_CONTAINER (window), vbox);
520
521   gtk_widget_show (window);
522 }
523
524 int
525 main (int argc, char *argv[])
526 {
527   gtk_init (NULL, NULL);
528
529   tree_menu ();
530
531   gtk_main ();
532
533   return 0;
534 }