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: Root abstract class for all dimension entities
25 * The #AdgDim class is the base stub of all the dimension entities.
31 * All fields are private and should not be used directly.
32 * Use its public methods instead.
37 #include "adg-dim-private.h"
38 #include "adg-dim-style.h"
39 #include "adg-toy-text.h"
40 #include "adg-type-builtins.h"
43 #define PARENT_OBJECT_CLASS ((GObjectClass *) adg_dim_parent_class)
62 static void dispose (GObject
*object
);
63 static void finalize (GObject
*object
);
64 static void get_property (GObject
*object
,
68 static void set_property (GObject
*object
,
72 static gboolean
invalidate (AdgEntity
*entity
);
73 static gchar
* default_value (AdgDim
*dim
);
74 static void quote_layout (AdgDim
*dim
,
76 static gboolean
set_angle (AdgDim
*dim
,
78 static gboolean
set_value (AdgDim
*dim
,
80 static gboolean
set_value_min (AdgDim
*dim
,
81 const gchar
*value_min
);
82 static gboolean
set_value_max (AdgDim
*dim
,
83 const gchar
*value_max
);
84 static gboolean
set_note (AdgDim
*dim
,
86 static void detach_entity (AdgEntity
**p_entity
);
89 G_DEFINE_ABSTRACT_TYPE(AdgDim
, adg_dim
, ADG_TYPE_ENTITY
);
93 adg_dim_class_init(AdgDimClass
*klass
)
95 GObjectClass
*gobject_class
;
96 AdgEntityClass
*entity_class
;
99 gobject_class
= (GObjectClass
*) klass
;
100 entity_class
= (AdgEntityClass
*) klass
;
102 g_type_class_add_private(klass
, sizeof(AdgDimPrivate
));
104 gobject_class
->dispose
= dispose
;
105 gobject_class
->finalize
= finalize
;
106 gobject_class
->get_property
= get_property
;
107 gobject_class
->set_property
= set_property
;
109 entity_class
->invalidate
= invalidate
;
111 klass
->default_value
= default_value
;
112 klass
->quote_layout
= quote_layout
;
114 param
= g_param_spec_boxed("ref1",
116 P_("First reference point of the dimension"),
118 G_PARAM_READWRITE
| G_PARAM_CONSTRUCT
);
119 g_object_class_install_property(gobject_class
, PROP_REF1
, param
);
121 param
= g_param_spec_boxed("ref2",
123 P_("Second reference point of the dimension"),
125 G_PARAM_READWRITE
| G_PARAM_CONSTRUCT
);
126 g_object_class_install_property(gobject_class
, PROP_REF2
, param
);
128 param
= g_param_spec_boxed("pos1",
130 P_("First position point: it will be computed with the level property to get the real dimension position"),
131 ADG_TYPE_PAIR
, G_PARAM_READWRITE
);
132 g_object_class_install_property(gobject_class
, PROP_POS1
, param
);
134 param
= g_param_spec_boxed("pos2",
136 P_("Second position point: it will be computed with the level property to get the real dimension position"),
137 ADG_TYPE_PAIR
, G_PARAM_READWRITE
);
138 g_object_class_install_property(gobject_class
, PROP_POS2
, param
);
140 param
= g_param_spec_double("angle",
142 P_("The dimension direction, if relevant"),
143 -G_MAXDOUBLE
, G_MAXDOUBLE
, 0,
145 g_object_class_install_property(gobject_class
, PROP_ANGLE
, param
);
147 param
= g_param_spec_double("level",
149 P_("The dimension level, that is the factor to multiply dim_style->baseline_spacing to get the offset (in device units) from pos1..pos2 where render the dimension baseline"),
150 -G_MAXDOUBLE
, G_MAXDOUBLE
, 1.0,
152 g_object_class_install_property(gobject_class
, PROP_LEVEL
, param
);
154 param
= g_param_spec_enum("outside",
156 P_("Whether the arrows must be inside the extension lines (ADG_THREE_STATE_OFF), must be extended outside the extension lines (ADG_THREE_STATE_ON) or should be automatically handled depending on the available space"),
157 ADG_TYPE_THREE_STATE
, ADG_THREE_STATE_UNKNOWN
,
159 g_object_class_install_property(gobject_class
, PROP_OUTSIDE
, param
);
161 param
= g_param_spec_string("value",
163 P_("The theoretically exact value for this quote: set to NULL to automatically get the default value"),
164 NULL
, G_PARAM_READWRITE
);
165 g_object_class_install_property(gobject_class
, PROP_VALUE
, param
);
167 param
= g_param_spec_string("value-min",
168 P_("Minimum Value or Low Tolerance"),
169 P_("The minimum value allowed or the lowest tolerance from value (depending of the dimension style): set to NULL to suppress"),
170 NULL
, G_PARAM_READWRITE
);
171 g_object_class_install_property(gobject_class
, PROP_VALUE_MIN
, param
);
173 param
= g_param_spec_string("value-max",
174 P_("Maximum Value or High Tolerance"),
175 P_("The maximum value allowed or the highest tolerance from value (depending of the dimension style): set to NULL to suppress"),
176 NULL
, G_PARAM_READWRITE
);
177 g_object_class_install_property(gobject_class
, PROP_VALUE_MAX
, param
);
179 param
= g_param_spec_string("note",
181 P_("A custom note appended to the end of the quote"),
182 NULL
, G_PARAM_READWRITE
);
183 g_object_class_install_property(gobject_class
, PROP_NOTE
, param
);
187 adg_dim_init(AdgDim
*dim
)
189 AdgDimPrivate
*data
= G_TYPE_INSTANCE_GET_PRIVATE(dim
, ADG_TYPE_DIM
,
192 data
->ref1
.x
= data
->ref1
.y
= 0;
193 data
->ref2
.x
= data
->ref2
.y
= 0;
194 data
->pos1
.x
= data
->pos1
.y
= 0;
195 data
->pos2
.x
= data
->pos2
.y
= 0;
199 data
->value_min
= NULL
;
200 data
->value_max
= NULL
;
203 data
->value_entity
= g_object_new(ADG_TYPE_TOY_TEXT
,
205 "font-style", ADG_FONT_STYLE_VALUE
,
207 data
->value_min_entity
= g_object_new(ADG_TYPE_TOY_TEXT
,
209 "font-style", ADG_FONT_STYLE_TOLERANCE
,
211 data
->value_max_entity
= g_object_new(ADG_TYPE_TOY_TEXT
,
213 "font-style", ADG_FONT_STYLE_TOLERANCE
,
215 data
->note_entity
= g_object_new(ADG_TYPE_TOY_TEXT
,
217 "font-style", ADG_FONT_STYLE_NOTE
,
224 dispose(GObject
*object
)
226 AdgDimPrivate
*data
= ((AdgDim
*) object
)->data
;
228 detach_entity(&data
->value_entity
);
229 detach_entity(&data
->value_min_entity
);
230 detach_entity(&data
->value_max_entity
);
231 detach_entity(&data
->note_entity
);
233 if (PARENT_OBJECT_CLASS
->dispose
!= NULL
)
234 PARENT_OBJECT_CLASS
->dispose(object
);
238 finalize(GObject
*object
)
240 AdgDimPrivate
*data
= ((AdgDim
*) object
)->data
;
243 g_free(data
->value_min
);
244 g_free(data
->value_max
);
247 if (PARENT_OBJECT_CLASS
->finalize
!= NULL
)
248 PARENT_OBJECT_CLASS
->finalize(object
);
252 get_property(GObject
*object
, guint prop_id
, GValue
*value
, GParamSpec
*pspec
)
254 AdgDimPrivate
*data
= ((AdgDim
*) object
)->data
;
258 g_value_set_boxed(value
, &data
->ref1
);
261 g_value_set_boxed(value
, &data
->ref2
);
264 g_value_set_boxed(value
, &data
->pos1
);
267 g_value_set_boxed(value
, &data
->pos1
);
270 g_value_set_double(value
, data
->angle
);
273 g_value_set_double(value
, data
->level
);
276 g_value_set_enum(value
, data
->outside
);
279 g_value_set_string(value
, data
->value
);
282 g_value_set_string(value
, data
->value_min
);
285 g_value_set_string(value
, data
->value_max
);
288 g_value_set_string(value
, data
->note
);
291 G_OBJECT_WARN_INVALID_PROPERTY_ID(object
, prop_id
, pspec
);
297 set_property(GObject
*object
, guint prop_id
,
298 const GValue
*value
, GParamSpec
*pspec
)
303 dim
= (AdgDim
*) object
;
308 cpml_pair_copy(&data
->ref1
, (AdgPair
*) g_value_get_boxed(value
));
311 cpml_pair_copy(&data
->ref2
, (AdgPair
*) g_value_get_boxed(value
));
314 cpml_pair_copy(&data
->pos1
, (AdgPair
*) g_value_get_boxed(value
));
317 cpml_pair_copy(&data
->pos2
, (AdgPair
*) g_value_get_boxed(value
));
320 set_angle(dim
, g_value_get_double(value
));
323 data
->level
= g_value_get_double(value
);
326 data
->outside
= g_value_get_enum(value
);
329 set_value(dim
, g_value_get_string(value
));
332 set_value_min(dim
, g_value_get_string(value
));
335 set_value_max(dim
, g_value_get_string(value
));
338 set_note(dim
, g_value_get_string(value
));
341 G_OBJECT_WARN_INVALID_PROPERTY_ID(object
, prop_id
, pspec
);
351 * Gets the origin (org) coordinates. The returned pair is internally
352 * owned and must not be freed or modified. This function is only
353 * useful in new dimension implementations.
355 * Returns: the org coordinates
358 adg_dim_get_org(AdgDim
*dim
)
362 g_return_val_if_fail(ADG_IS_DIM(dim
), NULL
);
372 * @org: the org coordinates
375 * This function is only useful in new dimension implementations.
378 * Sets new org coordinates.
381 adg_dim_set_org(AdgDim
*dim
, const AdgPair
*org
)
385 g_return_if_fail(ADG_IS_DIM(dim
));
386 g_return_if_fail(org
!= NULL
);
393 * adg_dim_set_org_explicit:
395 * @org_x: x component of org
396 * @org_y: y component of org
399 * This function is only useful in new dimension implementations.
402 * Explicitely sets new org coordinates.
405 adg_dim_set_org_explicit(AdgDim
*dim
, gdouble org_x
, gdouble org_y
)
409 g_return_if_fail(ADG_IS_DIM(dim
));
420 * Gets the ref1 coordinates. The returned pair is internally owned
421 * and must not be freed or modified.
423 * Returns: the ref1 coordinates
426 adg_dim_get_ref1(AdgDim
*dim
)
430 g_return_val_if_fail(ADG_IS_DIM(dim
), NULL
);
441 * Gets the ref2 coordinates. The returned pair is internally owned
442 * and must not be freed or modified.
444 * Returns: the ref2 coordinates
447 adg_dim_get_ref2(AdgDim
*dim
)
451 g_return_val_if_fail(ADG_IS_DIM(dim
), NULL
);
461 * @ref1: the ref1 coordinates
462 * @ref2: the ref2 coordinates
464 * Shortcut to set ref1 and ref2 points at once.
467 adg_dim_set_ref(AdgDim
*dim
, const AdgPair
*ref1
, const AdgPair
*ref2
)
469 g_return_if_fail(ADG_IS_DIM(dim
));
471 if (ref1
!= NULL
|| ref2
!= NULL
) {
476 object
= (GObject
*) dim
;
478 g_object_freeze_notify(object
);
482 g_object_notify(object
, "ref1");
487 g_object_notify(object
, "ref2");
490 g_object_thaw_notify(object
);
495 * adg_dim_set_ref_explicit:
497 * @ref1_x: x component of pos1
498 * @ref1_y: y component of pos1
499 * @ref2_x: x component of pos2
500 * @ref2_y: y component of pos2
502 * Shortcut to set ref1 and ref2 points at once,
503 * using explicit coordinates.
506 adg_dim_set_ref_explicit(AdgDim
*dim
, gdouble ref1_x
, gdouble ref1_y
,
507 gdouble ref2_x
, gdouble ref2_y
)
517 adg_dim_set_ref(dim
, &ref1
, &ref2
);
524 * Gets the pos1 coordinates. The returned pair is internally owned
525 * and must not be freed or modified.
527 * Returns: the pos1 coordinates
530 adg_dim_get_pos1(AdgDim
*dim
)
534 g_return_val_if_fail(ADG_IS_DIM(dim
), NULL
);
545 * Gets the pos2 coordinates. The returned pair is internally owned
546 * and must not be freed or modified.
548 * Returns: the pos2 coordinates
551 adg_dim_get_pos2(AdgDim
*dim
)
555 g_return_val_if_fail(ADG_IS_DIM(dim
), NULL
);
565 * @pos1: the pos1 coordinates
566 * @pos2: the pos2 coordinates
568 * Shortcut to set pos1 and pos2 points at once.
571 adg_dim_set_pos(AdgDim
*dim
, AdgPair
*pos1
, AdgPair
*pos2
)
573 g_return_if_fail(ADG_IS_DIM(dim
));
575 if (pos1
!= NULL
|| pos2
!= NULL
) {
580 object
= (GObject
*) dim
;
582 g_object_freeze_notify(object
);
586 g_object_notify(object
, "pos1");
590 g_object_notify(object
, "pos2");
593 g_object_thaw_notify(object
);
598 * adg_dim_set_pos_explicit:
600 * @pos1_x: x component of pos1
601 * @pos1_y: y component of pos1
602 * @pos2_x: x component of pos2
603 * @pos2_y: y component of pos2
605 * Shortcut to set pos1 and pos2 points at once,
606 * using explicit coordinates.
609 adg_dim_set_pos_explicit(AdgDim
*dim
, gdouble pos1_x
, gdouble pos1_y
,
610 gdouble pos2_x
, gdouble pos2_y
)
620 adg_dim_set_pos(dim
, &pos1
, &pos2
);
628 * This function is only useful in new dimension implementations.
631 * Gets the dimension angle.
633 * Returns: the angle (in radians)
636 adg_dim_get_angle(AdgDim
*dim
)
640 g_return_val_if_fail(ADG_IS_DIM(dim
), 0);
650 * @angle: the new angle (in radians)
653 * This function is only useful in new dimension implementations.
656 * Sets a new dimension angle. The @angle could be modified by this
657 * function to fit in the current dimension style mode, so do not
658 * expect to get the same value with adg_dim_get_angle().
661 adg_dim_set_angle(AdgDim
*dim
, gdouble angle
)
663 g_return_if_fail(ADG_IS_DIM(dim
));
665 if (set_angle(dim
, angle
))
666 g_object_notify((GObject
*) dim
, "angle");
673 * Gets the level of this dimension.
675 * Returns: the level value
678 adg_dim_get_level(AdgDim
*dim
)
682 g_return_val_if_fail(ADG_IS_DIM(dim
), 0);
692 * @level: the new level
694 * Sets a new level for this dimension. The level is used to
695 * stack the quotes using a spacing value from dim_style
696 * (specified in global space).
699 adg_dim_set_level(AdgDim
*dim
, gdouble level
)
703 g_return_if_fail(ADG_IS_DIM(dim
));
708 g_object_notify((GObject
*) dim
, "level");
712 * adg_dim_get_outside:
715 * Gets the state of the #AdgDim:outside property: check the property
716 * documentation for further details.
718 * Returns: the current flag state
721 adg_dim_get_outside(AdgDim
*dim
)
725 g_return_val_if_fail(ADG_IS_DIM(dim
), ADG_THREE_STATE_UNKNOWN
);
729 return data
->outside
;
733 * adg_dim_set_outside:
735 * @outside: the new outside state
737 * Sets a new state for the #AdgDim:outside flag: check the property
738 * documentation for further details.
741 adg_dim_set_outside(AdgDim
*dim
, AdgThreeState outside
)
745 g_return_if_fail(ADG_IS_DIM(dim
));
748 data
->outside
= outside
;
750 g_object_notify((GObject
*) dim
, "outside");
757 * Gets the value text. The string is internally owned and
758 * must not be freed or modified.
760 * Returns: the value text
763 adg_dim_get_value(AdgDim
*dim
)
767 g_return_val_if_fail(ADG_IS_DIM(dim
), NULL
);
777 * @value: the value text
779 * Explicitely sets the text to use as value. If @value is %NULL or
780 * was never set, an automatic text is calculated using the format
781 * specified in the current #AdgDimStyle and getting its value by
782 * calling the default_value() virtual method.
785 adg_dim_set_value(AdgDim
*dim
, const gchar
*value
)
787 g_return_if_fail(ADG_IS_DIM(dim
));
789 if (set_value(dim
, value
))
790 g_object_notify((GObject
*) dim
, "value");
794 * adg_dim_get_value_min:
797 * Gets the minimum value text or %NULL on minimum value disabled.
798 * The string is internally owned and must not be freed or modified.
800 * Returns: the mimimum value text
803 adg_dim_get_value_min(AdgDim
*dim
)
807 g_return_val_if_fail(ADG_IS_DIM(dim
), NULL
);
811 return data
->value_min
;
815 * adg_dim_set_value_min:
817 * @value_min: the new minimum value
819 * Sets the minimum value. Use %NULL as @value_min to disable it.
822 adg_dim_set_value_min(AdgDim
*dim
, const gchar
*value_min
)
824 g_return_if_fail(ADG_IS_DIM(dim
));
826 if (set_value_min(dim
, value_min
))
827 g_object_notify((GObject
*) dim
, "value-min");
831 * adg_dim_get_value_max:
834 * Gets the maximum value text or %NULL on maximum value disabled.
835 * The string is internally owned and must not be freed or modified.
837 * Returns: the maximum value text
840 adg_dim_get_value_max(AdgDim
*dim
)
844 g_return_val_if_fail(ADG_IS_DIM(dim
), NULL
);
848 return data
->value_max
;
852 * adg_dim_set_value_max:
854 * @value_max: the new maximum value
856 * Sets the maximum value. Use %NULL as @value_max to disable it.
859 adg_dim_set_value_max(AdgDim
*dim
, const gchar
*value_max
)
861 g_return_if_fail(ADG_IS_DIM(dim
));
863 if (set_value_max(dim
, value_max
))
864 g_object_notify((GObject
*) dim
, "value-max");
868 * adg_dim_set_tolerances:
870 * @value_min: the new minumum value
871 * @value_max: the new maximum value
873 * Shortcut to set both the tolerances at once.
876 adg_dim_set_tolerances(AdgDim
*dim
,
877 const gchar
*value_min
, const gchar
*value_max
)
879 g_return_if_fail(ADG_IS_DIM(dim
));
881 g_object_freeze_notify((GObject
*) dim
);
882 adg_dim_set_value_min(dim
, value_min
);
883 adg_dim_set_value_max(dim
, value_max
);
884 g_object_thaw_notify((GObject
*) dim
);
891 * Gets the note text or %NULL if the note is not used. The string is
892 * internally owned and must not be freed or modified.
894 * Returns: the note text
897 adg_dim_get_note(AdgDim
*dim
)
901 g_return_val_if_fail(ADG_IS_DIM(dim
), NULL
);
911 * @note: the new note
913 * Sets a new note text, usually appended at the end of the dimension text.
916 adg_dim_set_note(AdgDim
*dim
, const gchar
*note
)
918 g_return_if_fail(ADG_IS_DIM(dim
));
920 if (set_note(dim
, note
))
921 g_object_notify((GObject
*) dim
, "note");
925 * adg_dim_render_quote:
926 * @dim: an #AdgDim object
927 * @cr: a #cairo_t drawing context
930 * This function is only useful in new dimension implementations.
933 * Renders the quote of @dim at the @org position.
936 adg_dim_render_quote(AdgDim
*dim
, cairo_t
*cr
)
940 g_return_if_fail(ADG_IS_DIM(dim
));
944 /* Check if the basic value text needs to be automatically generated */
945 if (data
->value
== NULL
) {
946 gchar
*text
= ADG_DIM_GET_CLASS(dim
)->default_value(dim
);
947 adg_toy_text_set_label((AdgToyText
*) data
->value_entity
, text
);
951 ADG_DIM_GET_CLASS(dim
)->quote_layout(dim
, cr
);
953 adg_entity_render(data
->value_entity
, cr
);
954 adg_entity_render(data
->value_min_entity
, cr
);
955 adg_entity_render(data
->value_max_entity
, cr
);
956 adg_entity_render(data
->note_entity
, cr
);
960 invalidate(AdgEntity
*entity
)
962 AdgDimPrivate
*data
= ((AdgDim
*) entity
)->data
;
964 adg_entity_invalidate(data
->value_entity
);
965 adg_entity_invalidate(data
->value_min_entity
);
966 adg_entity_invalidate(data
->value_max_entity
);
967 adg_entity_invalidate(data
->note_entity
);
973 default_value(AdgDim
*dim
)
975 g_warning("AdgDim::default_value not implemented for `%s'",
976 g_type_name(G_TYPE_FROM_INSTANCE(dim
)));
977 return g_strdup("undef");
981 quote_layout(AdgDim
*dim
, cairo_t
*cr
)
984 AdgDimStyle
*dim_style
;
985 cairo_text_extents_t extents
;
987 const AdgPair
*shift
;
990 dim_style
= (AdgDimStyle
*) adg_entity_get_style((AdgEntity
*) dim
,
993 /* Initialize local maps to the origin */
994 cairo_matrix_init_translate(&map
, data
->org
.x
, data
->org
.y
);
996 adg_entity_set_local_map(data
->value_entity
, &map
);
997 adg_entity_set_local_map(data
->value_min_entity
, &map
);
998 adg_entity_set_local_map(data
->value_max_entity
, &map
);
999 adg_entity_set_local_map(data
->note_entity
, &map
);
1001 /* Initialize global maps to the quote rotation angle */
1002 cairo_matrix_init_rotate(&map
, data
->angle
);
1004 adg_entity_set_global_map(data
->value_entity
, &map
);
1005 adg_entity_set_global_map(data
->value_min_entity
, &map
);
1006 adg_entity_set_global_map(data
->value_max_entity
, &map
);
1007 adg_entity_set_global_map(data
->note_entity
, &map
);
1010 adg_toy_text_get_extents((AdgToyText
*) data
->value_entity
, cr
, &extents
);
1012 /* Limit values (value_min and value_max) */
1013 if (data
->value_min
!= NULL
|| data
->value_max
!= NULL
) {
1014 cairo_text_extents_t min_extents
= { 0 };
1015 cairo_text_extents_t max_extents
= { 0 };
1016 gdouble spacing
= 0;
1019 if (data
->value_min
!= NULL
)
1020 adg_toy_text_get_extents((AdgToyText
*) data
->value_min_entity
,
1023 /* High tolerance */
1024 if (data
->value_max
!= NULL
)
1025 adg_toy_text_get_extents((AdgToyText
*) data
->value_max_entity
,
1028 shift
= adg_dim_style_get_tolerance_shift(dim_style
);
1029 if (data
->value_min
!= NULL
&& data
->value_max
!= NULL
)
1030 spacing
= adg_dim_style_get_tolerance_spacing(dim_style
);
1032 cairo_matrix_init_translate(&map
, extents
.width
+ shift
->x
,
1033 (spacing
+ min_extents
.height
+
1034 max_extents
.height
) / 2 +
1035 shift
->y
- extents
.height
/ 2);
1036 adg_entity_transform_global_map(data
->value_min_entity
, &map
);
1037 cairo_matrix_translate(&map
, 0, -min_extents
.height
- spacing
);
1038 adg_entity_transform_global_map(data
->value_max_entity
, &map
);
1040 extents
.width
+= shift
->x
+ MAX(min_extents
.width
, max_extents
.width
);
1044 if (data
->note
!= NULL
) {
1045 cairo_text_extents_t note_extents
;
1047 adg_toy_text_get_extents((AdgToyText
*) data
->note_entity
,
1049 shift
= adg_dim_style_get_note_shift(dim_style
);
1051 cairo_matrix_init_translate(&map
, extents
.width
+ shift
->x
, shift
->y
);
1052 adg_entity_transform_global_map(data
->note_entity
, &map
);
1054 extents
.width
+= shift
->x
+ note_extents
.width
;
1057 /* Center and apply the style displacements */
1058 shift
= adg_dim_style_get_quote_shift(dim_style
);
1059 cairo_matrix_init_translate(&map
, shift
->x
- extents
.width
/ 2, shift
->y
);
1061 adg_entity_transform_global_map(data
->value_entity
, &map
);
1062 adg_entity_transform_global_map(data
->value_min_entity
, &map
);
1063 adg_entity_transform_global_map(data
->value_max_entity
, &map
);
1064 adg_entity_transform_global_map(data
->note_entity
, &map
);
1068 set_angle(AdgDim
*dim
, gdouble angle
)
1070 AdgDimPrivate
*data
= dim
->data
;
1072 angle
= cpml_angle(angle
);
1073 if (angle
> G_PI_4
|| angle
<= -G_PI_4
* 3)
1074 angle
= cpml_angle(angle
+ G_PI
);
1076 if (angle
== data
->angle
)
1079 data
->angle
= angle
;
1085 set_value(AdgDim
*dim
, const gchar
*value
)
1087 AdgDimPrivate
*data
;
1091 if (adg_strcmp(value
, data
->value
) == 0)
1094 g_free(data
->value
);
1095 data
->value
= g_strdup(value
);
1096 adg_toy_text_set_label((AdgToyText
*) data
->value_entity
, value
);
1102 set_value_min(AdgDim
*dim
, const gchar
*value_min
)
1104 AdgDimPrivate
*data
= dim
->data
;
1106 if (adg_strcmp(value_min
, data
->value_min
) == 0)
1109 g_free(data
->value_min
);
1110 data
->value_min
= g_strdup(value_min
);
1111 adg_toy_text_set_label((AdgToyText
*) data
->value_min_entity
, value_min
);
1117 set_value_max(AdgDim
*dim
, const gchar
*value_max
)
1119 AdgDimPrivate
*data
= dim
->data
;
1121 if (adg_strcmp(value_max
, data
->value_max
) == 0)
1124 g_free(data
->value_max
);
1125 data
->value_max
= g_strdup(value_max
);
1126 adg_toy_text_set_label((AdgToyText
*) data
->value_max_entity
, value_max
);
1132 set_note(AdgDim
*dim
, const gchar
*note
)
1134 AdgDimPrivate
*data
= dim
->data
;
1136 if (adg_strcmp(note
, data
->note
) == 0)
1140 data
->note
= g_strdup(note
);
1141 adg_toy_text_set_label((AdgToyText
*) data
->note_entity
, note
);
1147 detach_entity(AdgEntity
**p_entity
)
1149 if (*p_entity
!= NULL
) {
1150 adg_entity_set_parent(*p_entity
, NULL
);
1151 g_object_unref(*p_entity
);