2 * (GLABELS) Label and Business Card Creation program for GNOME
4 * label_object.c: GLabels label object base class
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 "label-object.h"
30 /*========================================================*/
32 /*========================================================*/
34 struct _glLabelObjectPrivate {
38 glLabelObjectFlip flip;
51 /*========================================================*/
52 /* Private globals. */
53 /*========================================================*/
55 static GObjectClass *parent_class = NULL;
57 static guint signals[LAST_SIGNAL] = {0};
59 static guint instance = 0;
61 /*========================================================*/
62 /* Private function prototypes. */
63 /*========================================================*/
65 static void gl_label_object_class_init (glLabelObjectClass *klass);
66 static void gl_label_object_instance_init (glLabelObject *object);
67 static void gl_label_object_finalize (GObject *object);
69 static void merge_changed_cb (glLabel *label,
70 glLabelObject *object);
73 /*****************************************************************************/
74 /* Boilerplate object stuff. */
75 /*****************************************************************************/
77 gl_label_object_get_type (void)
79 static GType type = 0;
83 sizeof (glLabelObjectClass),
86 (GClassInitFunc) gl_label_object_class_init,
89 sizeof (glLabelObject),
91 (GInstanceInitFunc) gl_label_object_instance_init,
94 type = g_type_register_static (G_TYPE_OBJECT,
95 "glLabelObject", &info, 0);
102 gl_label_object_class_init (glLabelObjectClass *klass)
104 GObjectClass *object_class = (GObjectClass *) klass;
106 gl_debug (DEBUG_LABEL, "START");
108 parent_class = g_type_class_peek_parent (klass);
110 object_class->finalize = gl_label_object_finalize;
113 g_signal_new ("changed",
114 G_OBJECT_CLASS_TYPE (object_class),
116 G_STRUCT_OFFSET (glLabelObjectClass, changed),
118 gl_marshal_VOID__VOID,
123 g_signal_new ("moved",
124 G_OBJECT_CLASS_TYPE (object_class),
126 G_STRUCT_OFFSET (glLabelObjectClass, moved),
128 gl_marshal_VOID__DOUBLE_DOUBLE,
130 2, G_TYPE_DOUBLE, G_TYPE_DOUBLE);
131 signals[FLIP_ROTATE] =
132 g_signal_new ("flip_rotate",
133 G_OBJECT_CLASS_TYPE (object_class),
135 G_STRUCT_OFFSET (glLabelObjectClass, flip_rotate),
137 gl_marshal_VOID__INT_DOUBLE,
139 2, G_TYPE_INT, G_TYPE_DOUBLE);
142 G_OBJECT_CLASS_TYPE (object_class),
144 G_STRUCT_OFFSET (glLabelObjectClass, top),
146 gl_marshal_VOID__VOID,
151 g_signal_new ("bottom",
152 G_OBJECT_CLASS_TYPE (object_class),
154 G_STRUCT_OFFSET (glLabelObjectClass, bottom),
156 gl_marshal_VOID__VOID,
160 gl_debug (DEBUG_LABEL, "END");
164 gl_label_object_instance_init (glLabelObject *object)
166 gl_debug (DEBUG_LABEL, "START");
168 object->private = g_new0 (glLabelObjectPrivate, 1);
170 object->private->name = g_strdup_printf ("object%d", instance++);
172 gl_debug (DEBUG_LABEL, "END");
176 gl_label_object_finalize (GObject *object)
180 gl_debug (DEBUG_LABEL, "START");
182 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
184 parent = GL_LABEL_OBJECT(object)->parent;
185 gl_label_remove_object (parent, GL_LABEL_OBJECT(object));
187 g_free (GL_LABEL_OBJECT(object)->private);
189 G_OBJECT_CLASS (parent_class)->finalize (object);
191 gl_debug (DEBUG_LABEL, "END");
194 /*****************************************************************************/
195 /* New label object. */
196 /*****************************************************************************/
198 gl_label_object_new (glLabel *label)
200 glLabelObject *object;
202 gl_debug (DEBUG_LABEL, "START");
204 object = g_object_new (gl_label_object_get_type(), NULL);
206 gl_label_object_set_parent (object, label);
208 gl_debug (DEBUG_LABEL, "END");
210 return G_OBJECT (object);
213 /*****************************************************************************/
214 /* Copy properties of one label object to another. */
215 /*****************************************************************************/
217 gl_label_object_copy_props (glLabelObject *dst_object,
218 glLabelObject *src_object)
221 glLabelObjectFlip flip;
223 g_return_if_fail (src_object && GL_IS_LABEL_OBJECT (src_object));
224 g_return_if_fail (dst_object && GL_IS_LABEL_OBJECT (dst_object));
226 gl_label_object_get_position (src_object, &x, &y);
227 gl_label_object_get_size (src_object, &w, &h);
228 flip = gl_label_object_get_flip (src_object);
230 gl_label_object_set_position (dst_object, x, y);
231 gl_label_object_set_size (dst_object, w, h);
232 gl_label_object_set_flip (dst_object, flip);
235 /*****************************************************************************/
236 /* Emit "changed" signal (for derived objects). */
237 /*****************************************************************************/
239 gl_label_object_emit_changed (glLabelObject *object)
241 gl_debug (DEBUG_LABEL, "START");
243 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
245 g_signal_emit (G_OBJECT(object), signals[CHANGED], 0);
247 gl_debug (DEBUG_LABEL, "END");
250 /*****************************************************************************/
251 /* Set parent label of object. */
252 /*****************************************************************************/
254 gl_label_object_set_parent (glLabelObject *object,
259 gl_debug (DEBUG_LABEL, "START");
261 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
262 g_return_if_fail (label && GL_IS_LABEL (label));
264 old_parent = object->parent;
265 if ( old_parent != NULL ) {
266 g_signal_handlers_disconnect_by_func (old_parent,
267 G_CALLBACK(merge_changed_cb),
269 gl_label_remove_object( old_parent, object );
271 gl_label_add_object( label, object );
273 g_signal_connect (G_OBJECT(label), "merge_changed",
274 G_CALLBACK(merge_changed_cb), object);
276 g_signal_emit (G_OBJECT(object), signals[CHANGED], 0);
278 gl_debug (DEBUG_LABEL, "END");
281 /*****************************************************************************/
282 /* Get parent label of object. */
283 /*****************************************************************************/
285 gl_label_object_get_parent (glLabelObject *object)
287 gl_debug (DEBUG_LABEL, "START");
289 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
291 gl_debug (DEBUG_LABEL, "END");
293 return object->parent;
296 /*****************************************************************************/
297 /* Set name of object. */
298 /*****************************************************************************/
300 gl_label_object_set_name (glLabelObject *object,
303 gl_debug (DEBUG_LABEL, "START");
305 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
307 g_free(object->private->name);
308 object->private->name = name;
310 g_signal_emit (G_OBJECT(object), signals[CHANGED], 0);
312 gl_debug (DEBUG_LABEL, "END");
315 /*****************************************************************************/
316 /* Get name of object. */
317 /*****************************************************************************/
319 gl_label_object_get_name (glLabelObject *object)
321 gl_debug (DEBUG_LABEL, "START");
323 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
325 gl_debug (DEBUG_LABEL, "END");
327 return g_strdup(object->private->name);
330 /*****************************************************************************/
331 /* Set position of object. */
332 /*****************************************************************************/
334 gl_label_object_set_position (glLabelObject *object,
340 gl_debug (DEBUG_LABEL, "START");
342 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
344 dx = x - object->private->x;
345 dy = y - object->private->y;
347 object->private->x = x;
348 object->private->y = y;
350 g_signal_emit (G_OBJECT(object), signals[MOVED], 0, dx, dy);
352 gl_debug (DEBUG_LABEL, "END");
355 /*****************************************************************************/
356 /* Set position of object relative to old position. */
357 /*****************************************************************************/
359 gl_label_object_set_position_relative (glLabelObject *object,
363 gl_debug (DEBUG_LABEL, "START");
365 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
367 object->private->x += dx;
368 object->private->y += dy;
370 gl_debug (DEBUG_LABEL, " x = %f, y= %f",
374 g_signal_emit (G_OBJECT(object), signals[MOVED], 0, dx, dy);
376 gl_debug (DEBUG_LABEL, "END");
379 /*****************************************************************************/
380 /* Get position of object. */
381 /*****************************************************************************/
383 gl_label_object_get_position (glLabelObject *object,
387 gl_debug (DEBUG_LABEL, "START");
389 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
391 *x = object->private->x;
392 *y = object->private->y;
394 gl_debug (DEBUG_LABEL, "END");
397 /*****************************************************************************/
398 /* Set size of object. */
399 /*****************************************************************************/
401 gl_label_object_set_size (glLabelObject *object,
405 gl_debug (DEBUG_LABEL, "START");
407 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
409 object->private->w = w;
410 object->private->h = h;
412 g_signal_emit (G_OBJECT(object), signals[CHANGED], 0);
414 gl_debug (DEBUG_LABEL, "END");
417 /*****************************************************************************/
418 /* Get size of object. */
419 /*****************************************************************************/
421 gl_label_object_get_size (glLabelObject *object,
425 gl_debug (DEBUG_LABEL, "START");
427 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
429 *w = object->private->w;
430 *h = object->private->h;
432 gl_debug (DEBUG_LABEL, "END");
435 /****************************************************************************/
436 /* Set flip state of object. */
437 /****************************************************************************/
439 gl_label_object_set_flip (glLabelObject *object,
440 glLabelObjectFlip flip)
442 gl_debug (DEBUG_LABEL, "START");
444 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
446 object->private->flip = flip;
448 g_signal_emit (G_OBJECT(object), signals[FLIP_ROTATE], 0,
449 flip, object->private->rotate_degs);
451 gl_debug (DEBUG_LABEL, "END");
454 /****************************************************************************/
455 /* Flip object horizontally. */
456 /****************************************************************************/
458 gl_label_object_flip_horiz (glLabelObject *object)
460 gl_debug (DEBUG_LABEL, "START");
462 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
464 object->private->flip ^= GL_LABEL_OBJECT_FLIP_HORIZ;
466 g_signal_emit (G_OBJECT(object), signals[FLIP_ROTATE], 0,
467 object->private->flip, object->private->rotate_degs);
469 gl_debug (DEBUG_LABEL, "END");
472 /****************************************************************************/
473 /* Flip object vertically. */
474 /****************************************************************************/
476 gl_label_object_flip_vert (glLabelObject *object)
478 gl_debug (DEBUG_LABEL, "START");
480 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
482 object->private->flip ^= GL_LABEL_OBJECT_FLIP_VERT;
484 g_signal_emit (G_OBJECT(object), signals[FLIP_ROTATE], 0,
485 object->private->flip, object->private->rotate_degs);
487 gl_debug (DEBUG_LABEL, "END");
490 /****************************************************************************/
491 /* Get flip state of object. */
492 /****************************************************************************/
494 gl_label_object_get_flip (glLabelObject *object)
496 gl_debug (DEBUG_LABEL, "");
498 g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
500 return object->private->flip;
503 /****************************************************************************/
504 /* Bring label object to front/top. */
505 /****************************************************************************/
507 gl_label_object_raise_to_top (glLabelObject *object)
511 gl_debug (DEBUG_LABEL, "START");
513 label = object->parent;
515 gl_label_raise_object_to_top (label, object);
517 g_signal_emit (G_OBJECT(object), signals[TOP], 0);
519 gl_debug (DEBUG_LABEL, "END");
522 /****************************************************************************/
523 /* Send label object to rear/bottom. */
524 /****************************************************************************/
526 gl_label_object_lower_to_bottom (glLabelObject *object)
530 gl_debug (DEBUG_LABEL, "START");
532 label = object->parent;
534 gl_label_lower_object_to_bottom (label, object);
536 g_signal_emit (G_OBJECT(object), signals[BOTTOM], 0);
538 gl_debug (DEBUG_LABEL, "END");
541 /*--------------------------------------------------------------------------*/
542 /* PRIVATE. Label's merge data changed callback. */
543 /*--------------------------------------------------------------------------*/
545 merge_changed_cb (glLabel *label,
546 glLabelObject *object)
548 gl_label_object_emit_changed (object);