]> Pileus Git - ~andy/gtk/blob - tests/testtreemenu.c
Added gtk_tree_menu_set/get_tearoff to allow the root menu to have a tearoff item
[~andy/gtk] / tests / testtreemenu.c
1 #include <gtk/gtk.h>
2 #include "cellareascaffold.h"
3
4 /*******************************************************
5  *                      Simple Test                    *
6  *******************************************************/
7 enum {
8   SIMPLE_COLUMN_NAME,
9   SIMPLE_COLUMN_ICON,
10   SIMPLE_COLUMN_DESCRIPTION,
11   N_SIMPLE_COLUMNS
12 };
13
14 static GtkCellRenderer *cell_1 = NULL, *cell_2 = NULL, *cell_3 = NULL;
15
16 static GtkTreeModel *
17 simple_tree_model (void)
18 {
19   GtkTreeIter   iter, parent, child;
20   GtkTreeStore *store = 
21     gtk_tree_store_new (N_SIMPLE_COLUMNS,
22                         G_TYPE_STRING,  /* name text */
23                         G_TYPE_STRING,  /* icon name */
24                         G_TYPE_STRING); /* description text */
25
26
27   gtk_tree_store_append (store, &parent, NULL);
28   gtk_tree_store_set (store, &parent, 
29                       SIMPLE_COLUMN_NAME, "Alice in wonderland",
30                       SIMPLE_COLUMN_ICON, "gtk-execute",
31                       SIMPLE_COLUMN_DESCRIPTION, 
32                       "Twas brillig, and the slithy toves "
33                       "did gyre and gimble in the wabe",
34                       -1);
35
36   gtk_tree_store_append (store, &iter, &parent);
37   gtk_tree_store_set (store, &iter, 
38                       SIMPLE_COLUMN_NAME, "Go ask",
39                       SIMPLE_COLUMN_ICON, "gtk-zoom-out",
40                       SIMPLE_COLUMN_DESCRIPTION, "One pill makes you shorter",
41                       -1);
42
43   gtk_tree_store_append (store, &iter, &parent);
44   gtk_tree_store_set (store, &iter, 
45                       SIMPLE_COLUMN_NAME, "Alice",
46                       SIMPLE_COLUMN_ICON, "gtk-zoom-in",
47                       SIMPLE_COLUMN_DESCRIPTION, "Another one makes you tall",
48                       -1);
49
50   gtk_tree_store_append (store, &iter, &parent);
51   gtk_tree_store_set (store, &iter, 
52                       SIMPLE_COLUMN_NAME, "Jefferson Airplane",
53                       SIMPLE_COLUMN_ICON, "gtk-zoom-fit",
54                       SIMPLE_COLUMN_DESCRIPTION, "The one's that mother gives you dont do anything at all",
55                       -1);
56
57   gtk_tree_store_append (store, &iter, NULL);
58   gtk_tree_store_set (store, &iter, 
59                       SIMPLE_COLUMN_NAME, "Marry Poppins",
60                       SIMPLE_COLUMN_ICON, "gtk-yes",
61                       SIMPLE_COLUMN_DESCRIPTION, "Supercalifragilisticexpialidocious",
62                       -1);
63
64   gtk_tree_store_append (store, &iter, NULL);
65   gtk_tree_store_set (store, &iter, 
66                       SIMPLE_COLUMN_NAME, "George Bush",
67                       SIMPLE_COLUMN_ICON, "gtk-dialog-question",
68                       SIMPLE_COLUMN_DESCRIPTION, "It's a very good question, very direct, "
69                       "and I'm not going to answer it",
70                       -1);
71
72   gtk_tree_store_append (store, &parent, NULL);
73   gtk_tree_store_set (store, &parent, 
74                       SIMPLE_COLUMN_NAME, "Whinnie the pooh",
75                       SIMPLE_COLUMN_ICON, "gtk-stop",
76                       SIMPLE_COLUMN_DESCRIPTION, "The most wonderful thing about tiggers, "
77                       "is tiggers are wonderful things",
78                       -1);
79
80   gtk_tree_store_append (store, &iter, &parent);
81   gtk_tree_store_set (store, &iter, 
82                       SIMPLE_COLUMN_NAME, "Tigger",
83                       SIMPLE_COLUMN_ICON, "gtk-yes",
84                       SIMPLE_COLUMN_DESCRIPTION, "Eager",
85                       -1);
86
87   gtk_tree_store_append (store, &child, &iter);
88   gtk_tree_store_set (store, &child, 
89                       SIMPLE_COLUMN_NAME, "Jump",
90                       SIMPLE_COLUMN_ICON, "gtk-yes",
91                       SIMPLE_COLUMN_DESCRIPTION, "Very High",
92                       -1);
93
94   gtk_tree_store_append (store, &child, &iter);
95   gtk_tree_store_set (store, &child, 
96                       SIMPLE_COLUMN_NAME, "Pounce",
97                       SIMPLE_COLUMN_ICON, "gtk-no",
98                       SIMPLE_COLUMN_DESCRIPTION, "On Pooh",
99                       -1);
100
101   gtk_tree_store_append (store, &child, &iter);
102   gtk_tree_store_set (store, &child, 
103                       SIMPLE_COLUMN_NAME, "Bounce",
104                       SIMPLE_COLUMN_ICON, "gtk-cancel",
105                       SIMPLE_COLUMN_DESCRIPTION, "Around",
106                       -1);
107
108   gtk_tree_store_append (store, &iter, &parent);
109   gtk_tree_store_set (store, &iter, 
110                       SIMPLE_COLUMN_NAME, "Owl",
111                       SIMPLE_COLUMN_ICON, "gtk-stop",
112                       SIMPLE_COLUMN_DESCRIPTION, "Wise",
113                       -1);
114
115   gtk_tree_store_append (store, &iter, &parent);
116   gtk_tree_store_set (store, &iter, 
117                       SIMPLE_COLUMN_NAME, "Eor",
118                       SIMPLE_COLUMN_ICON, "gtk-no",
119                       SIMPLE_COLUMN_DESCRIPTION, "Depressed",
120                       -1);
121
122   gtk_tree_store_append (store, &iter, &parent);
123   gtk_tree_store_set (store, &iter, 
124                       SIMPLE_COLUMN_NAME, "Piglet",
125                       SIMPLE_COLUMN_ICON, "gtk-media-play",
126                       SIMPLE_COLUMN_DESCRIPTION, "Insecure",
127                       -1);
128
129   gtk_tree_store_append (store, &iter, NULL);
130   gtk_tree_store_set (store, &iter, 
131                       SIMPLE_COLUMN_NAME, "Aleister Crowley",
132                       SIMPLE_COLUMN_ICON, "gtk-about",
133                       SIMPLE_COLUMN_DESCRIPTION, 
134                       "Thou shalt do what thou wilt shall be the whole of the law",
135                       -1);
136
137   gtk_tree_store_append (store, &iter, NULL);
138   gtk_tree_store_set (store, &iter, 
139                       SIMPLE_COLUMN_NAME, "Mark Twain",
140                       SIMPLE_COLUMN_ICON, "gtk-quit",
141                       SIMPLE_COLUMN_DESCRIPTION, 
142                       "Giving up smoking is the easiest thing in the world. "
143                       "I know because I've done it thousands of times.",
144                       -1);
145
146
147   return (GtkTreeModel *)store;
148 }
149
150 static GtkWidget *
151 simple_tree_menu (void)
152 {
153   GtkTreeModel *model;
154   GtkWidget *menu;
155   GtkCellArea *area;
156   GtkCellRenderer *renderer;
157
158   model = simple_tree_model ();
159
160   menu = gtk_tree_menu_new ();
161   gtk_tree_menu_set_model (GTK_TREE_MENU (menu), model);
162   gtk_tree_menu_set_root (GTK_TREE_MENU (menu), NULL);
163
164   area = gtk_cell_layout_get_area (GTK_CELL_LAYOUT (menu));
165
166   cell_1 = renderer = gtk_cell_renderer_text_new ();
167   gtk_cell_area_box_pack_start (GTK_CELL_AREA_BOX (area), renderer, FALSE, FALSE);
168   gtk_cell_area_attribute_connect (area, renderer, "text", SIMPLE_COLUMN_NAME);
169
170   cell_2 = renderer = gtk_cell_renderer_pixbuf_new ();
171   g_object_set (G_OBJECT (renderer), "xalign", 0.0F, NULL);
172   gtk_cell_area_box_pack_start (GTK_CELL_AREA_BOX (area), renderer, TRUE, FALSE);
173   gtk_cell_area_attribute_connect (area, renderer, "stock-id", SIMPLE_COLUMN_ICON);
174
175   cell_3 = renderer = gtk_cell_renderer_text_new ();
176   g_object_set (G_OBJECT (renderer), 
177                 "wrap-mode", PANGO_WRAP_WORD,
178                 "wrap-width", 215,
179                 NULL);
180   gtk_cell_area_box_pack_start (GTK_CELL_AREA_BOX (area), renderer, FALSE, TRUE);
181   gtk_cell_area_attribute_connect (area, renderer, "text", SIMPLE_COLUMN_DESCRIPTION);
182
183   return menu;
184 }
185
186 static void
187 align_cell_2_toggled (GtkToggleButton  *toggle,
188                       GtkTreeMenu    *menu)
189 {
190   GtkCellArea *area = gtk_cell_layout_get_area (GTK_CELL_LAYOUT (menu));
191   gboolean     align = gtk_toggle_button_get_active (toggle);
192
193   gtk_cell_area_cell_set (area, cell_2, "align", align, NULL);
194 }
195
196 static void
197 align_cell_3_toggled (GtkToggleButton  *toggle,
198                       GtkTreeMenu    *menu)
199 {
200   GtkCellArea *area = gtk_cell_layout_get_area (GTK_CELL_LAYOUT (menu));
201   gboolean     align = gtk_toggle_button_get_active (toggle);
202
203   gtk_cell_area_cell_set (area, cell_3, "align", align, NULL);
204 }
205
206 static void
207 expand_cell_1_toggled (GtkToggleButton  *toggle,
208                        GtkTreeMenu      *menu)
209 {
210   GtkCellArea *area = gtk_cell_layout_get_area (GTK_CELL_LAYOUT (menu));
211   gboolean     expand = gtk_toggle_button_get_active (toggle);
212
213   gtk_cell_area_cell_set (area, cell_1, "expand", expand, NULL);
214 }
215
216 static void
217 expand_cell_2_toggled (GtkToggleButton  *toggle,
218                        GtkTreeMenu      *menu)
219 {
220   GtkCellArea *area = gtk_cell_layout_get_area (GTK_CELL_LAYOUT (menu));
221   gboolean     expand = gtk_toggle_button_get_active (toggle);
222
223   gtk_cell_area_cell_set (area, cell_2, "expand", expand, NULL);
224 }
225
226 static void
227 expand_cell_3_toggled (GtkToggleButton  *toggle,
228                        GtkTreeMenu      *menu)
229 {
230   GtkCellArea *area = gtk_cell_layout_get_area (GTK_CELL_LAYOUT (menu));
231   gboolean     expand = gtk_toggle_button_get_active (toggle);
232
233   gtk_cell_area_cell_set (area, cell_3, "expand", expand, NULL);
234 }
235
236 static void
237 menu_activated_cb (GtkTreeMenu *menu,
238                    const gchar *path,
239                    gpointer     unused)
240 {
241   GtkTreeModel *model = gtk_tree_menu_get_model (menu);
242   GtkTreeIter   iter;
243   gchar        *row_name;
244
245   if (!gtk_tree_model_get_iter_from_string (model, &iter, path))
246     return;
247
248   gtk_tree_model_get (model, &iter, SIMPLE_COLUMN_NAME, &row_name, -1);
249
250   g_print ("Item activated: %s\n", row_name);
251
252   g_free (row_name);
253 }
254
255 gboolean 
256 enable_submenu_headers (GtkTreeModel      *model,
257                         GtkTreeIter       *iter,
258                         gpointer           data)
259 {
260   return TRUE;
261 }
262
263
264 static void
265 submenu_headers_toggled (GtkToggleButton  *toggle,
266                          GtkTreeMenu      *menu)
267 {
268   if (gtk_toggle_button_get_active (toggle))
269     gtk_tree_menu_set_header_func (menu, enable_submenu_headers, NULL, NULL);
270   else
271     gtk_tree_menu_set_header_func (menu, NULL, NULL, NULL);
272 }
273
274 static void
275 tearoff_toggled (GtkToggleButton *toggle,
276                  GtkTreeMenu     *menu)
277 {
278   gtk_tree_menu_set_tearoff (menu, gtk_toggle_button_get_active (toggle));
279 }
280
281 static void
282 tree_menu (void)
283 {
284   GtkWidget *window, *widget;
285   GtkWidget *menu, *menubar, *vbox, *menuitem;
286
287   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
288
289   gtk_window_set_title (GTK_WINDOW (window), "GtkTreeMenu");
290
291   menu = simple_tree_menu ();
292
293   g_signal_connect (menu, "menu-activate", G_CALLBACK (menu_activated_cb), NULL);
294
295   vbox  = gtk_vbox_new (FALSE, 4);
296   gtk_widget_show (vbox);
297
298   menubar = gtk_menu_bar_new ();
299   menuitem = gtk_menu_item_new_with_label ("Tree");
300   gtk_widget_show (menu);
301   gtk_widget_show (menubar);
302   gtk_widget_show (menuitem);
303   gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
304   gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
305
306   gtk_box_pack_start (GTK_BOX (vbox), menubar, FALSE, FALSE, 0);
307
308   /* Now add some controls */
309   widget = gtk_check_button_new_with_label ("Align 2nd Cell");
310   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE);
311   gtk_widget_show (widget);
312   gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
313   
314   g_signal_connect (G_OBJECT (widget), "toggled",
315                     G_CALLBACK (align_cell_2_toggled), menu);
316
317   widget = gtk_check_button_new_with_label ("Align 3rd Cell");
318   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
319   gtk_widget_show (widget);
320   gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
321   
322   g_signal_connect (G_OBJECT (widget), "toggled",
323                     G_CALLBACK (align_cell_3_toggled), menu);
324
325   widget = gtk_check_button_new_with_label ("Expand 1st Cell");
326   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE);
327   gtk_widget_show (widget);
328   gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
329   
330   g_signal_connect (G_OBJECT (widget), "toggled",
331                     G_CALLBACK (expand_cell_1_toggled), menu);
332
333   widget = gtk_check_button_new_with_label ("Expand 2nd Cell");
334   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
335   gtk_widget_show (widget);
336   gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
337   
338   g_signal_connect (G_OBJECT (widget), "toggled",
339                     G_CALLBACK (expand_cell_2_toggled), menu);
340
341   widget = gtk_check_button_new_with_label ("Expand 3rd Cell");
342   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE);
343   gtk_widget_show (widget);
344   gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
345   
346   g_signal_connect (G_OBJECT (widget), "toggled",
347                     G_CALLBACK (expand_cell_3_toggled), menu);
348
349   widget = gtk_check_button_new_with_label ("Submenu Headers");
350   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE);
351   gtk_widget_show (widget);
352   gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
353   
354   g_signal_connect (G_OBJECT (widget), "toggled",
355                     G_CALLBACK (submenu_headers_toggled), menu);
356
357   widget = gtk_check_button_new_with_label ("Tearoff menu");
358   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE);
359   gtk_widget_show (widget);
360   gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
361   
362   g_signal_connect (G_OBJECT (widget), "toggled",
363                     G_CALLBACK (tearoff_toggled), menu);
364
365
366   gtk_container_add (GTK_CONTAINER (window), vbox);
367
368   gtk_widget_show (window);
369 }
370
371 int
372 main (int argc, char *argv[])
373 {
374   gtk_init (NULL, NULL);
375
376   tree_menu ();
377
378   gtk_main ();
379
380   return 0;
381 }