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 GtkCellArea *area = gtk_cell_layout_get_area (GTK_CELL_LAYOUT (menu));
326 gboolean align = gtk_toggle_button_get_active (toggle);
328 gtk_cell_area_cell_set (area, cell_2, "align", align, NULL);
332 align_cell_3_toggled (GtkToggleButton *toggle,
335 GtkCellArea *area = gtk_cell_layout_get_area (GTK_CELL_LAYOUT (menu));
336 gboolean align = gtk_toggle_button_get_active (toggle);
338 gtk_cell_area_cell_set (area, cell_3, "align", align, NULL);
342 expand_cell_1_toggled (GtkToggleButton *toggle,
345 GtkCellArea *area = gtk_cell_layout_get_area (GTK_CELL_LAYOUT (menu));
346 gboolean expand = gtk_toggle_button_get_active (toggle);
348 gtk_cell_area_cell_set (area, cell_1, "expand", expand, NULL);
352 expand_cell_2_toggled (GtkToggleButton *toggle,
355 GtkCellArea *area = gtk_cell_layout_get_area (GTK_CELL_LAYOUT (menu));
356 gboolean expand = gtk_toggle_button_get_active (toggle);
358 gtk_cell_area_cell_set (area, cell_2, "expand", expand, NULL);
362 expand_cell_3_toggled (GtkToggleButton *toggle,
365 GtkCellArea *area = gtk_cell_layout_get_area (GTK_CELL_LAYOUT (menu));
366 gboolean expand = gtk_toggle_button_get_active (toggle);
368 gtk_cell_area_cell_set (area, cell_3, "expand", expand, NULL);
372 menu_activated_cb (GtkTreeMenu *menu,
376 GtkTreeModel *model = gtk_tree_menu_get_model (menu);
380 if (!gtk_tree_model_get_iter_from_string (model, &iter, path))
383 gtk_tree_model_get (model, &iter, SIMPLE_COLUMN_NAME, &row_name, -1);
385 g_print ("Item activated: %s\n", row_name);
391 enable_submenu_headers (GtkTreeModel *model,
400 submenu_headers_toggled (GtkToggleButton *toggle,
403 if (gtk_toggle_button_get_active (toggle))
404 gtk_tree_menu_set_header_func (menu, enable_submenu_headers, NULL, NULL);
406 gtk_tree_menu_set_header_func (menu, NULL, NULL, NULL);
410 tearoff_toggled (GtkToggleButton *toggle,
413 gtk_tree_menu_set_tearoff (menu, gtk_toggle_button_get_active (toggle));
419 GtkWidget *window, *widget;
420 GtkWidget *menu, *menubar, *vbox, *menuitem;
423 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
425 gtk_window_set_title (GTK_WINDOW (window), "GtkTreeMenu");
427 vbox = gtk_vbox_new (FALSE, 4);
428 gtk_widget_show (vbox);
430 menubar = gtk_menu_bar_new ();
431 gtk_widget_show (menubar);
433 menuitem = gtk_menu_item_new_with_label ("Grid");
434 menu = create_menu_grid_demo ();
435 gtk_widget_show (menu);
436 gtk_widget_show (menuitem);
437 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
438 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
440 menuitem = gtk_menu_item_new_with_label ("Tree");
441 menu = simple_tree_menu ();
442 gtk_widget_show (menu);
443 gtk_widget_show (menuitem);
444 gtk_menu_shell_prepend (GTK_MENU_SHELL (menubar), menuitem);
445 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
447 g_signal_connect (menu, "menu-activate", G_CALLBACK (menu_activated_cb), NULL);
449 gtk_box_pack_start (GTK_BOX (vbox), menubar, FALSE, FALSE, 0);
451 /* Now add some controls */
452 widget = gtk_combo_box_text_new ();
453 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "Horizontal");
454 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "Vertical");
455 gtk_combo_box_set_active (GTK_COMBO_BOX (widget), 0);
456 gtk_widget_show (widget);
457 gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
459 area = gtk_tree_menu_get_area (GTK_TREE_MENU (menu));
460 g_signal_connect (G_OBJECT (widget), "changed",
461 G_CALLBACK (orientation_changed), area);
463 widget = gtk_check_button_new_with_label ("Align 2nd Cell");
464 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE);
465 gtk_widget_show (widget);
466 gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
468 g_signal_connect (G_OBJECT (widget), "toggled",
469 G_CALLBACK (align_cell_2_toggled), menu);
471 widget = gtk_check_button_new_with_label ("Align 3rd Cell");
472 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
473 gtk_widget_show (widget);
474 gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
476 g_signal_connect (G_OBJECT (widget), "toggled",
477 G_CALLBACK (align_cell_3_toggled), menu);
479 widget = gtk_check_button_new_with_label ("Expand 1st Cell");
480 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE);
481 gtk_widget_show (widget);
482 gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
484 g_signal_connect (G_OBJECT (widget), "toggled",
485 G_CALLBACK (expand_cell_1_toggled), menu);
487 widget = gtk_check_button_new_with_label ("Expand 2nd Cell");
488 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
489 gtk_widget_show (widget);
490 gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
492 g_signal_connect (G_OBJECT (widget), "toggled",
493 G_CALLBACK (expand_cell_2_toggled), menu);
495 widget = gtk_check_button_new_with_label ("Expand 3rd Cell");
496 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE);
497 gtk_widget_show (widget);
498 gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
500 g_signal_connect (G_OBJECT (widget), "toggled",
501 G_CALLBACK (expand_cell_3_toggled), menu);
503 widget = gtk_check_button_new_with_label ("Submenu Headers");
504 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE);
505 gtk_widget_show (widget);
506 gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
508 g_signal_connect (G_OBJECT (widget), "toggled",
509 G_CALLBACK (submenu_headers_toggled), menu);
511 widget = gtk_check_button_new_with_label ("Tearoff menu");
512 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE);
513 gtk_widget_show (widget);
514 gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
516 g_signal_connect (G_OBJECT (widget), "toggled",
517 G_CALLBACK (tearoff_toggled), menu);
519 gtk_container_add (GTK_CONTAINER (window), vbox);
521 gtk_widget_show (window);
525 main (int argc, char *argv[])
527 gtk_init (NULL, NULL);