]> Pileus Git - ~andy/gtk/blob - demos/gtk-demo/ui_manager.c
Use gtk_box_new() instead gtk_[v|h]box_new()
[~andy/gtk] / demos / gtk-demo / ui_manager.c
1 /* UI Manager
2  *
3  * The GtkUIManager object allows the easy creation of menus
4  * from an array of actions and a description of the menu hierarchy.
5  */
6
7 #include <gtk/gtk.h>
8
9 static void
10 activate_action (GtkAction *action)
11 {
12   g_message ("Action \"%s\" activated", gtk_action_get_name (action));
13 }
14
15 static void
16 activate_radio_action (GtkAction *action, GtkRadioAction *current)
17 {
18   g_message ("Radio action \"%s\" selected", 
19              gtk_action_get_name (GTK_ACTION (current)));
20 }
21
22 static GtkActionEntry entries[] = {
23   { "FileMenu", NULL, "_File" },               /* name, stock id, label */
24   { "PreferencesMenu", NULL, "_Preferences" }, /* name, stock id, label */
25   { "ColorMenu", NULL, "_Color"  },            /* name, stock id, label */
26   { "ShapeMenu", NULL, "_Shape" },             /* name, stock id, label */
27   { "HelpMenu", NULL, "_Help" },               /* name, stock id, label */
28   { "New", GTK_STOCK_NEW,                      /* name, stock id */
29     "_New", "<control>N",                      /* label, accelerator */
30     "Create a new file",                       /* tooltip */ 
31     G_CALLBACK (activate_action) },      
32   { "Open", GTK_STOCK_OPEN,                    /* name, stock id */
33     "_Open","<control>O",                      /* label, accelerator */     
34     "Open a file",                             /* tooltip */
35     G_CALLBACK (activate_action) }, 
36   { "Save", GTK_STOCK_SAVE,                    /* name, stock id */
37     "_Save","<control>S",                      /* label, accelerator */     
38     "Save current file",                       /* tooltip */
39     G_CALLBACK (activate_action) },
40   { "SaveAs", GTK_STOCK_SAVE,                  /* name, stock id */
41     "Save _As...", NULL,                       /* label, accelerator */     
42     "Save to a file",                          /* tooltip */
43     G_CALLBACK (activate_action) },
44   { "Quit", GTK_STOCK_QUIT,                    /* name, stock id */
45     "_Quit", "<control>Q",                     /* label, accelerator */     
46     "Quit",                                    /* tooltip */
47     G_CALLBACK (activate_action) },
48   { "About", NULL,                             /* name, stock id */
49     "_About", "<control>A",                    /* label, accelerator */     
50     "About",                                   /* tooltip */  
51     G_CALLBACK (activate_action) },
52   { "Logo", "demo-gtk-logo",                   /* name, stock id */
53      NULL, NULL,                               /* label, accelerator */     
54     "GTK+",                                    /* tooltip */
55     G_CALLBACK (activate_action) },
56 };
57 static guint n_entries = G_N_ELEMENTS (entries);
58
59
60 static GtkToggleActionEntry toggle_entries[] = {
61   { "Bold", GTK_STOCK_BOLD,                    /* name, stock id */
62      "_Bold", "<control>B",                    /* label, accelerator */     
63     "Bold",                                    /* tooltip */
64     G_CALLBACK (activate_action), 
65     TRUE },                                    /* is_active */
66 };
67 static guint n_toggle_entries = G_N_ELEMENTS (toggle_entries);
68
69 enum {
70   COLOR_RED,
71   COLOR_GREEN,
72   COLOR_BLUE
73 };
74
75 static GtkRadioActionEntry color_entries[] = {
76   { "Red", NULL,                               /* name, stock id */
77     "_Red", "<control>R",                      /* label, accelerator */     
78     "Blood", COLOR_RED },                      /* tooltip, value */
79   { "Green", NULL,                             /* name, stock id */
80     "_Green", "<control>G",                    /* label, accelerator */     
81     "Grass", COLOR_GREEN },                    /* tooltip, value */
82   { "Blue", NULL,                              /* name, stock id */
83     "_Blue", "<control>B",                     /* label, accelerator */     
84     "Sky", COLOR_BLUE },                       /* tooltip, value */
85 };
86 static guint n_color_entries = G_N_ELEMENTS (color_entries);
87
88 enum {
89   SHAPE_SQUARE,
90   SHAPE_RECTANGLE,
91   SHAPE_OVAL
92 };
93
94 static GtkRadioActionEntry shape_entries[] = {
95   { "Square", NULL,                            /* name, stock id */
96     "_Square", "<control>S",                   /* label, accelerator */     
97     "Square",  SHAPE_SQUARE },                 /* tooltip, value */
98   { "Rectangle", NULL,                         /* name, stock id */
99     "_Rectangle", "<control>R",                /* label, accelerator */     
100     "Rectangle", SHAPE_RECTANGLE },            /* tooltip, value */
101   { "Oval", NULL,                              /* name, stock id */
102     "_Oval", "<control>O",                     /* label, accelerator */     
103     "Egg", SHAPE_OVAL },                       /* tooltip, value */  
104 };
105 static guint n_shape_entries = G_N_ELEMENTS (shape_entries);
106
107 static const gchar *ui_info = 
108 "<ui>"
109 "  <menubar name='MenuBar'>"
110 "    <menu action='FileMenu'>"
111 "      <menuitem action='New'/>"
112 "      <menuitem action='Open'/>"
113 "      <menuitem action='Save'/>"
114 "      <menuitem action='SaveAs'/>"
115 "      <separator/>"
116 "      <menuitem action='Quit'/>"
117 "    </menu>"
118 "    <menu action='PreferencesMenu'>"
119 "      <menu action='ColorMenu'>"
120 "       <menuitem action='Red'/>"
121 "       <menuitem action='Green'/>"
122 "       <menuitem action='Blue'/>"
123 "      </menu>"
124 "      <menu action='ShapeMenu'>"
125 "        <menuitem action='Square'/>"
126 "        <menuitem action='Rectangle'/>"
127 "        <menuitem action='Oval'/>"
128 "      </menu>"
129 "      <menuitem action='Bold'/>"
130 "    </menu>"
131 "    <menu action='HelpMenu'>"
132 "      <menuitem action='About'/>"
133 "    </menu>"
134 "  </menubar>"
135 "  <toolbar  name='ToolBar'>"
136 "    <toolitem action='Open'/>"
137 "    <toolitem action='Quit'/>"
138 "    <separator action='Sep1'/>"
139 "    <toolitem action='Logo'/>"
140 "  </toolbar>"
141 "</ui>";
142
143 GtkWidget *
144 do_ui_manager (GtkWidget *do_widget)
145 {
146   static GtkWidget *window = NULL;
147   
148   if (!window)
149     {
150       GtkWidget *box1;
151       GtkWidget *box2;
152       GtkWidget *separator;
153       GtkWidget *label;
154       GtkWidget *button;
155       GtkUIManager *ui;
156       GtkActionGroup *actions;
157       GError *error = NULL;
158
159       window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
160       gtk_window_set_screen (GTK_WINDOW (window),
161                              gtk_widget_get_screen (do_widget));
162       
163       g_signal_connect (window, "destroy",
164                         G_CALLBACK (gtk_widget_destroyed), &window);
165       g_signal_connect (window, "delete-event",
166                         G_CALLBACK (gtk_true), NULL);
167
168       actions = gtk_action_group_new ("Actions");
169       gtk_action_group_add_actions (actions, entries, n_entries, NULL);
170       gtk_action_group_add_toggle_actions (actions, 
171                                            toggle_entries, n_toggle_entries, 
172                                            NULL);
173       gtk_action_group_add_radio_actions (actions, 
174                                           color_entries, n_color_entries, 
175                                           COLOR_RED,
176                                           G_CALLBACK (activate_radio_action), 
177                                           NULL);
178       gtk_action_group_add_radio_actions (actions, 
179                                           shape_entries, n_shape_entries, 
180                                           SHAPE_OVAL,
181                                           G_CALLBACK (activate_radio_action), 
182                                           NULL);
183
184       ui = gtk_ui_manager_new ();
185       gtk_ui_manager_insert_action_group (ui, actions, 0);
186       g_object_unref (actions);
187       gtk_window_add_accel_group (GTK_WINDOW (window), 
188                                   gtk_ui_manager_get_accel_group (ui));
189       gtk_window_set_title (GTK_WINDOW (window), "UI Manager");
190       gtk_container_set_border_width (GTK_CONTAINER (window), 0);
191
192       
193       if (!gtk_ui_manager_add_ui_from_string (ui, ui_info, -1, &error))
194         {
195           g_message ("building menus failed: %s", error->message);
196           g_error_free (error);
197         }
198
199       box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
200       gtk_container_add (GTK_CONTAINER (window), box1);
201       
202       gtk_box_pack_start (GTK_BOX (box1),
203                           gtk_ui_manager_get_widget (ui, "/MenuBar"),
204                           FALSE, FALSE, 0);
205
206       label = gtk_label_new ("Type\n<alt>\nto start");
207       gtk_widget_set_size_request (label, 200, 200);
208       gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
209       gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
210
211
212       separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
213       gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
214
215
216       box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 10);
217       gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
218       gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
219
220       button = gtk_button_new_with_label ("close");
221       g_signal_connect_swapped (button, "clicked",
222                                 G_CALLBACK (gtk_widget_destroy), window);
223       gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
224       gtk_widget_set_can_default (button, TRUE);
225       gtk_widget_grab_default (button);
226
227       gtk_widget_show_all (window);
228       g_object_unref (ui);
229     }
230   else
231     {
232       gtk_widget_destroy (window);
233       window = NULL;
234     }
235
236   return window;
237 }