2 * (GLABELS) Label and Business Card Creation program for GNOME
4 * wdgt_rotate_label.c: label rotate selection widget module
6 * Copyright (C) 2001-2002 Jim Evins <evins@snaught.com>.
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.
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.
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
25 #include "wdgt-rotate-label.h"
31 #define MINI_PREVIEW_MAX_PIXELS 48
33 /*===========================================*/
35 /*===========================================*/
42 typedef void (*glWdgtRotateLabelSignal) (GObject * object, gpointer data);
44 /*===========================================*/
46 /*===========================================*/
48 static GObjectClass *parent_class;
50 static gint wdgt_rotate_label_signals[LAST_SIGNAL] = { 0 };
52 /*===========================================*/
53 /* Local function prototypes */
54 /*===========================================*/
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);
60 static void gl_wdgt_rotate_label_construct (glWdgtRotateLabel * rotate_select);
62 static void entry_changed_cb (GtkToggleButton * toggle,
65 static GtkWidget *mini_preview_canvas_new (void);
67 static void mini_preview_canvas_update (GnomeCanvas * canvas,
68 glTemplate * template,
69 gboolean rotate_flag);
71 /****************************************************************************/
72 /* Boilerplate Object stuff. */
73 /****************************************************************************/
75 gl_wdgt_rotate_label_get_type (void)
77 static guint wdgt_rotate_label_type = 0;
79 if (!wdgt_rotate_label_type) {
80 GTypeInfo wdgt_rotate_label_info = {
81 sizeof (glWdgtRotateLabelClass),
84 (GClassInitFunc) gl_wdgt_rotate_label_class_init,
87 sizeof (glWdgtRotateLabel),
89 (GInstanceInitFunc) gl_wdgt_rotate_label_instance_init,
93 wdgt_rotate_label_type =
94 g_type_register_static (gtk_hbox_get_type (),
96 &wdgt_rotate_label_info, 0);
99 return wdgt_rotate_label_type;
103 gl_wdgt_rotate_label_class_init (glWdgtRotateLabelClass * class)
105 GObjectClass *object_class;
107 object_class = (GObjectClass *) class;
109 parent_class = gtk_type_class (gtk_hbox_get_type ());
111 object_class->finalize = gl_wdgt_rotate_label_finalize;
113 wdgt_rotate_label_signals[CHANGED] =
114 g_signal_new ("changed",
115 G_OBJECT_CLASS_TYPE(object_class),
117 G_STRUCT_OFFSET (glWdgtRotateLabelClass, changed),
119 gl_marshal_VOID__VOID,
125 gl_wdgt_rotate_label_instance_init (glWdgtRotateLabel * rotate_select)
127 rotate_select->rotate_check = NULL;
129 rotate_select->canvas = NULL;
131 rotate_select->template = NULL;
135 gl_wdgt_rotate_label_finalize (GObject * object)
137 glWdgtRotateLabel *rotate_select;
138 glWdgtRotateLabelClass *class;
140 g_return_if_fail (object != NULL);
141 g_return_if_fail (GL_IS_WDGT_ROTATE_LABEL (object));
143 rotate_select = GL_WDGT_ROTATE_LABEL (object);
146 gl_template_free (&rotate_select->template);
149 G_OBJECT_CLASS (parent_class)->finalize (object);
153 gl_wdgt_rotate_label_new (void)
155 glWdgtRotateLabel *rotate_select;
157 rotate_select = g_object_new (gl_wdgt_rotate_label_get_type (), NULL);
159 gl_wdgt_rotate_label_construct (rotate_select);
161 return GTK_WIDGET (rotate_select);
164 /*--------------------------------------------------------------------------*/
165 /* Construct composite widget. */
166 /*--------------------------------------------------------------------------*/
168 gl_wdgt_rotate_label_construct (glWdgtRotateLabel * rotate_select)
172 whbox = GTK_WIDGET (rotate_select);
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,
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);
185 /* Connect signals to controls */
186 g_signal_connect (G_OBJECT (rotate_select->rotate_check), "toggled",
187 G_CALLBACK (entry_changed_cb), rotate_select);
190 /*--------------------------------------------------------------------------*/
191 /* PRIVATE. modify widget due to change of check button */
192 /*--------------------------------------------------------------------------*/
194 entry_changed_cb (GtkToggleButton * toggle,
197 glWdgtRotateLabel *rotate_select = GL_WDGT_ROTATE_LABEL (user_data);
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
208 /* Emit our "changed" signal */
209 g_signal_emit (G_OBJECT (user_data),
210 wdgt_rotate_label_signals[CHANGED], 0);
214 /*--------------------------------------------------------------------------*/
215 /* PRIVATE. Draw a mini-preview canvas. */
216 /*--------------------------------------------------------------------------*/
218 mini_preview_canvas_new (void)
220 GtkWidget *wcanvas = NULL;
222 /* Create a canvas */
223 gtk_widget_push_colormap (gdk_rgb_get_colormap ());
224 wcanvas = gnome_canvas_new_aa ();
225 gtk_widget_pop_colormap ();
227 gtk_widget_set_size_request (GTK_WIDGET (wcanvas),
228 MINI_PREVIEW_MAX_PIXELS + 8,
229 MINI_PREVIEW_MAX_PIXELS + 8);
231 gtk_object_set_data (GTK_OBJECT (wcanvas), "label_item", NULL);
236 /*--------------------------------------------------------------------------*/
237 /* PRIVATE. Update mini-preview canvas from new template. */
238 /*--------------------------------------------------------------------------*/
240 mini_preview_canvas_update (GnomeCanvas * canvas,
241 glTemplate * template,
242 gboolean rotate_flag)
244 gdouble canvas_scale;
245 GnomeCanvasGroup *group = NULL;
246 GnomeCanvasItem *label_item = NULL;
247 gdouble m, raw_w, raw_h, w, h;
249 /* Fetch our data from canvas */
250 label_item = g_object_get_data (G_OBJECT (canvas), "label_item");
252 gl_template_get_label_size (template, &raw_w, &raw_h);
253 m = MAX (raw_w, raw_h);
254 canvas_scale = (MINI_PREVIEW_MAX_PIXELS) / m;
256 /* FIXME: Stupid hack to eliminate canvas artifacts. */
258 canvas_scale *= 1.02;
261 /* scale and size canvas */
262 gnome_canvas_set_pixels_per_unit (GNOME_CANVAS (canvas), canvas_scale);
263 group = gnome_canvas_root (GNOME_CANVAS (canvas));
264 gnome_canvas_set_scroll_region (GNOME_CANVAS (canvas),
268 /* remove old label outline */
269 if (label_item != NULL) {
270 gtk_object_destroy (GTK_OBJECT (label_item));
273 /* draw mini label outline */
281 switch (template->label.style) {
282 case GL_TEMPLATE_STYLE_RECT:
283 label_item = gnome_canvas_item_new (group,
284 gnome_canvas_rect_get_type(),
290 "outline_color", "black",
291 "fill_color", "white",
294 case GL_TEMPLATE_STYLE_ROUND:
295 case GL_TEMPLATE_STYLE_CD:
296 label_item = gnome_canvas_item_new (group,
297 gnome_canvas_ellipse_get_type(),
303 "outline_color", "black",
304 "fill_color", "white",
308 g_warning ("Unknown label style");
312 gtk_object_set_data (GTK_OBJECT (canvas), "label_item", label_item);
316 /****************************************************************************/
317 /* query state of widget. */
318 /****************************************************************************/
320 gl_wdgt_rotate_label_get_state (glWdgtRotateLabel * rotate_select)
323 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
324 (rotate_select->rotate_check));
327 /****************************************************************************/
328 /* set state of widget. */
329 /****************************************************************************/
331 gl_wdgt_rotate_label_set_state (glWdgtRotateLabel * rotate_select,
334 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
335 (rotate_select->rotate_check), state);
338 /****************************************************************************/
339 /* set template for widget. */
340 /****************************************************************************/
342 gl_wdgt_rotate_label_set_template_name (glWdgtRotateLabel * rotate_select,
345 glTemplate *template;
346 gdouble raw_w, raw_h;
348 template = gl_template_from_name (name);
349 rotate_select->template = template;
350 gl_template_get_label_size (template, &raw_w, &raw_h);
352 if (raw_w != raw_h) {
353 gtk_widget_set_sensitive (rotate_select->rotate_check, TRUE);
355 gtk_widget_set_sensitive (rotate_select->rotate_check, FALSE);
358 mini_preview_canvas_update (GNOME_CANVAS (rotate_select->canvas),
360 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
361 (rotate_select->rotate_check), FALSE);