]> git.sur5r.net Git - glabels/blob - glabels2/src/wdgt-rotate-label.c
Initial revision
[glabels] / glabels2 / src / wdgt-rotate-label.c
1 /*
2  *  (GLABELS) Label and Business Card Creation program for GNOME
3  *
4  *  wdgt_rotate_label.c:  label rotate selection widget module
5  *
6  *  Copyright (C) 2001-2002  Jim Evins <evins@snaught.com>.
7  *
8  *  This program is free software; you can redistribute it and/or modify
9  *  it under the terms of the GNU General Public License as published by
10  *  the Free Software Foundation; either version 2 of the License, or
11  *  (at your option) any later version.
12  *
13  *  This program is distributed in the hope that it will be useful,
14  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  *  GNU General Public License for more details.
17  *
18  *  You should have received a copy of the GNU General Public License
19  *  along with this program; if not, write to the Free Software
20  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
21  */
22
23 #include <config.h>
24
25 #include "wdgt-rotate-label.h"
26 #include "template.h"
27 #include "marshal.h"
28
29 #include "debug.h"
30
31 #define MINI_PREVIEW_MAX_PIXELS 48
32
33 /*===========================================*/
34 /* Private types                             */
35 /*===========================================*/
36
37 enum {
38         CHANGED,
39         LAST_SIGNAL
40 };
41
42 typedef void (*glWdgtRotateLabelSignal) (GObject * object, gpointer data);
43
44 /*===========================================*/
45 /* Private globals                           */
46 /*===========================================*/
47
48 static GObjectClass *parent_class;
49
50 static gint wdgt_rotate_label_signals[LAST_SIGNAL] = { 0 };
51
52 /*===========================================*/
53 /* Local function prototypes                 */
54 /*===========================================*/
55
56 static void gl_wdgt_rotate_label_class_init    (glWdgtRotateLabelClass * class);
57 static void gl_wdgt_rotate_label_instance_init (glWdgtRotateLabel * rotate_select);
58 static void gl_wdgt_rotate_label_finalize      (GObject * object);
59
60 static void gl_wdgt_rotate_label_construct     (glWdgtRotateLabel * rotate_select);
61
62 static void entry_changed_cb                   (GtkToggleButton * toggle,
63                                                 gpointer user_data);
64
65 static GtkWidget *mini_preview_canvas_new      (void);
66
67 static void mini_preview_canvas_update         (GnomeCanvas * canvas,
68                                                 glTemplate * template,
69                                                 gboolean rotate_flag);
70
71 /****************************************************************************/
72 /* Boilerplate Object stuff.                                                */
73 /****************************************************************************/
74 guint
75 gl_wdgt_rotate_label_get_type (void)
76 {
77         static guint wdgt_rotate_label_type = 0;
78
79         if (!wdgt_rotate_label_type) {
80                 GTypeInfo wdgt_rotate_label_info = {
81                         sizeof (glWdgtRotateLabelClass),
82                         NULL,
83                         NULL,
84                         (GClassInitFunc) gl_wdgt_rotate_label_class_init,
85                         NULL,
86                         NULL,
87                         sizeof (glWdgtRotateLabel),
88                         0,
89                         (GInstanceInitFunc) gl_wdgt_rotate_label_instance_init,
90
91                 };
92
93                 wdgt_rotate_label_type =
94                         g_type_register_static (gtk_hbox_get_type (),
95                                                 "glWdgtRotateLabel",
96                                                 &wdgt_rotate_label_info, 0);
97         }
98
99         return wdgt_rotate_label_type;
100 }
101
102 static void
103 gl_wdgt_rotate_label_class_init (glWdgtRotateLabelClass * class)
104 {
105         GObjectClass *object_class;
106
107         object_class = (GObjectClass *) class;
108
109         parent_class = gtk_type_class (gtk_hbox_get_type ());
110
111         object_class->finalize = gl_wdgt_rotate_label_finalize;
112
113         wdgt_rotate_label_signals[CHANGED] =
114             g_signal_new ("changed",
115                           G_OBJECT_CLASS_TYPE(object_class),
116                           G_SIGNAL_RUN_LAST,
117                           G_STRUCT_OFFSET (glWdgtRotateLabelClass, changed),
118                           NULL, NULL,
119                           gl_marshal_VOID__VOID,
120                           G_TYPE_NONE, 0);
121
122 }
123
124 static void
125 gl_wdgt_rotate_label_instance_init (glWdgtRotateLabel * rotate_select)
126 {
127         rotate_select->rotate_check = NULL;
128
129         rotate_select->canvas = NULL;
130
131         rotate_select->template = NULL;
132 }
133
134 static void
135 gl_wdgt_rotate_label_finalize (GObject * object)
136 {
137         glWdgtRotateLabel *rotate_select;
138         glWdgtRotateLabelClass *class;
139
140         g_return_if_fail (object != NULL);
141         g_return_if_fail (GL_IS_WDGT_ROTATE_LABEL (object));
142
143         rotate_select = GL_WDGT_ROTATE_LABEL (object);
144
145 #if 0
146         gl_template_free (&rotate_select->template);
147 #endif
148
149         G_OBJECT_CLASS (parent_class)->finalize (object);
150 }
151
152 GtkWidget *
153 gl_wdgt_rotate_label_new (void)
154 {
155         glWdgtRotateLabel *rotate_select;
156
157         rotate_select = g_object_new (gl_wdgt_rotate_label_get_type (), NULL);
158
159         gl_wdgt_rotate_label_construct (rotate_select);
160
161         return GTK_WIDGET (rotate_select);
162 }
163
164 /*--------------------------------------------------------------------------*/
165 /* Construct composite widget.                                              */
166 /*--------------------------------------------------------------------------*/
167 static void
168 gl_wdgt_rotate_label_construct (glWdgtRotateLabel * rotate_select)
169 {
170         GtkWidget *whbox;
171
172         whbox = GTK_WIDGET (rotate_select);
173
174         /* Actual selection control */
175         rotate_select->rotate_check =
176             gtk_check_button_new_with_label (_("Rotate"));
177         gtk_box_pack_start (GTK_BOX (whbox), rotate_select->rotate_check, TRUE,
178                             TRUE, GNOME_PAD);
179
180         /* mini_preview canvas */
181         rotate_select->canvas = mini_preview_canvas_new ();
182         gtk_box_pack_start (GTK_BOX (whbox), rotate_select->canvas,
183                             TRUE, TRUE, GNOME_PAD);
184
185         /* Connect signals to controls */
186         g_signal_connect (G_OBJECT (rotate_select->rotate_check), "toggled",
187                           G_CALLBACK (entry_changed_cb), rotate_select);
188 }
189
190 /*--------------------------------------------------------------------------*/
191 /* PRIVATE.  modify widget due to change of check button                    */
192 /*--------------------------------------------------------------------------*/
193 static void
194 entry_changed_cb (GtkToggleButton * toggle,
195                   gpointer user_data)
196 {
197         glWdgtRotateLabel *rotate_select = GL_WDGT_ROTATE_LABEL (user_data);
198
199         if (rotate_select->template != NULL) {
200                 /* Update mini_preview canvas & details with template */
201                 mini_preview_canvas_update (GNOME_CANVAS
202                                             (rotate_select->canvas),
203                                             rotate_select->template,
204                                             gtk_toggle_button_get_active
205                                             (toggle));
206         }
207
208         /* Emit our "changed" signal */
209         g_signal_emit (G_OBJECT (user_data),
210                        wdgt_rotate_label_signals[CHANGED], 0);
211
212 }
213
214 /*--------------------------------------------------------------------------*/
215 /* PRIVATE.  Draw a mini-preview canvas.                                    */
216 /*--------------------------------------------------------------------------*/
217 static GtkWidget *
218 mini_preview_canvas_new (void)
219 {
220         GtkWidget *wcanvas = NULL;
221
222         /* Create a canvas */
223         gtk_widget_push_colormap (gdk_rgb_get_colormap ());
224         wcanvas = gnome_canvas_new_aa ();
225         gtk_widget_pop_colormap ();
226
227         gtk_widget_set_size_request (GTK_WIDGET (wcanvas),
228                                      MINI_PREVIEW_MAX_PIXELS + 8,
229                                      MINI_PREVIEW_MAX_PIXELS + 8);
230
231         gtk_object_set_data (GTK_OBJECT (wcanvas), "label_item", NULL);
232
233         return wcanvas;
234 }
235
236 /*--------------------------------------------------------------------------*/
237 /* PRIVATE.  Update mini-preview canvas from new template.                  */
238 /*--------------------------------------------------------------------------*/
239 static void
240 mini_preview_canvas_update (GnomeCanvas * canvas,
241                             glTemplate * template,
242                             gboolean rotate_flag)
243 {
244         gdouble canvas_scale;
245         GnomeCanvasGroup *group = NULL;
246         GnomeCanvasItem *label_item = NULL;
247         gdouble m, w, h;
248
249         /* Fetch our data from canvas */
250         label_item = g_object_get_data (G_OBJECT (canvas), "label_item");
251
252         m = MAX (template->label_width, template->label_height);
253         canvas_scale = (MINI_PREVIEW_MAX_PIXELS) / m;
254
255         /* FIXME: Stupid hack to eliminate canvas artifacts. */
256         if (rotate_flag) {
257                 canvas_scale *= 1.02;
258         }
259
260         /* scale and size canvas */
261         gnome_canvas_set_pixels_per_unit (GNOME_CANVAS (canvas), canvas_scale);
262         group = gnome_canvas_root (GNOME_CANVAS (canvas));
263         gnome_canvas_set_scroll_region (GNOME_CANVAS (canvas),
264                                         -m / 2.0, -m / 2.0,
265                                         +m / 2.0, +m / 2.0);
266
267         /* remove old label outline */
268         if (label_item != NULL) {
269                 gtk_object_destroy (GTK_OBJECT (label_item));
270         }
271
272         /* draw mini label outline */
273         if (!rotate_flag) {
274                 w = template->label_width;
275                 h = template->label_height;
276         } else {
277                 w = template->label_height;
278                 h = template->label_width;
279         }
280         switch (template->style) {
281         case GL_TEMPLATE_STYLE_RECT:
282                 label_item = gnome_canvas_item_new (group,
283                                                     gnome_canvas_rect_get_type(),
284                                                     "x1", -w / 2.0,
285                                                     "y1", -h / 2.0,
286                                                     "x2", +w / 2.0,
287                                                     "y2", +h / 2.0,
288                                                     "width_pixels", 1,
289                                                     "outline_color", "black",
290                                                     "fill_color", "white",
291                                                     NULL);
292                 break;
293         case GL_TEMPLATE_STYLE_ROUND:
294         case GL_TEMPLATE_STYLE_CD:
295                 label_item = gnome_canvas_item_new (group,
296                                                     gnome_canvas_ellipse_get_type(),
297                                                     "x1", -w / 2.0,
298                                                     "y1", -h / 2.0,
299                                                     "x2", +w / 2.0,
300                                                     "y2", +h / 2.0,
301                                                     "width_pixels", 2,
302                                                     "outline_color", "black",
303                                                     "fill_color", "white",
304                                                     NULL);
305                 break;
306         default:
307                 g_warning ("Unknown label style");
308                 break;
309         }
310
311         gtk_object_set_data (GTK_OBJECT (canvas), "label_item", label_item);
312
313 }
314
315 /****************************************************************************/
316 /* query state of widget.                                                   */
317 /****************************************************************************/
318 gboolean
319 gl_wdgt_rotate_label_get_state (glWdgtRotateLabel * rotate_select)
320 {
321         return
322             gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
323                                           (rotate_select->rotate_check));
324 }
325
326 /****************************************************************************/
327 /* set state of widget.                                                     */
328 /****************************************************************************/
329 void
330 gl_wdgt_rotate_label_set_state (glWdgtRotateLabel * rotate_select,
331                                 gboolean state)
332 {
333         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
334                                       (rotate_select->rotate_check), state);
335 }
336
337 /****************************************************************************/
338 /* set template for widget.                                                 */
339 /****************************************************************************/
340 void
341 gl_wdgt_rotate_label_set_template_name (glWdgtRotateLabel * rotate_select,
342                                         gchar * name)
343 {
344         glTemplate *template;
345
346         template = gl_template_from_name (name);
347         rotate_select->template = template;
348
349         if (template->label_width != template->label_height) {
350                 gtk_widget_set_sensitive (rotate_select->rotate_check, TRUE);
351         } else {
352                 gtk_widget_set_sensitive (rotate_select->rotate_check, FALSE);
353         }
354
355         mini_preview_canvas_update (GNOME_CANVAS (rotate_select->canvas),
356                                     template, FALSE);
357         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
358                                       (rotate_select->rotate_check), FALSE);
359 }