4 /*******************************************************
6 *******************************************************/
8 #if _GTK_TREE_MENU_WAS_A_PUBLIC_CLASS_
10 create_color_pixbuf (const char *color)
20 if (!gdk_rgba_parse (color, &col))
23 pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
27 rowstride = gdk_pixbuf_get_rowstride (pixbuf);
28 p = pixels = gdk_pixbuf_get_pixels (pixbuf);
30 num = gdk_pixbuf_get_width (pixbuf) *
31 gdk_pixbuf_get_height (pixbuf);
33 for (x = 0; x < num; x++) {
35 p[1] = col.green * 255;
36 p[2] = col.blue * 255;
44 create_menu_grid_demo (void)
49 GtkCellRenderer *cell = gtk_cell_renderer_pixbuf_new ();
52 store = gtk_list_store_new (1, GDK_TYPE_PIXBUF);
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);
58 gtk_tree_menu_set_wrap_width (GTK_TREE_MENU (menu), 3);
61 pixbuf = create_color_pixbuf ("red");
62 gtk_list_store_append (store, &iter);
63 gtk_list_store_set (store, &iter,
66 g_object_unref (pixbuf);
68 pixbuf = create_color_pixbuf ("green");
69 gtk_list_store_append (store, &iter);
70 gtk_list_store_set (store, &iter,
73 g_object_unref (pixbuf);
75 pixbuf = create_color_pixbuf ("blue");
76 gtk_list_store_append (store, &iter);
77 gtk_list_store_set (store, &iter,
80 g_object_unref (pixbuf);
83 pixbuf = create_color_pixbuf ("yellow");
84 gtk_list_store_append (store, &iter);
85 gtk_list_store_set (store, &iter,
88 g_object_unref (pixbuf);
90 pixbuf = create_color_pixbuf ("black");
91 gtk_list_store_append (store, &iter);
92 gtk_list_store_set (store, &iter,
95 g_object_unref (pixbuf);
97 pixbuf = create_color_pixbuf ("white");
98 gtk_list_store_append (store, &iter);
99 gtk_list_store_set (store, &iter,
102 g_object_unref (pixbuf);
105 pixbuf = create_color_pixbuf ("gray");
106 gtk_list_store_append (store, &iter);
107 gtk_list_store_set (store, &iter,
110 g_object_unref (pixbuf);
112 pixbuf = create_color_pixbuf ("snow");
113 gtk_list_store_append (store, &iter);
114 gtk_list_store_set (store, &iter,
117 g_object_unref (pixbuf);
119 pixbuf = create_color_pixbuf ("magenta");
120 gtk_list_store_append (store, &iter);
121 gtk_list_store_set (store, &iter,
124 g_object_unref (pixbuf);
126 g_object_unref (store);
132 /*******************************************************
134 *******************************************************/
138 SIMPLE_COLUMN_DESCRIPTION,
142 static GtkCellRenderer *cell_1 = NULL, *cell_2 = NULL, *cell_3 = NULL;
144 static GtkTreeModel *
145 simple_tree_model (void)
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 */
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",
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",
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",
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",
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",
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",
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",
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",
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",
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",
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",
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",
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",
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",
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",
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.",
275 return (GtkTreeModel *)store;
279 create_cell_area (void)
282 GtkCellRenderer *renderer;
284 area = gtk_cell_area_box_new ();
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);
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);
295 cell_3 = renderer = gtk_cell_renderer_text_new ();
296 g_object_set (G_OBJECT (renderer),
297 "wrap-mode", PANGO_WRAP_WORD,
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);
306 #if _GTK_TREE_MENU_WAS_A_PUBLIC_CLASS_
308 simple_tree_menu (GtkCellArea *area)
313 model = simple_tree_model ();
315 menu = gtk_tree_menu_new_with_area (area);
316 gtk_tree_menu_set_model (GTK_TREE_MENU (menu), model);
323 orientation_changed (GtkComboBox *combo,
326 GtkOrientation orientation = gtk_combo_box_get_active (combo);
328 gtk_orientable_set_orientation (GTK_ORIENTABLE (area), orientation);
332 align_cell_2_toggled (GtkToggleButton *toggle,
335 gboolean align = gtk_toggle_button_get_active (toggle);
337 gtk_cell_area_cell_set (area, cell_2, "align", align, NULL);
341 align_cell_3_toggled (GtkToggleButton *toggle,
344 gboolean align = gtk_toggle_button_get_active (toggle);
346 gtk_cell_area_cell_set (area, cell_3, "align", align, NULL);
350 expand_cell_1_toggled (GtkToggleButton *toggle,
353 gboolean expand = gtk_toggle_button_get_active (toggle);
355 gtk_cell_area_cell_set (area, cell_1, "expand", expand, NULL);
359 expand_cell_2_toggled (GtkToggleButton *toggle,
362 gboolean expand = gtk_toggle_button_get_active (toggle);
364 gtk_cell_area_cell_set (area, cell_2, "expand", expand, NULL);
368 expand_cell_3_toggled (GtkToggleButton *toggle,
371 gboolean expand = gtk_toggle_button_get_active (toggle);
373 gtk_cell_area_cell_set (area, cell_3, "expand", expand, NULL);
377 enable_submenu_headers (GtkTreeModel *model,
385 #if _GTK_TREE_MENU_WAS_A_PUBLIC_CLASS_
387 menu_activated_cb (GtkTreeMenu *menu,
391 GtkTreeModel *model = gtk_tree_menu_get_model (menu);
395 if (!gtk_tree_model_get_iter_from_string (model, &iter, path))
398 gtk_tree_model_get (model, &iter, SIMPLE_COLUMN_NAME, &row_name, -1);
400 g_print ("Item activated: %s\n", row_name);
406 submenu_headers_toggled (GtkToggleButton *toggle,
409 if (gtk_toggle_button_get_active (toggle))
410 gtk_tree_menu_set_header_func (menu, enable_submenu_headers, NULL, NULL);
412 gtk_tree_menu_set_header_func (menu, NULL, NULL, NULL);
416 tearoff_toggled (GtkToggleButton *toggle,
419 gtk_tree_menu_set_tearoff (menu, gtk_toggle_button_get_active (toggle));
426 GtkWidget *window, *widget;
427 GtkWidget *menubar, *vbox;
431 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
433 gtk_window_set_title (GTK_WINDOW (window), "GtkTreeMenu");
435 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 4);
436 gtk_widget_show (vbox);
438 menubar = gtk_menu_bar_new ();
439 gtk_widget_show (menubar);
441 store = simple_tree_model ();
442 area = create_cell_area ();
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);
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);
459 g_signal_connect (menu, "menu-activate", G_CALLBACK (menu_activated_cb), NULL);
461 gtk_box_pack_start (GTK_BOX (vbox), menubar, FALSE, FALSE, 0);
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);
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);
479 g_signal_connect (G_OBJECT (widget), "changed",
480 G_CALLBACK (orientation_changed), area);
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);
487 g_signal_connect (G_OBJECT (widget), "toggled",
488 G_CALLBACK (align_cell_2_toggled), area);
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);
495 g_signal_connect (G_OBJECT (widget), "toggled",
496 G_CALLBACK (align_cell_3_toggled), area);
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);
503 g_signal_connect (G_OBJECT (widget), "toggled",
504 G_CALLBACK (expand_cell_1_toggled), area);
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);
511 g_signal_connect (G_OBJECT (widget), "toggled",
512 G_CALLBACK (expand_cell_2_toggled), area);
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);
519 g_signal_connect (G_OBJECT (widget), "toggled",
520 G_CALLBACK (expand_cell_3_toggled), area);
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);
528 g_signal_connect (G_OBJECT (widget), "toggled",
529 G_CALLBACK (submenu_headers_toggled), menu);
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);
536 g_signal_connect (G_OBJECT (widget), "toggled",
537 G_CALLBACK (tearoff_toggled), menu);
540 gtk_container_add (GTK_CONTAINER (window), vbox);
542 gtk_widget_show (window);
546 main (int argc, char *argv[])
548 gtk_init (NULL, NULL);