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