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