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