2 #include "cellareascaffold.h"
5 /*******************************************************
7 *******************************************************/
9 create_color_pixbuf (const char *color)
19 if (!gdk_color_parse (color, &col))
22 pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
26 rowstride = gdk_pixbuf_get_rowstride (pixbuf);
27 p = pixels = gdk_pixbuf_get_pixels (pixbuf);
29 num = gdk_pixbuf_get_width (pixbuf) *
30 gdk_pixbuf_get_height (pixbuf);
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;
43 create_menu_grid_demo (void)
48 GtkCellRenderer *cell = gtk_cell_renderer_pixbuf_new ();
51 store = gtk_list_store_new (1, GDK_TYPE_PIXBUF);
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);
57 gtk_tree_menu_set_wrap_width (GTK_TREE_MENU (menu), 3);
60 pixbuf = create_color_pixbuf ("red");
61 gtk_list_store_append (store, &iter);
62 gtk_list_store_set (store, &iter,
65 g_object_unref (pixbuf);
67 pixbuf = create_color_pixbuf ("green");
68 gtk_list_store_append (store, &iter);
69 gtk_list_store_set (store, &iter,
72 g_object_unref (pixbuf);
74 pixbuf = create_color_pixbuf ("blue");
75 gtk_list_store_append (store, &iter);
76 gtk_list_store_set (store, &iter,
79 g_object_unref (pixbuf);
82 pixbuf = create_color_pixbuf ("yellow");
83 gtk_list_store_append (store, &iter);
84 gtk_list_store_set (store, &iter,
87 g_object_unref (pixbuf);
89 pixbuf = create_color_pixbuf ("black");
90 gtk_list_store_append (store, &iter);
91 gtk_list_store_set (store, &iter,
94 g_object_unref (pixbuf);
96 pixbuf = create_color_pixbuf ("white");
97 gtk_list_store_append (store, &iter);
98 gtk_list_store_set (store, &iter,
101 g_object_unref (pixbuf);
104 pixbuf = create_color_pixbuf ("gray");
105 gtk_list_store_append (store, &iter);
106 gtk_list_store_set (store, &iter,
109 g_object_unref (pixbuf);
111 pixbuf = create_color_pixbuf ("snow");
112 gtk_list_store_append (store, &iter);
113 gtk_list_store_set (store, &iter,
116 g_object_unref (pixbuf);
118 pixbuf = create_color_pixbuf ("magenta");
119 gtk_list_store_append (store, &iter);
120 gtk_list_store_set (store, &iter,
123 g_object_unref (pixbuf);
125 g_object_unref (store);
130 /*******************************************************
132 *******************************************************/
136 SIMPLE_COLUMN_DESCRIPTION,
140 static GtkCellRenderer *cell_1 = NULL, *cell_2 = NULL, *cell_3 = NULL;
142 static GtkTreeModel *
143 simple_tree_model (void)
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 */
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",
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",
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",
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",
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",
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",
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",
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",
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",
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",
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",
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",
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",
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",
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",
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.",
273 return (GtkTreeModel *)store;
277 simple_tree_menu (void)
282 GtkCellRenderer *renderer;
284 model = simple_tree_model ();
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);
290 area = gtk_cell_layout_get_area (GTK_CELL_LAYOUT (menu));
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);
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);
301 cell_3 = renderer = gtk_cell_renderer_text_new ();
302 g_object_set (G_OBJECT (renderer),
303 "wrap-mode", PANGO_WRAP_WORD,
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);
313 orientation_changed (GtkComboBox *combo,
316 GtkOrientation orientation = gtk_combo_box_get_active (combo);
318 gtk_orientable_set_orientation (GTK_ORIENTABLE (area), orientation);
322 align_cell_2_toggled (GtkToggleButton *toggle,
325 gboolean align = gtk_toggle_button_get_active (toggle);
327 gtk_cell_area_cell_set (area, cell_2, "align", align, NULL);
331 align_cell_3_toggled (GtkToggleButton *toggle,
334 gboolean align = gtk_toggle_button_get_active (toggle);
336 gtk_cell_area_cell_set (area, cell_3, "align", align, NULL);
340 expand_cell_1_toggled (GtkToggleButton *toggle,
343 gboolean expand = gtk_toggle_button_get_active (toggle);
345 gtk_cell_area_cell_set (area, cell_1, "expand", expand, NULL);
349 expand_cell_2_toggled (GtkToggleButton *toggle,
352 gboolean expand = gtk_toggle_button_get_active (toggle);
354 gtk_cell_area_cell_set (area, cell_2, "expand", expand, NULL);
358 expand_cell_3_toggled (GtkToggleButton *toggle,
361 gboolean expand = gtk_toggle_button_get_active (toggle);
363 gtk_cell_area_cell_set (area, cell_3, "expand", expand, NULL);
367 menu_activated_cb (GtkTreeMenu *menu,
371 GtkTreeModel *model = gtk_tree_menu_get_model (menu);
375 if (!gtk_tree_model_get_iter_from_string (model, &iter, path))
378 gtk_tree_model_get (model, &iter, SIMPLE_COLUMN_NAME, &row_name, -1);
380 g_print ("Item activated: %s\n", row_name);
386 enable_submenu_headers (GtkTreeModel *model,
395 submenu_headers_toggled (GtkToggleButton *toggle,
398 if (gtk_toggle_button_get_active (toggle))
399 gtk_tree_menu_set_header_func (menu, enable_submenu_headers, NULL, NULL);
401 gtk_tree_menu_set_header_func (menu, NULL, NULL, NULL);
405 tearoff_toggled (GtkToggleButton *toggle,
408 gtk_tree_menu_set_tearoff (menu, gtk_toggle_button_get_active (toggle));
414 GtkWidget *window, *widget;
415 GtkWidget *menu, *menubar, *vbox, *menuitem;
418 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
420 gtk_window_set_title (GTK_WINDOW (window), "GtkTreeMenu");
422 vbox = gtk_vbox_new (FALSE, 4);
423 gtk_widget_show (vbox);
425 menubar = gtk_menu_bar_new ();
426 gtk_widget_show (menubar);
428 menuitem = gtk_menu_item_new_with_label ("Grid");
429 menu = create_menu_grid_demo ();
430 gtk_widget_show (menu);
431 gtk_widget_show (menuitem);
432 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
433 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
435 menuitem = gtk_menu_item_new_with_label ("Tree");
436 menu = simple_tree_menu ();
437 gtk_widget_show (menu);
438 gtk_widget_show (menuitem);
439 gtk_menu_shell_prepend (GTK_MENU_SHELL (menubar), menuitem);
440 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
442 g_signal_connect (menu, "menu-activate", G_CALLBACK (menu_activated_cb), NULL);
444 gtk_box_pack_start (GTK_BOX (vbox), menubar, FALSE, FALSE, 0);
446 /* Add a combo box with the same menu ! */
447 area = gtk_cell_layout_get_area (GTK_CELL_LAYOUT (menu));
448 widget = g_object_new (GTK_TYPE_COMBO_BOX,
450 "model", gtk_tree_menu_get_model (GTK_TREE_MENU (menu)),
452 gtk_combo_box_set_active (GTK_COMBO_BOX (widget), 0);
453 gtk_widget_show (widget);
454 gtk_box_pack_end (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
456 /* Now add some controls */
457 widget = gtk_combo_box_text_new ();
458 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "Horizontal");
459 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "Vertical");
460 gtk_combo_box_set_active (GTK_COMBO_BOX (widget), 0);
461 gtk_widget_show (widget);
462 gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
464 g_signal_connect (G_OBJECT (widget), "changed",
465 G_CALLBACK (orientation_changed), area);
467 widget = gtk_check_button_new_with_label ("Align 2nd Cell");
468 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE);
469 gtk_widget_show (widget);
470 gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
472 g_signal_connect (G_OBJECT (widget), "toggled",
473 G_CALLBACK (align_cell_2_toggled), area);
475 widget = gtk_check_button_new_with_label ("Align 3rd Cell");
476 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
477 gtk_widget_show (widget);
478 gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
480 g_signal_connect (G_OBJECT (widget), "toggled",
481 G_CALLBACK (align_cell_3_toggled), area);
483 widget = gtk_check_button_new_with_label ("Expand 1st 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 (expand_cell_1_toggled), area);
491 widget = gtk_check_button_new_with_label ("Expand 2nd 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 (expand_cell_2_toggled), area);
499 widget = gtk_check_button_new_with_label ("Expand 3rd 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_3_toggled), area);
507 widget = gtk_check_button_new_with_label ("Submenu Headers");
508 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE);
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 (submenu_headers_toggled), menu);
515 widget = gtk_check_button_new_with_label ("Tearoff menu");
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 (tearoff_toggled), menu);
523 gtk_container_add (GTK_CONTAINER (window), vbox);
525 gtk_widget_show (window);
529 main (int argc, char *argv[])
531 gtk_init (NULL, NULL);