Disabled accel keys in text tool.
[tbo.git] / src / tbo-window.c
1 /*
2  * This file is part of TBO, a gnome comic editor
3  * Copyright (C) 2010  Daniel Garcia Moreno <dani@danigm.net>
4  *
5  * This program is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation, either version 3 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18
19
20 #include <stdio.h>
21 #include <malloc.h>
22 #include <gtk/gtk.h>
23 #include <glib/gi18n.h>
24 #include <gdk/gdkkeysyms.h>
25 #include "tbo-types.h"
26 #include "tbo-window.h"
27 #include "comic.h"
28 #include "ui-menu.h"
29 #include "tbo-toolbar.h"
30 #include "tbo-drawing.h"
31 #include "tbo-tool-selector.h"
32
33 static int NWINDOWS = 0;
34 static gboolean KEY_BINDER = TRUE;
35
36 static gboolean
37 notebook_switch_page_cb (GtkNotebook     *notebook,
38                          GtkNotebookPage *page,
39                          guint            page_num,
40                          TboWindow        *tbo)
41 {
42     tbo_comic_set_current_page_nth (tbo->comic, page_num);
43     tbo_window_set_current_tab_page (tbo, FALSE);
44     tbo_toolbar_update (tbo->toolbar);
45     tbo_window_update_status (tbo, 0, 0);
46     tbo_drawing_adjust_scroll (TBO_DRAWING (tbo->drawing));
47     return FALSE;
48 }
49
50 static gboolean
51 on_key_cb (GtkWidget    *widget,
52            GdkEventKey  *event,
53            TboWindow    *tbo)
54 {
55     TboToolBase *tool;
56     TboDrawing *drawing = TBO_DRAWING (tbo->drawing);
57
58     tool = tbo_toolbar_get_selected_tool (tbo->toolbar);
59     if (tool)
60         tool->on_key (tool, widget, event);
61
62     tbo_window_update_status (tbo, 0, 0);
63
64     if (KEY_BINDER)
65     {
66         switch (event->keyval)
67         {
68             case GDK_plus:
69                 tbo_drawing_zoom_in (drawing);
70                 break;
71             case GDK_minus:
72                 tbo_drawing_zoom_out (drawing);
73                 break;
74             case GDK_1:
75                 tbo_drawing_zoom_100 (drawing);
76                 break;
77             case GDK_2:
78                 tbo_drawing_zoom_fit (drawing);
79                 break;
80             case GDK_s:
81                 tbo_toolbar_set_selected_tool (tbo->toolbar, TBO_TOOLBAR_SELECTOR);
82                 break;
83             case GDK_t:
84                 tbo_toolbar_set_selected_tool (tbo->toolbar, TBO_TOOLBAR_TEXT);
85                 break;
86             case GDK_d:
87                 tbo_toolbar_set_selected_tool (tbo->toolbar, TBO_TOOLBAR_DOODLE);
88                 break;
89             case GDK_b:
90                 tbo_toolbar_set_selected_tool (tbo->toolbar, TBO_TOOLBAR_BUBBLE);
91                 break;
92             case GDK_f:
93                 tbo_toolbar_set_selected_tool (tbo->toolbar, TBO_TOOLBAR_FRAME);
94                 break;
95             default:
96                 break;
97         }
98     }
99     return FALSE;
100 }
101
102 static gboolean
103 on_move_cb (GtkWidget     *widget,
104            GdkEventMotion *event,
105            TboWindow      *tbo)
106 {
107     tbo_window_update_status (tbo, (int)event->x, (int)event->y);
108     return FALSE;
109 }
110
111 TboWindow *
112 tbo_window_new (GtkWidget *window, GtkWidget *dw_scroll,
113                 GtkWidget *scroll2,
114                 GtkWidget *notebook, GtkWidget *toolarea,
115                 GtkWidget *status, GtkWidget *vbox, Comic *comic)
116 {
117     TboWindow *tbo;
118     GList *list;
119
120     tbo = malloc (sizeof (TboWindow));
121     tbo->window = window;
122     tbo->dw_scroll = dw_scroll;
123     tbo->scroll2 = scroll2;
124     list = gtk_container_get_children (GTK_CONTAINER (dw_scroll));
125     tbo->drawing = GTK_WIDGET (list->data);
126     tbo->status = status;
127     tbo->vbox = vbox;
128     tbo->comic = comic;
129     tbo->toolarea = toolarea;
130     tbo->notebook = notebook;
131     tbo->path = NULL;
132
133     return tbo;
134 }
135
136 void 
137 tbo_window_free (TboWindow *tbo)
138 {
139     tbo_comic_free (tbo->comic);
140     gtk_widget_destroy (tbo->window);
141     if (tbo->path)
142         free (tbo->path);
143     free (tbo);
144 }
145
146 void
147 tbo_window_set_path (TboWindow *tbo, const char *path)
148 {
149     if (tbo->path)
150         free (tbo->path);
151     tbo->path = malloc (255 * sizeof (char));
152     snprintf (tbo->path, 255, "%s", path);
153 }
154
155 gboolean 
156 tbo_window_free_cb (GtkWidget *widget, GdkEventExpose *event,
157                     TboWindow *tbo)
158 {
159     tbo_window_free (tbo);
160     NWINDOWS--;
161     if (!NWINDOWS)
162         gtk_main_quit ();
163     return FALSE;
164 }
165
166 GdkPixbuf *create_pixbuf (const gchar * filename)
167 {
168    GdkPixbuf *pixbuf;
169    GError *error = NULL;
170    pixbuf = gdk_pixbuf_new_from_file(filename, &error);
171    if(!pixbuf) {
172       fprintf(stderr, "%s\n", error->message);
173       g_error_free(error);
174    }
175
176    return pixbuf;
177 }
178
179 GtkWidget *
180 create_darea (TboWindow *tbo)
181 {
182     GtkWidget *scrolled;
183     GtkWidget *darea;
184     int width=tbo->comic->width, height=tbo->comic->height;
185
186     scrolled = gtk_scrolled_window_new (NULL, NULL);
187     gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
188     darea = tbo_drawing_new_with_params (tbo->comic);
189     gtk_container_add (GTK_CONTAINER (scrolled), darea);
190     tbo_drawing_init_dnd (TBO_DRAWING (darea), tbo);
191
192     g_signal_connect_after (darea, "motion_notify_event", G_CALLBACK (on_move_cb), tbo);
193     gtk_widget_show_all (scrolled);
194
195     return scrolled;
196 }
197
198 TboWindow *
199 tbo_new_tbo (int width, int height)
200 {
201     TboWindow *tbo;
202     Comic *comic;
203     GtkWidget *window;
204     GtkWidget *container;
205     GtkWidget *tool_paned;
206     GtkWidget *menu;
207     TboToolbar *toolbar;
208     GtkWidget *scrolled;
209     GtkWidget *scrolled2;
210     GtkWidget *darea;
211     GtkWidget *status;
212     GtkWidget *hpaned;
213     GtkWidget *notebook;
214
215     GtkUIManager *manager;
216
217     NWINDOWS++;
218
219     window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
220     gtk_window_set_default_size (GTK_WINDOW (window), width, height);
221     gtk_window_set_icon (GTK_WINDOW (window), create_pixbuf (DATA_DIR "/icon.png"));
222
223     // El contenedor principal
224     container = gtk_vbox_new (FALSE, 0);
225     gtk_container_add (GTK_CONTAINER (window), container);
226
227     comic = tbo_comic_new (_("Untitled"), width, height);
228     gtk_window_set_title (GTK_WINDOW (window), comic->title);
229     scrolled = gtk_scrolled_window_new (NULL, NULL);
230     gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
231     darea = tbo_drawing_new_with_params (comic);
232     gtk_container_add (GTK_CONTAINER (scrolled), darea);
233     notebook = gtk_notebook_new ();
234     gtk_notebook_set_scrollable (GTK_NOTEBOOK (notebook), TRUE);
235     gtk_notebook_append_page (GTK_NOTEBOOK (notebook), scrolled, NULL);
236
237     hpaned = gtk_hpaned_new ();
238     tool_paned = gtk_vbox_new (FALSE, 0);
239     scrolled2 = gtk_scrolled_window_new (NULL, NULL);
240     gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled2), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
241     gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled2), tool_paned);
242
243     gtk_paned_set_position (GTK_PANED (hpaned), width - 200);
244     gtk_paned_pack1 (GTK_PANED (hpaned), notebook, TRUE, FALSE);
245     gtk_paned_pack2 (GTK_PANED (hpaned), scrolled2, TRUE, FALSE);
246
247     status = gtk_statusbar_new ();
248
249     tbo = tbo_window_new (window, scrolled, scrolled2, notebook, tool_paned, status, container, comic);
250
251     // Generando la barra de herramientas de la aplicacion
252     toolbar = TBO_TOOLBAR (tbo_toolbar_new_with_params (tbo));
253     tbo->toolbar = toolbar;
254
255     // drag & drop
256     tbo_drawing_init_dnd (TBO_DRAWING (darea), tbo);
257
258     // key press event
259     g_signal_connect (tbo->notebook, "switch-page", G_CALLBACK (notebook_switch_page_cb), tbo);
260     g_signal_connect (tbo->window, "key_press_event", G_CALLBACK (on_key_cb), tbo);
261     g_signal_connect (window, "delete-event", G_CALLBACK (tbo_window_free_cb), tbo);
262
263     // Generando el menu de la aplicacion
264     menu = generate_menu (tbo);
265
266     gtk_box_pack_start (GTK_BOX (container), menu, FALSE, FALSE, 0);
267     gtk_box_pack_start (GTK_BOX (container), toolbar->toolbar, FALSE, FALSE, 0);
268
269     gtk_container_add (GTK_CONTAINER (container), hpaned);
270
271     gtk_box_pack_start (GTK_BOX (container), status, FALSE, FALSE, 0);
272
273     gtk_widget_show_all (window);
274     tbo_toolbar_set_selected_tool (toolbar, TBO_TOOLBAR_SELECTOR);
275
276     tbo_window_update_status (tbo, 0, 0);
277     return tbo;
278 }
279
280 void
281 tbo_window_update_status (TboWindow *tbo, int x, int y)
282 {
283     char buffer[200];
284     snprintf (buffer, 200, _("page: %d of %d [ %5d,%5d ] | frames: %d"),
285                     tbo_comic_page_index (tbo->comic),
286                     tbo_comic_len (tbo->comic),
287                     x, y,
288                     tbo_page_len (tbo_comic_get_current_page (tbo->comic)));
289     gtk_statusbar_push (GTK_STATUSBAR (tbo->status), 0, buffer);
290     tbo_toolbar_update (tbo->toolbar);
291 }
292
293 gboolean
294 remove_cb (GtkWidget *widget, gpointer data)
295 {
296     gtk_widget_destroy (widget);
297     return FALSE;
298 }
299
300 void
301 tbo_empty_tool_area (TboWindow *tbo)
302 {
303     gtk_container_foreach (GTK_CONTAINER (tbo->toolarea), (GtkCallback)remove_cb, NULL);
304 }
305
306 void
307 tbo_window_set_key_binder (TboWindow *tbo, gboolean keyb)
308 {
309     KEY_BINDER = keyb;
310     if (keyb)
311         tbo_menu_enable_accel_keys (tbo);
312     else
313         tbo_menu_disable_accel_keys (tbo);
314 }
315
316 void
317 tbo_window_set_current_tab_page (TboWindow *tbo, gboolean setit)
318 {
319     int nth;
320
321     nth = tbo_comic_page_index (tbo->comic);
322     if (setit)
323         gtk_notebook_set_current_page (GTK_NOTEBOOK (tbo->notebook), nth);
324     tbo->dw_scroll = gtk_notebook_get_nth_page (GTK_NOTEBOOK (tbo->notebook), nth);
325     tbo->drawing = gtk_bin_get_child (GTK_BIN (tbo->dw_scroll));
326
327     tbo_toolbar_set_selected_tool (tbo->toolbar, TBO_TOOLBAR_SELECTOR);
328     tbo_tool_selector_set_selected (TBO_TOOL_SELECTOR (tbo->toolbar->selected_tool), NULL);
329     tbo_tool_selector_set_selected_obj (TBO_TOOL_SELECTOR (tbo->toolbar->selected_tool), NULL);
330 }