text-tool callbacks should return a gboolean.
[tbo.git] / src / text-tool.c
1 #include <gtk/gtk.h>
2 #include <glib/gi18n.h>
3 #include <cairo.h>
4 #include "tbo-window.h"
5 #include "textobj.h"
6 #include "text-tool.h"
7 #include "frame.h"
8 #include "ui-drawing.h"
9
10 static GtkWidget *FONT = NULL;
11 static GtkWidget *FONT_COLOR = NULL;
12 static TextObj *TEXT_SELECTED = NULL;
13 static GtkTextBuffer *TEXT_BUFFER = NULL;
14
15 gboolean
16 on_tview_focus_in (GtkWidget *view, GdkEventFocus *event, gpointer data)
17 {
18     set_key_binder (FALSE);
19     return FALSE;
20 }
21
22 gboolean
23 on_tview_focus_out (GtkWidget *view, GdkEventFocus *event, gpointer data)
24 {
25     set_key_binder (TRUE);
26     return FALSE;
27 }
28
29
30 gboolean
31 on_text_change (GtkTextBuffer *buf, gpointer data)
32 {
33     GtkTextIter start, end;
34     gtk_text_buffer_get_start_iter (buf, &start);
35     gtk_text_buffer_get_end_iter (buf, &end);
36
37     if (TEXT_SELECTED)
38     {
39         tbo_text_set_text (TEXT_SELECTED, gtk_text_buffer_get_text (buf, &start, &end, FALSE));
40     }
41     return FALSE;
42 }
43
44 gboolean
45 on_font_change (GtkFontButton *fbutton, TboWindow *tbo)
46 {
47     if (TEXT_SELECTED)
48     {
49         tbo_text_change_font (TEXT_SELECTED, text_tool_get_pango_font ());
50         update_drawing (tbo);
51     }
52     return FALSE;
53 }
54
55 gboolean
56 on_color_change (GtkColorButton *cbutton, TboWindow *tbo)
57 {
58     if (TEXT_SELECTED)
59     {
60         double r, g, b;
61         text_tool_get_color (&r, &g, &b);
62         tbo_text_change_color (TEXT_SELECTED, r, g, b);
63         update_drawing (tbo);
64     }
65     return FALSE;
66 }
67
68 GtkWidget *
69 setup_toolarea (TboWindow *tbo)
70 {
71     GtkWidget *vbox;
72     GtkWidget *hbox;
73     GtkWidget *font_color_label = gtk_label_new (_("Text color:"));
74     GtkWidget *font_label = gtk_label_new (_("Font:"));
75     GtkWidget *scroll;
76     GtkWidget *view;
77
78     gtk_misc_set_alignment (GTK_MISC (font_label), 0, 0);
79     gtk_misc_set_alignment (GTK_MISC (font_color_label), 0, 0);
80
81     FONT = gtk_font_button_new ();
82     g_signal_connect (FONT, "font-set", G_CALLBACK (on_font_change), tbo);
83     FONT_COLOR = gtk_color_button_new ();
84     g_signal_connect (FONT_COLOR, "color-set", G_CALLBACK (on_color_change), tbo);
85
86     vbox = gtk_vbox_new (FALSE, 5);
87
88     hbox = gtk_hbox_new (FALSE, 5);
89     gtk_box_pack_start (GTK_BOX (hbox), font_label, TRUE, TRUE, 5);
90     gtk_box_pack_start (GTK_BOX (hbox), FONT, TRUE, TRUE, 5);
91     gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
92
93     hbox = gtk_hbox_new (FALSE, 5);
94     gtk_box_pack_start (GTK_BOX (hbox), font_color_label, TRUE, TRUE, 5);
95     gtk_box_pack_start (GTK_BOX (hbox), FONT_COLOR, TRUE, TRUE, 5);
96     gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
97
98     scroll = gtk_scrolled_window_new (NULL, NULL);
99     gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
100     view = gtk_text_view_new ();
101     gtk_widget_add_events (view, GDK_FOCUS_CHANGE_MASK);
102     g_signal_connect (view, "focus-in-event", G_CALLBACK (on_tview_focus_in), tbo);
103     g_signal_connect (view, "focus-out-event", G_CALLBACK (on_tview_focus_out), tbo);
104
105     gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (view), GTK_WRAP_WORD);
106     TEXT_BUFFER = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
107     gtk_text_buffer_set_text (TEXT_BUFFER, "", -1);
108     g_signal_connect (TEXT_BUFFER, "changed", G_CALLBACK (on_text_change), tbo);
109     gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scroll), view);
110     gtk_box_pack_start (GTK_BOX (vbox), scroll, FALSE, FALSE, 5);
111
112     return vbox;
113 }
114
115 void text_tool_on_select (TboWindow *tbo)
116 {
117     GtkWidget *toolarea = setup_toolarea (tbo);
118     gtk_widget_show_all (GTK_WIDGET (toolarea));
119     tbo_empty_tool_area (tbo);
120     gtk_container_add (GTK_CONTAINER (tbo->toolarea), toolarea);
121 }
122
123 void text_tool_on_unselect (TboWindow *tbo)
124 {
125     /*
126     if (FONT)
127         gtk_widget_destroy (GTK_WIDGET (FONT));
128     if (FONT_COLOR)
129         gtk_widget_destroy (GTK_WIDGET (FONT_COLOR));
130     */
131     tbo_empty_tool_area (tbo);
132     set_key_binder (TRUE);
133 }
134
135 void text_tool_on_move (GtkWidget *widget, GdkEventMotion *event, TboWindow *tbo)
136 {}
137
138 void text_tool_on_click (GtkWidget *widget, GdkEventButton *event, TboWindow *tbo)
139 {
140     Frame *frame = get_frame_view ();
141     double r, g, b;
142     int x = (int)event->x;
143     int y = (int)event->y;
144     gboolean found = FALSE;
145     GList *obj_list;
146     tbo_object * obj;
147     TextObj *text;
148
149     for (obj_list = g_list_first (frame->objects); obj_list; obj_list = obj_list->next)
150     {
151         obj = (tbo_object *)obj_list->data;
152         if (obj->type == TEXTOBJ && tbo_frame_point_inside_obj (obj, x, y))
153         {
154             text = (TextObj *)obj;
155             found = TRUE;
156         }
157     }
158     if (!found)
159     {
160         x = tbo_frame_get_base_x (x);
161         y = tbo_frame_get_base_y (y);
162         text_tool_get_color (&r, &g, &b);
163         text = tbo_text_new_with_params (x, y, 100, 0,
164                                           "Texto",
165                                           (char *)text_tool_get_pango_font (),
166                                           r, g, b);
167         tbo_frame_add_obj (frame, text);
168     }
169     text_tool_set_selected (text);
170 }
171
172 void text_tool_on_release (GtkWidget *widget, GdkEventButton *event, TboWindow *tbo)
173 {}
174
175 void text_tool_on_key (GtkWidget *widget, GdkEventKey *event, TboWindow *tbo)
176 {}
177
178 void text_tool_drawing (cairo_t *cr)
179 {
180     const double dashes[] = {5, 5};
181     int x, y;
182
183     if (TEXT_SELECTED)
184     {
185         tbo_object *OBJ = TEXT_SELECTED;
186         cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE);
187         cairo_set_line_width (cr, 1);
188         cairo_set_dash (cr, dashes, G_N_ELEMENTS (dashes), 0);
189         cairo_set_source_rgb (cr, 0.9, 0, 0);
190         int ox, oy, ow, oh;
191         tbo_frame_get_obj_relative (OBJ, &ox, &oy, &ow, &oh);
192
193         cairo_translate (cr, ox, oy);
194         cairo_rotate (cr, OBJ->angle);
195         cairo_rectangle (cr, 0, 0, ow, oh);
196         cairo_stroke (cr);
197
198         cairo_set_antialias (cr, CAIRO_ANTIALIAS_DEFAULT);
199     }
200 }
201
202 const gchar *
203 text_tool_get_font_name ()
204 {
205     PangoFontDescription *pango_font = NULL;
206
207     if (FONT)
208     {
209         pango_font = pango_font_description_from_string (
210                 gtk_font_button_get_font_name (GTK_FONT_BUTTON (FONT)));
211         return pango_font_description_get_family (pango_font);
212     }
213
214     return NULL;
215 }
216
217 char *
218 text_tool_get_pango_font ()
219 {
220     if (FONT)
221     {
222         return (char *)gtk_font_button_get_font_name (GTK_FONT_BUTTON (FONT));
223     }
224
225     return "Sans Normal 27";
226 }
227
228 void
229 text_tool_get_color (double *r, double *g, double *b)
230 {
231     GdkColor color;
232     gtk_color_button_get_color (GTK_COLOR_BUTTON (FONT_COLOR), &color);
233     *r = color.red / 65535.0;
234     *g = color.green / 65535.0;
235     *b = color.blue / 65535.0;
236 }
237
238 void
239 text_tool_set_selected (TextObj *text)
240 {
241     GdkColor color;
242     char *str = tbo_text_get_text (text);
243     TEXT_SELECTED = NULL;
244     gtk_font_button_set_font_name (GTK_FONT_BUTTON (FONT), tbo_text_get_string (text));
245     tbo_text_get_color (text, &color);
246     gtk_color_button_set_color (GTK_COLOR_BUTTON (FONT_COLOR), &color);
247     gtk_text_buffer_set_text (TEXT_BUFFER, str, -1);
248     TEXT_SELECTED = text;
249 }