Selector as default tool
[tbo.git] / src / tbo-window.c
1 #include <stdio.h>
2 #include <malloc.h>
3 #include <gtk/gtk.h>
4 #include <glib/gi18n.h>
5 #include "tbo-window.h"
6 #include "comic.h"
7 #include "ui-menu.h"
8 #include "ui-toolbar.h"
9 #include "ui-drawing.h"
10 #include "tbo-types.h"
11
12 static int NWINDOWS = 0;
13
14 TboWindow *
15 tbo_window_new (GtkWidget *window, GtkWidget *dw_scroll,
16                 GtkWidget *notebook, GtkWidget *toolarea,
17                 GtkWidget *status, GtkWidget *vbox, Comic *comic)
18 {
19     TboWindow *tbo;
20     GList *list;
21
22     tbo = malloc (sizeof (TboWindow));
23     tbo->window = window;
24     tbo->dw_scroll = dw_scroll;
25     list = gtk_container_get_children (GTK_CONTAINER (dw_scroll));
26     tbo->drawing = GTK_WIDGET (list->data);
27     tbo->status = status;
28     tbo->vbox = vbox;
29     tbo->comic = comic;
30     tbo->toolarea = toolarea;
31     tbo->notebook = notebook;
32     tbo->path = NULL;
33
34     return tbo;
35 }
36
37 void 
38 tbo_window_free (TboWindow *tbo)
39 {
40     tbo_comic_free (tbo->comic);
41     gtk_widget_destroy (tbo->window);
42     if (tbo->path)
43         free (tbo->path);
44     free (tbo);
45 }
46
47 void
48 tbo_window_set_path (TboWindow *tbo, const char *path)
49 {
50     if (tbo->path)
51         free (tbo->path);
52     tbo->path = malloc (255 * sizeof (char));
53     snprintf (tbo->path, 255, "%s", path);
54 }
55
56 gboolean 
57 tbo_window_free_cb (GtkWidget *widget, GdkEventExpose *event,
58                     TboWindow *tbo)
59 {
60     tbo_window_free (tbo);
61     NWINDOWS--;
62     if (!NWINDOWS)
63         gtk_main_quit ();
64     return FALSE;
65 }
66
67 GdkPixbuf *create_pixbuf (const gchar * filename)
68 {
69    GdkPixbuf *pixbuf;
70    GError *error = NULL;
71    pixbuf = gdk_pixbuf_new_from_file(filename, &error);
72    if(!pixbuf) {
73       fprintf(stderr, "%s\n", error->message);
74       g_error_free(error);
75    }
76
77    return pixbuf;
78 }
79
80 GtkWidget *
81 create_darea (TboWindow *tbo)
82 {
83     GtkWidget *scrolled;
84     GtkWidget *darea;
85     int width=tbo->comic->width, height=tbo->comic->height;
86
87     scrolled = gtk_scrolled_window_new (NULL, NULL);
88     gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
89     darea = get_drawing_area (width, height);
90     gtk_container_add (GTK_CONTAINER (scrolled), darea);
91     darea_connect_signals (tbo, darea);
92     gtk_widget_show_all (scrolled);
93
94     return scrolled;
95 }
96
97 TboWindow *
98 tbo_new_tbo (int width, int height)
99 {
100     TboWindow *tbo;
101     Comic *comic;
102     GtkWidget *window;
103     GtkWidget *container;
104     GtkWidget *tool_paned;
105     GtkWidget *menu;
106     GtkWidget *toolbar;
107     GtkWidget *scrolled;
108     GtkWidget *scrolled2;
109     GtkWidget *darea;
110     GtkWidget *status;
111     GtkWidget *hpaned;
112     GtkWidget *notebook;
113
114     GtkUIManager *manager;
115
116     NWINDOWS++;
117
118     window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
119     gtk_window_set_default_size (GTK_WINDOW (window), width, height);
120     gtk_window_set_icon (GTK_WINDOW (window), create_pixbuf (DATA_DIR "/icon.png"));
121
122     // El contenedor principal
123     container = gtk_vbox_new (FALSE, 0);
124     gtk_container_add (GTK_CONTAINER (window), container);
125
126     comic = tbo_comic_new (_("Untitled"), width, height);
127     gtk_window_set_title (GTK_WINDOW (window), comic->title);
128     scrolled = gtk_scrolled_window_new (NULL, NULL);
129     gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
130     darea = get_drawing_area (width, height);
131     gtk_container_add (GTK_CONTAINER (scrolled), darea);
132     notebook = gtk_notebook_new ();
133     gtk_notebook_set_scrollable (GTK_NOTEBOOK (notebook), TRUE);
134     gtk_notebook_append_page (GTK_NOTEBOOK (notebook), scrolled, NULL);
135
136     hpaned = gtk_hpaned_new ();
137     tool_paned = gtk_vbox_new (FALSE, 0);
138     scrolled2 = gtk_scrolled_window_new (NULL, NULL);
139     gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled2), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
140     gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled2), tool_paned);
141
142     gtk_paned_set_position (GTK_PANED (hpaned), width - 200);
143     gtk_paned_pack1 (GTK_PANED (hpaned), notebook, TRUE, FALSE);
144     gtk_paned_pack2 (GTK_PANED (hpaned), scrolled2, TRUE, FALSE);
145
146     status = gtk_statusbar_new ();
147
148     tbo = tbo_window_new (window, scrolled, notebook, tool_paned, status, container, comic);
149     tbo_window_update_status (tbo, 0, 0);
150
151     // ui-drawing.c (expose, motion and click)
152     darea_connect_signals (tbo, darea);
153
154     // key press event
155     g_signal_connect (tbo->notebook, "switch-page", G_CALLBACK (notebook_switch_page_cb), tbo);
156     g_signal_connect (tbo->window, "key_press_event", G_CALLBACK (on_key_cb), tbo);
157     g_signal_connect (window, "delete-event", G_CALLBACK (tbo_window_free_cb), tbo);
158
159     // Generando la barra de herramientas de la aplicacion
160     toolbar = generate_toolbar (tbo);
161
162     // Generando el menu de la aplicacion
163     menu = generate_menu (tbo);
164
165     gtk_box_pack_start (GTK_BOX (container), menu, FALSE, FALSE, 0);
166     gtk_box_pack_start (GTK_BOX (container), toolbar, FALSE, FALSE, 0);
167
168     gtk_container_add (GTK_CONTAINER (container), hpaned);
169
170     gtk_box_pack_start (GTK_BOX (container), status, FALSE, FALSE, 0);
171
172     gtk_widget_show_all (window);
173     set_selected_tool_and_action (SELECTOR, tbo);
174
175     return tbo;
176 }
177
178 void
179 tbo_window_update_status (TboWindow *tbo, int x, int y)
180 {
181     char buffer[200];
182     snprintf (buffer, 200, _("page: %d of %d [ %5d,%5d ] | frames: %d"),
183                     tbo_comic_page_index (tbo->comic),
184                     tbo_comic_len (tbo->comic),
185                     x, y,
186                     tbo_page_len (tbo_comic_get_current_page (tbo->comic)));
187     gtk_statusbar_push (GTK_STATUSBAR (tbo->status), 0, buffer);
188     update_drawing (tbo);
189     update_toolbar (tbo);
190 }
191
192 gboolean
193 remove_cb (GtkWidget *widget, gpointer data)
194 {
195     gtk_widget_destroy(widget);
196     return FALSE;
197 }
198
199 void
200 tbo_empty_tool_area (TboWindow *tbo)
201 {
202     gtk_container_foreach (GTK_CONTAINER (tbo->toolarea), (GtkCallback)remove_cb, NULL);
203 }