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