2 #include "cellareascaffold.h"
5 /*******************************************************
7 *******************************************************/
9 #if _GTK_TREE_MENU_WAS_A_PUBLIC_CLASS_
11 create_color_pixbuf (const char *color)
21 if (!gdk_color_parse (color, &col))
24 pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
28 rowstride = gdk_pixbuf_get_rowstride (pixbuf);
29 p = pixels = gdk_pixbuf_get_pixels (pixbuf);
31 num = gdk_pixbuf_get_width (pixbuf) *
32 gdk_pixbuf_get_height (pixbuf);
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;
45 create_menu_grid_demo (void)
50 GtkCellRenderer *cell = gtk_cell_renderer_pixbuf_new ();
53 store = gtk_list_store_new (1, GDK_TYPE_PIXBUF);
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);
59 gtk_tree_menu_set_wrap_width (GTK_TREE_MENU (menu), 3);
62 pixbuf = create_color_pixbuf ("red");
63 gtk_list_store_append (store, &iter);
64 gtk_list_store_set (store, &iter,
67 g_object_unref (pixbuf);
69 pixbuf = create_color_pixbuf ("green");
70 gtk_list_store_append (store, &iter);
71 gtk_list_store_set (store, &iter,
74 g_object_unref (pixbuf);
76 pixbuf = create_color_pixbuf ("blue");
77 gtk_list_store_append (store, &iter);
78 gtk_list_store_set (store, &iter,
81 g_object_unref (pixbuf);
84 pixbuf = create_color_pixbuf ("yellow");
85 gtk_list_store_append (store, &iter);
86 gtk_list_store_set (store, &iter,
89 g_object_unref (pixbuf);
91 pixbuf = create_color_pixbuf ("black");
92 gtk_list_store_append (store, &iter);
93 gtk_list_store_set (store, &iter,
96 g_object_unref (pixbuf);
98 pixbuf = create_color_pixbuf ("white");
99 gtk_list_store_append (store, &iter);
100 gtk_list_store_set (store, &iter,
103 g_object_unref (pixbuf);
106 pixbuf = create_color_pixbuf ("gray");
107 gtk_list_store_append (store, &iter);
108 gtk_list_store_set (store, &iter,
111 g_object_unref (pixbuf);
113 pixbuf = create_color_pixbuf ("snow");
114 gtk_list_store_append (store, &iter);
115 gtk_list_store_set (store, &iter,
118 g_object_unref (pixbuf);
120 pixbuf = create_color_pixbuf ("magenta");
121 gtk_list_store_append (store, &iter);
122 gtk_list_store_set (store, &iter,
125 g_object_unref (pixbuf);
127 g_object_unref (store);
133 /*******************************************************
135 *******************************************************/
139 SIMPLE_COLUMN_DESCRIPTION,
143 static GtkCellRenderer *cell_1 = NULL, *cell_2 = NULL, *cell_3 = NULL;
145 static GtkTreeModel *
146 simple_tree_model (void)
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 */
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",
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",
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",
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",
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",
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",
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",
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",
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",
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",
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",
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",
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",
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",
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",
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.",
276 return (GtkTreeModel *)store;
280 create_cell_area (void)
283 GtkCellRenderer *renderer;
285 area = gtk_cell_area_box_new ();
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);
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);
296 cell_3 = renderer = gtk_cell_renderer_text_new ();
297 g_object_set (G_OBJECT (renderer),
298 "wrap-mode", PANGO_WRAP_WORD,
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);
307 #if _GTK_TREE_MENU_WAS_A_PUBLIC_CLASS_
309 simple_tree_menu (GtkCellArea *area)
314 model = simple_tree_model ();
316 menu = gtk_tree_menu_new_with_area (area);
317 gtk_tree_menu_set_model (GTK_TREE_MENU (menu), model);
324 orientation_changed (GtkComboBox *combo,
327 GtkOrientation orientation = gtk_combo_box_get_active (combo);
329 gtk_orientable_set_orientation (GTK_ORIENTABLE (area), orientation);
333 align_cell_2_toggled (GtkToggleButton *toggle,
336 gboolean align = gtk_toggle_button_get_active (toggle);
338 gtk_cell_area_cell_set (area, cell_2, "align", align, NULL);
342 align_cell_3_toggled (GtkToggleButton *toggle,
345 gboolean align = gtk_toggle_button_get_active (toggle);
347 gtk_cell_area_cell_set (area, cell_3, "align", align, NULL);
351 expand_cell_1_toggled (GtkToggleButton *toggle,
354 gboolean expand = gtk_toggle_button_get_active (toggle);
356 gtk_cell_area_cell_set (area, cell_1, "expand", expand, NULL);
360 expand_cell_2_toggled (GtkToggleButton *toggle,
363 gboolean expand = gtk_toggle_button_get_active (toggle);
365 gtk_cell_area_cell_set (area, cell_2, "expand", expand, NULL);
369 expand_cell_3_toggled (GtkToggleButton *toggle,
372 gboolean expand = gtk_toggle_button_get_active (toggle);
374 gtk_cell_area_cell_set (area, cell_3, "expand", expand, NULL);
378 enable_submenu_headers (GtkTreeModel *model,
386 #if _GTK_TREE_MENU_WAS_A_PUBLIC_CLASS_
388 menu_activated_cb (GtkTreeMenu *menu,
392 GtkTreeModel *model = gtk_tree_menu_get_model (menu);
396 if (!gtk_tree_model_get_iter_from_string (model, &iter, path))
399 gtk_tree_model_get (model, &iter, SIMPLE_COLUMN_NAME, &row_name, -1);
401 g_print ("Item activated: %s\n", row_name);
407 submenu_headers_toggled (GtkToggleButton *toggle,
410 if (gtk_toggle_button_get_active (toggle))
411 gtk_tree_menu_set_header_func (menu, enable_submenu_headers, NULL, NULL);
413 gtk_tree_menu_set_header_func (menu, NULL, NULL, NULL);
417 tearoff_toggled (GtkToggleButton *toggle,
420 gtk_tree_menu_set_tearoff (menu, gtk_toggle_button_get_active (toggle));
427 GtkWidget *window, *widget;
428 GtkWidget *menubar, *vbox;
432 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
434 gtk_window_set_title (GTK_WINDOW (window), "GtkTreeMenu");
436 vbox = gtk_vbox_new (FALSE, 4);
437 gtk_widget_show (vbox);
439 menubar = gtk_menu_bar_new ();
440 gtk_widget_show (menubar);
442 store = simple_tree_model ();
443 area = create_cell_area ();
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);
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);
460 g_signal_connect (menu, "menu-activate", G_CALLBACK (menu_activated_cb), NULL);
462 gtk_box_pack_start (GTK_BOX (vbox), menubar, FALSE, FALSE, 0);
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);
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);
480 g_signal_connect (G_OBJECT (widget), "changed",
481 G_CALLBACK (orientation_changed), area);
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);
488 g_signal_connect (G_OBJECT (widget), "toggled",
489 G_CALLBACK (align_cell_2_toggled), area);
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);
496 g_signal_connect (G_OBJECT (widget), "toggled",
497 G_CALLBACK (align_cell_3_toggled), area);
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);
504 g_signal_connect (G_OBJECT (widget), "toggled",
505 G_CALLBACK (expand_cell_1_toggled), area);
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);
512 g_signal_connect (G_OBJECT (widget), "toggled",
513 G_CALLBACK (expand_cell_2_toggled), area);
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);
520 g_signal_connect (G_OBJECT (widget), "toggled",
521 G_CALLBACK (expand_cell_3_toggled), area);
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);
529 g_signal_connect (G_OBJECT (widget), "toggled",
530 G_CALLBACK (submenu_headers_toggled), menu);
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);
537 g_signal_connect (G_OBJECT (widget), "toggled",
538 G_CALLBACK (tearoff_toggled), menu);
541 gtk_container_add (GTK_CONTAINER (window), vbox);
543 gtk_widget_show (window);
547 main (int argc, char *argv[])
549 gtk_init (NULL, NULL);