]> git.sur5r.net Git - glabels/blob - glabels2/src/label-object.c
Initial revision
[glabels] / glabels2 / src / label-object.c
1 /*
2  *  (GLABELS) Label and Business Card Creation program for GNOME
3  *
4  *  label_object.c:  GLabels label object base class
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 <glib.h>
24
25 #include "label-object.h"
26 #include "marshal.h"
27
28 #include "debug.h"
29
30 /*========================================================*/
31 /* Private types.                                         */
32 /*========================================================*/
33
34 struct _glLabelObjectPrivate {
35         gchar *name;
36         gdouble x, y;
37         gdouble w, h;
38 };
39
40 enum {
41         CHANGED,
42         MOVED,
43         TOP,
44         BOTTOM,
45         LAST_SIGNAL
46 };
47
48 /*========================================================*/
49 /* Private globals.                                       */
50 /*========================================================*/
51
52 static GObjectClass *parent_class = NULL;
53
54 static guint signals[LAST_SIGNAL] = {0};
55
56 static guint instance = 0;
57
58 /*========================================================*/
59 /* Private function prototypes.                           */
60 /*========================================================*/
61
62 static void gl_label_object_class_init (glLabelObjectClass *klass);
63 static void gl_label_object_instance_init (glLabelObject *object);
64 static void gl_label_object_finalize (GObject *object);
65
66 \f
67 /*****************************************************************************/
68 /* Boilerplate object stuff.                                                 */
69 /*****************************************************************************/
70 GType
71 gl_label_object_get_type (void)
72 {
73         static GType type = 0;
74
75         if (!type) {
76                 GTypeInfo info = {
77                         sizeof (glLabelObjectClass),
78                         NULL,
79                         NULL,
80                         (GClassInitFunc) gl_label_object_class_init,
81                         NULL,
82                         NULL,
83                         sizeof (glLabelObject),
84                         0,
85                         (GInstanceInitFunc) gl_label_object_instance_init,
86                 };
87
88                 type = g_type_register_static (G_TYPE_OBJECT,
89                                                "glLabelObject", &info, 0);
90         }
91
92         return type;
93 }
94
95 static void
96 gl_label_object_class_init (glLabelObjectClass *klass)
97 {
98         GObjectClass *object_class = (GObjectClass *) klass;
99
100         gl_debug (DEBUG_LABEL, "START");
101
102         parent_class = g_type_class_peek_parent (klass);
103
104         object_class->finalize = gl_label_object_finalize;
105
106         signals[CHANGED] =
107                 g_signal_new ("changed",
108                               G_OBJECT_CLASS_TYPE (object_class),
109                               G_SIGNAL_RUN_LAST,
110                               G_STRUCT_OFFSET (glLabelObjectClass, changed),
111                               NULL, NULL,
112                               gl_marshal_VOID__VOID,
113                               G_TYPE_NONE,
114                               0);
115
116         signals[MOVED] =
117                 g_signal_new ("moved",
118                               G_OBJECT_CLASS_TYPE (object_class),
119                               G_SIGNAL_RUN_LAST,
120                               G_STRUCT_OFFSET (glLabelObjectClass, moved),
121                               NULL, NULL,
122                               gl_marshal_VOID__DOUBLE_DOUBLE,
123                               G_TYPE_NONE,
124                               2, G_TYPE_DOUBLE, G_TYPE_DOUBLE);
125         signals[TOP] =
126                 g_signal_new ("top",
127                               G_OBJECT_CLASS_TYPE (object_class),
128                               G_SIGNAL_RUN_LAST,
129                               G_STRUCT_OFFSET (glLabelObjectClass, top),
130                               NULL, NULL,
131                               gl_marshal_VOID__VOID,
132                               G_TYPE_NONE,
133                               0);
134
135         signals[BOTTOM] =
136                 g_signal_new ("bottom",
137                               G_OBJECT_CLASS_TYPE (object_class),
138                               G_SIGNAL_RUN_LAST,
139                               G_STRUCT_OFFSET (glLabelObjectClass, bottom),
140                               NULL, NULL,
141                               gl_marshal_VOID__VOID,
142                               G_TYPE_NONE,
143                               0);
144
145         gl_debug (DEBUG_LABEL, "END");
146 }
147
148 static void
149 gl_label_object_instance_init (glLabelObject *object)
150 {
151         gl_debug (DEBUG_LABEL, "START");
152
153         object->private = g_new0 (glLabelObjectPrivate, 1);
154
155         object->private->name = g_strdup_printf ("object%d", instance++);
156
157         gl_debug (DEBUG_LABEL, "END");
158 }
159
160 static void
161 gl_label_object_finalize (GObject *object)
162 {
163         glLabel       *parent;
164
165         gl_debug (DEBUG_LABEL, "START");
166
167         g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
168
169         parent = GL_LABEL_OBJECT(object)->parent;
170         gl_label_remove_object (parent, GL_LABEL_OBJECT(object));
171
172         g_free (GL_LABEL_OBJECT(object)->private);
173
174         G_OBJECT_CLASS (parent_class)->finalize (object);
175
176         gl_debug (DEBUG_LABEL, "END");
177 }
178
179 GObject *
180 gl_label_object_new (glLabel *label)
181 {
182         glLabelObject *object;
183
184         gl_debug (DEBUG_LABEL, "START");
185
186         object = g_object_new (gl_label_object_get_type(), NULL);
187
188         gl_label_object_set_parent (object, label);
189
190         gl_debug (DEBUG_LABEL, "END");
191
192         return G_OBJECT (object);
193 }
194
195 /*****************************************************************************/
196 /* Emit "changed" signal (for derived objects).                              */
197 /*****************************************************************************/
198 void
199 gl_label_object_emit_changed (glLabelObject *object)
200 {
201         gl_debug (DEBUG_LABEL, "START");
202
203         g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
204
205         g_signal_emit (G_OBJECT(object), signals[CHANGED], 0);
206
207         gl_debug (DEBUG_LABEL, "END");
208 }
209
210 /*****************************************************************************/
211 /* Set parent label of object.                                               */
212 /*****************************************************************************/
213 void
214 gl_label_object_set_parent (glLabelObject *object,
215                             glLabel *label)
216 {
217         glLabel *old_parent;
218
219         gl_debug (DEBUG_LABEL, "START");
220
221         g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
222         g_return_if_fail (label && GL_IS_LABEL (label));
223
224         old_parent = object->parent;
225         if ( old_parent != NULL ) {
226                 gl_label_remove_object( old_parent, object );
227         }
228         gl_label_add_object( label, object );
229
230         g_signal_emit (G_OBJECT(object), signals[CHANGED], 0);
231
232         gl_debug (DEBUG_LABEL, "END");
233 }
234
235 /*****************************************************************************/
236 /* Get parent label of object.                                               */
237 /*****************************************************************************/
238 glLabel *
239 gl_label_object_get_parent (glLabelObject *object)
240 {
241         gl_debug (DEBUG_LABEL, "START");
242
243         g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
244
245         gl_debug (DEBUG_LABEL, "END");
246
247         return object->parent;
248 }
249
250 /*****************************************************************************/
251 /* Set name of object.                                                       */
252 /*****************************************************************************/
253 void
254 gl_label_object_set_name (glLabelObject *object,
255                           gchar *name)
256 {
257         gl_debug (DEBUG_LABEL, "START");
258
259         g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
260
261         g_free(object->private->name);
262         object->private->name = name;
263
264         g_signal_emit (G_OBJECT(object), signals[CHANGED], 0);
265
266         gl_debug (DEBUG_LABEL, "END");
267 }
268
269 /*****************************************************************************/
270 /* Get name of object.                                                       */
271 /*****************************************************************************/
272 gchar *
273 gl_label_object_get_name (glLabelObject *object)
274 {
275         gl_debug (DEBUG_LABEL, "START");
276
277         g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
278
279         gl_debug (DEBUG_LABEL, "END");
280
281         return g_strdup(object->private->name);
282 }
283
284 /*****************************************************************************/
285 /* Set position of object.                                                   */
286 /*****************************************************************************/
287 void
288 gl_label_object_set_position (glLabelObject *object,
289                               gdouble x,
290                               gdouble y)
291 {
292         gdouble dx, dy;
293
294         gl_debug (DEBUG_LABEL, "START");
295
296         g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
297
298         dx = x - object->private->x;
299         dy = y - object->private->y;
300
301         object->private->x = x;
302         object->private->y = y;
303
304         g_signal_emit (G_OBJECT(object), signals[MOVED], 0, dx, dy);
305
306         gl_debug (DEBUG_LABEL, "END");
307 }
308
309 /*****************************************************************************/
310 /* Set position of object relative to old position.                          */
311 /*****************************************************************************/
312 void
313 gl_label_object_set_position_relative (glLabelObject *object,
314                                        gdouble dx,
315                                        gdouble dy)
316 {
317         gl_debug (DEBUG_LABEL, "START");
318
319         g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
320
321         object->private->x += dx;
322         object->private->y += dy;
323
324         gl_debug (DEBUG_LABEL, "       x = %f, y= %f",
325                   object->private->x,
326                   object->private->y);
327
328         g_signal_emit (G_OBJECT(object), signals[MOVED], 0, dx, dy);
329
330         gl_debug (DEBUG_LABEL, "END");
331 }
332
333 /*****************************************************************************/
334 /* Get position of object.                                                   */
335 /*****************************************************************************/
336 void
337 gl_label_object_get_position (glLabelObject *object,
338                               gdouble *x,
339                               gdouble *y)
340 {
341         gl_debug (DEBUG_LABEL, "START");
342
343         g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
344
345         *x = object->private->x;
346         *y = object->private->y;
347
348         gl_debug (DEBUG_LABEL, "END");
349 }
350
351 /*****************************************************************************/
352 /* Set size of object.                                                       */
353 /*****************************************************************************/
354 void
355 gl_label_object_set_size (glLabelObject *object,
356                           gdouble w,
357                           gdouble h)
358 {
359         gl_debug (DEBUG_LABEL, "START");
360
361         g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
362
363         object->private->w = w;
364         object->private->h = h;
365
366         g_signal_emit (G_OBJECT(object), signals[CHANGED], 0);
367
368         gl_debug (DEBUG_LABEL, "END");
369 }
370
371 /*****************************************************************************/
372 /* Get size of object.                                                       */
373 /*****************************************************************************/
374 void
375 gl_label_object_get_size (glLabelObject *object,
376                           gdouble *w,
377                           gdouble *h)
378 {
379         gl_debug (DEBUG_LABEL, "START");
380
381         g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
382
383         *w = object->private->w;
384         *h = object->private->h;
385
386         gl_debug (DEBUG_LABEL, "END");
387 }
388
389 /****************************************************************************/
390 /* Bring label object to front/top.                                         */
391 /****************************************************************************/
392 void
393 gl_label_object_raise_to_top (glLabelObject *object)
394 {
395         glLabel *label;
396
397         gl_debug (DEBUG_LABEL, "START");
398
399         label = object->parent;
400
401         gl_label_raise_object_to_top (label, object);
402
403         g_signal_emit (G_OBJECT(object), signals[TOP], 0);
404
405         gl_debug (DEBUG_LABEL, "END");
406 }
407
408 /****************************************************************************/
409 /* Send label object to rear/bottom.                                        */
410 /****************************************************************************/
411 void
412 gl_label_object_lower_to_bottom (glLabelObject *object)
413 {
414         glLabel *label;
415
416         gl_debug (DEBUG_LABEL, "START");
417
418         label = object->parent;
419
420         gl_label_lower_object_to_bottom (label, object);
421
422         g_signal_emit (G_OBJECT(object), signals[BOTTOM], 0);
423
424         gl_debug (DEBUG_LABEL, "END");
425 }
426