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