1 /* ADG - Automatic Drawing Generation
2 * Copyright (C) 2007,2008,2009 Nicola Fontana <ntd at entidi.it>
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
23 * @short_description: Base entity for markers
25 * A marker is an entity to be applied at the start or end of a segment.
26 * Typical examples include arrows, ticks, dots and so on.
32 * All fields are privates and should not be used directly.
33 * Use its public methods instead.
37 #include "adg-marker.h"
38 #include "adg-marker-private.h"
50 static void get_property (GObject
*object
,
54 static void set_property (GObject
*object
,
58 static gboolean
set_size (AdgMarker
*marker
,
60 static gboolean
set_angle (AdgMarker
*marker
,
62 static gboolean
set_margin (AdgMarker
*marker
,
66 G_DEFINE_ABSTRACT_TYPE(AdgMarker
, adg_marker
, ADG_TYPE_ENTITY
);
70 adg_marker_class_init(AdgMarkerClass
*klass
)
72 GObjectClass
*gobject_class
;
75 gobject_class
= (GObjectClass
*) klass
;
77 g_type_class_add_private(klass
, sizeof(AdgMarkerPrivate
));
79 gobject_class
->set_property
= set_property
;
80 gobject_class
->get_property
= get_property
;
82 param
= g_param_spec_double("size",
84 P_("The size (in global space) of the marker"),
87 g_object_class_install_property(gobject_class
, PROP_SIZE
, param
);
89 param
= g_param_spec_double("angle",
91 P_("The tip or rotation angle of the marker"),
92 -G_MAXDOUBLE
, G_MAXDOUBLE
, 0,
94 g_object_class_install_property(gobject_class
, PROP_ANGLE
, param
);
96 param
= g_param_spec_double("margin",
98 P_("The margin around the marker, in global space: left to 0 means to use the default value (implementation dependent)"),
99 -G_MAXDOUBLE
, G_MAXDOUBLE
, 0,
101 g_object_class_install_property(gobject_class
, PROP_MARGIN
, param
);
105 adg_marker_init(AdgMarker
*marker
)
107 AdgMarkerPrivate
*data
= G_TYPE_INSTANCE_GET_PRIVATE(marker
,
119 get_property(GObject
*object
,
120 guint prop_id
, GValue
*value
, GParamSpec
*pspec
)
122 AdgMarkerPrivate
*data
= ((AdgMarker
*) object
)->data
;
126 g_value_set_double(value
, data
->size
);
129 g_value_set_double(value
, data
->angle
);
132 g_value_set_double(value
, data
->margin
);
135 G_OBJECT_WARN_INVALID_PROPERTY_ID(object
, prop_id
, pspec
);
141 set_property(GObject
*object
,
142 guint prop_id
, const GValue
*value
, GParamSpec
*pspec
)
144 AdgMarker
*marker
= (AdgMarker
*) object
;
148 set_size(marker
, g_value_get_double(value
));
151 set_angle(marker
, g_value_get_double(value
));
154 set_margin(marker
, g_value_get_double(value
));
157 G_OBJECT_WARN_INVALID_PROPERTY_ID(object
, prop_id
, pspec
);
164 * adg_marker_get_size:
165 * @marker: an #AdgMarker
167 * Gets the current size of @marker.
169 * Returns: the marker size, in global space
172 adg_marker_get_size(AdgMarker
*marker
)
174 AdgMarkerPrivate
*data
;
176 g_return_val_if_fail(ADG_IS_MARKER(marker
), 0);
184 * adg_marker_set_size:
185 * @marker: an #AdgMarker
186 * @size: the new size
188 * Sets a new size on @marker. The @size is an implementation-dependent
189 * property: it has meaning only when used by an #AdgMarker derived type.
192 adg_marker_set_size(AdgMarker
*marker
, gdouble size
)
194 g_return_if_fail(ADG_IS_MARKER(marker
));
196 if (set_size(marker
, size
))
197 g_object_notify((GObject
*) marker
, "size");
201 * adg_marker_get_angle:
202 * @marker: an #AdgMarker
204 * Gets the current angle of @marker.
206 * Returns: the marker angle, in radians
209 adg_marker_get_angle(AdgMarker
*marker
)
211 AdgMarkerPrivate
*data
;
213 g_return_val_if_fail(ADG_IS_MARKER(marker
), 0);
221 * adg_marker_set_angle:
222 * @marker: an #AdgMarker
223 * @angle: the new angle
225 * Sets a new angle on @marker. The @angle is an implementation-dependent
226 * property: it has meaning only when used by an #AdgMarker derived type.
229 adg_marker_set_angle(AdgMarker
*marker
, gdouble angle
)
231 g_return_if_fail(ADG_IS_MARKER(marker
));
233 if (set_angle(marker
, angle
))
234 g_object_notify((GObject
*) marker
, "angle");
238 * adg_marker_get_margin:
239 * @marker: an #AdgMarker
241 * Gets the current margin of @marker.
243 * Returns: the marker margin, in global space
246 adg_marker_get_margin(AdgMarker
*marker
)
248 AdgMarkerPrivate
*data
;
250 g_return_val_if_fail(ADG_IS_MARKER(marker
), 0);
258 * adg_marker_set_margin:
259 * @marker: an #AdgMarker
260 * @margin: the new margin
262 * Sets a new margin on @marker. The @margin is an implementation-dependent
263 * property: it has meaning only when used by an #AdgMarker derived type.
266 adg_marker_set_margin(AdgMarker
*marker
, gdouble margin
)
268 g_return_if_fail(ADG_IS_MARKER(marker
));
270 if (set_margin(marker
, margin
))
271 g_object_notify((GObject
*) marker
, "margin");
276 set_size(AdgMarker
*marker
, gdouble size
)
278 AdgMarkerPrivate
*data
= marker
->data
;
280 if (size
== data
->size
)
289 set_angle(AdgMarker
*marker
, gdouble angle
)
291 AdgMarkerPrivate
*data
= marker
->data
;
293 if (angle
== data
->angle
)
302 set_margin(AdgMarker
*marker
, gdouble margin
)
304 AdgMarkerPrivate
*data
= marker
->data
;
306 if (margin
== data
->margin
)
309 data
->margin
= margin
;