Added bladecoder to artist list.
[tbo.git] / src / ui-menu.c
1 #include <stdio.h>
2 #include <gtk/gtk.h>
3 #include <glib/gi18n.h>
4
5 #include "config.h"
6 #include "ui-menu.h"
7 #include "comic-new-dialog.h"
8 #include "comic-saveas-dialog.h"
9 #include "comic-open-dialog.h"
10 #include "tbo-window.h"
11 #include "ui-drawing.h"
12 #include "export.h"
13 #include "selector-tool.h"
14 #include "comic.h"
15 #include "frame.h"
16 #include "page.h"
17
18 static GtkActionGroup *MENU_ACTION_GROUP = NULL;
19
20 void
21 update_menubar (TboWindow *tbo)
22 {
23     GtkAction *action;
24     int i;
25     char *actions[20] = {"FlipHObj", "FlipVObj", "OrderUpObj", "OrderDownObj", "DeleteObj", "CloneObj"};
26     int elements = 6;
27     int obj_n_elements = 4;
28     gboolean activated = FALSE;
29
30     tbo_object *obj = selector_tool_get_selected_obj ();
31     Frame *frame = selector_tool_get_selected_frame ();
32
33     if (!MENU_ACTION_GROUP)
34         return;
35
36     if (get_frame_view () && obj)
37     {
38         for (i=0; i<elements; i++)
39         {
40             action = gtk_action_group_get_action (MENU_ACTION_GROUP, actions[i]);
41             gtk_action_set_sensitive (action, TRUE);
42         }
43     }
44     else if (!get_frame_view () && frame)
45     {
46         for (i=obj_n_elements; i<elements; i++)
47         {
48             action = gtk_action_group_get_action (MENU_ACTION_GROUP, actions[i]);
49             gtk_action_set_sensitive (action, TRUE);
50         }
51     }
52     else
53     {
54         for (i=0; i<elements; i++)
55         {
56             action = gtk_action_group_get_action (MENU_ACTION_GROUP, actions[i]);
57             gtk_action_set_sensitive (action, FALSE);
58         }
59     }
60 }
61
62 gboolean menu_handler (GtkWidget *widget, gpointer data){
63     printf ("Menu :%s\n", ((TboWindow *) data)->comic->title);
64     return FALSE;
65 }
66
67 gboolean
68 clone_obj_cb (GtkWidget *widget, gpointer data)
69 {
70     tbo_object *obj = selector_tool_get_selected_obj ();
71     Frame *frame = selector_tool_get_selected_frame ();
72     Page *page = tbo_comic_get_current_page (((TboWindow*)data)->comic);
73
74     if (!get_frame_view () && frame)
75     {
76         Frame *cloned_frame = tbo_frame_clone (frame);
77         cloned_frame->x += 10;
78         cloned_frame->y -= 10;
79         tbo_page_add_frame (page, cloned_frame);
80         set_selected (cloned_frame, (TboWindow*)data);
81     }
82     else if (obj && get_frame_view ())
83     {
84         tbo_object *cloned_obj = obj->clone (obj);
85         cloned_obj->x += 10;
86         cloned_obj->y -= 10;
87         tbo_frame_add_obj (frame, cloned_obj);
88         set_selected_obj (cloned_obj, (TboWindow*)data);
89     }
90     update_drawing ((TboWindow *)data);
91     return FALSE;
92 }
93
94 gboolean
95 delete_obj_cb (GtkWidget *widget, gpointer data)
96 {
97     TboWindow *tbo = (TboWindow *)data;
98
99     tbo_object *obj = selector_tool_get_selected_obj ();
100     Frame *frame = selector_tool_get_selected_frame ();
101     Page *page = tbo_comic_get_current_page (((TboWindow*)data)->comic);
102
103     if (obj && get_frame_view ())
104     {
105         tbo_frame_del_obj (frame, obj);
106         set_selected_obj (NULL, tbo);
107     }
108     else if (!get_frame_view () && frame)
109     {
110         tbo_page_del_frame (page, frame);
111         set_selected (NULL, tbo);
112     }
113     update_drawing ((TboWindow *)data);
114     return FALSE;
115 }
116
117 gboolean
118 flip_v_cb (GtkWidget *widget, gpointer data)
119 {
120     tbo_object *obj = selector_tool_get_selected_obj ();
121     if (obj)
122         tbo_object_flipv (obj);
123     update_drawing ((TboWindow *)data);
124     return FALSE;
125 }
126
127 gboolean
128 flip_h_cb (GtkWidget *widget, gpointer data)
129 {
130     tbo_object *obj = selector_tool_get_selected_obj ();
131     if (obj)
132         tbo_object_fliph (obj);
133     update_drawing ((TboWindow *)data);
134     return FALSE;
135 }
136
137 gboolean
138 order_up_cb (GtkWidget *widget, gpointer data)
139 {
140     tbo_object *obj = selector_tool_get_selected_obj ();
141     if (obj)
142         tbo_object_order_up (obj);
143     update_drawing ((TboWindow *)data);
144     return FALSE;
145 }
146
147 gboolean
148 order_down_cb (GtkWidget *widget, gpointer data)
149 {
150     tbo_object *obj = selector_tool_get_selected_obj ();
151     if (obj)
152         tbo_object_order_down (obj);
153     update_drawing ((TboWindow *)data);
154     return FALSE;
155 }
156
157 gboolean close_cb (GtkWidget *widget, gpointer data){
158     printf ("Ventana cerrada\n");
159     tbo_window_free_cb (widget, NULL, ((TboWindow *) data));
160     return FALSE;
161 }
162
163 gboolean
164 about_cb (GtkWidget *widget, TboWindow *tbo){
165     const gchar *authors[] = {"danigm <dani@danigm.net>", NULL};
166     const gchar *artists[] = {"danigm <dani@danigm.net>",
167                               "",
168                               "Arcadia http://www.arcadiaproject.org :",
169                               "Samuel Navas Portillo",
170                               "Daniel Pavón Pérez",
171                               "Juan Jesús Pérez Luna",
172                               "",
173                               "Zapatero & Rajoy:",
174                               "Alfonso de Cala",
175                               "",
176                               "South park style:",
177                               "Rafael García <bladecoder@gmail.com>",
178                               NULL};
179
180     gtk_show_about_dialog (GTK_WINDOW (tbo->window),
181             "name", _("TBO comic editor"),
182             "version", VERSION,
183             "authors", authors,
184             "artists", artists,
185             "website", "http://trac.danigm.net/tbo",
186             NULL);
187
188     return FALSE;
189 }
190
191 gboolean
192 tbo_menu_to_png (GtkWidget *widget, TboWindow *tbo)
193 {
194     tbo_export (tbo, "png");
195     return FALSE;
196 }
197
198 gboolean
199 tbo_menu_to_pdf (GtkWidget *widget, TboWindow *tbo)
200 {
201     tbo_export (tbo, "pdf");
202     return FALSE;
203 }
204
205 gboolean
206 tbo_menu_to_svg (GtkWidget *widget, TboWindow *tbo)
207 {
208     tbo_export (tbo, "svg");
209     return FALSE;
210 }
211
212 static const GtkActionEntry tbo_menu_entries [] = {
213     /* Toplevel */
214
215     { "File", NULL, N_("_File") },
216     { "Edit", NULL, N_("_Edit") },
217     { "Help", NULL, N_("Help") },
218
219     /* File menu */
220
221     { "NewFile", GTK_STOCK_NEW, N_("_New"), "<control>N",
222       N_("Create a new file"),
223       G_CALLBACK (tbo_comic_new_dialog) },
224
225     { "OpenFile", GTK_STOCK_OPEN, N_("_Open"), "<control>O",
226       N_("Open a new file"),
227       G_CALLBACK (tbo_comic_open_dialog) },
228
229     { "SaveFile", GTK_STOCK_SAVE, N_("_Save"), "<control>S",
230       N_("Save current document"),
231       G_CALLBACK (tbo_comic_save_dialog) },
232
233     { "SaveFileAs", GTK_STOCK_SAVE_AS, N_("_Save as"), "",
234       N_("Save current document as ..."),
235       G_CALLBACK (tbo_comic_saveas_dialog) },
236
237     { "ToPNG", GTK_STOCK_FILE, N_("Export as png"), "",
238       N_("Save current document as png"),
239       G_CALLBACK (tbo_menu_to_png) },
240
241     { "ToPDF", GTK_STOCK_FILE, N_("Export as pdf"), "",
242       N_("Save current document as pdf"),
243       G_CALLBACK (tbo_menu_to_pdf) },
244
245     { "ToSVG", GTK_STOCK_FILE, N_("Export as svg"), "",
246       N_("Save current document as svg"),
247       G_CALLBACK (tbo_menu_to_svg) },
248
249     { "Quit", GTK_STOCK_QUIT, N_("_Quit"), "<control>Q",
250       N_("Quit"),
251       G_CALLBACK (close_cb) },
252
253     /* edit menu */
254
255     { "CloneObj", GTK_STOCK_COPY, N_("Clone"), "<control>d",
256       N_("Clone"),
257       G_CALLBACK (clone_obj_cb) },
258     { "DeleteObj", GTK_STOCK_DELETE, N_("Delete"), "Delete",
259       N_("Delete"),
260       G_CALLBACK (delete_obj_cb) },
261     { "FlipHObj", NULL, N_("Horizontal flip"), "h",
262       N_("Horizontal flip"),
263       G_CALLBACK (flip_h_cb) },
264     { "FlipVObj", NULL, N_("Vertical flip"), "v",
265       N_("Vertical flip"),
266       G_CALLBACK (flip_v_cb) },
267     { "OrderUpObj", NULL, N_("Move to front"), "Page_Up",
268       N_("Move to front"),
269       G_CALLBACK ( order_up_cb ) },
270     { "OrderDownObj", NULL, N_("Move to back"), "Page_Down",
271       N_("Move to back"),
272       G_CALLBACK ( order_down_cb ) },
273
274     /* Help menu */
275
276     { "About", GTK_STOCK_ABOUT, N_("About"), "",
277       N_("About"),
278       G_CALLBACK (about_cb) },
279 };
280
281 GtkWidget *generate_menu (TboWindow *window){
282     GtkWidget *menu;
283     GtkUIManager *manager;
284     GError *error = NULL;
285
286     manager = gtk_ui_manager_new ();
287     gtk_ui_manager_add_ui_from_file (manager, DATA_DIR "/ui/tbo-menu-ui.xml", &error);
288     if (error != NULL)
289     {
290         g_warning (_("Could not merge tbo-menu-ui.xml: %s"), error->message);
291         g_error_free (error);
292     }
293
294     MENU_ACTION_GROUP = gtk_action_group_new ("MenuActions");
295     gtk_action_group_set_translation_domain (MENU_ACTION_GROUP, NULL);
296     gtk_action_group_add_actions (MENU_ACTION_GROUP, tbo_menu_entries,
297                         G_N_ELEMENTS (tbo_menu_entries), window);
298
299     gtk_ui_manager_insert_action_group (manager, MENU_ACTION_GROUP, 0);
300
301     menu = gtk_ui_manager_get_widget (manager, "/menubar");
302
303     return menu;
304 }
305