From 1fc6e419337cfba7a0406cdf54a75e0241ce0edd Mon Sep 17 00:00:00 2001 From: Nicola Fontana Date: Mon, 19 Dec 2016 22:26:48 +0100 Subject: [PATCH] adg: add DECIMALS property to AdgDimStyle Allow to explicitely specify the number of decimals to consider when evaluating a generic dimension value. The number-format property is not enough because you can't handle a quite common case, e.g. a specific number of decimals *without* trailing 0. --- src/adg/adg-dim-style-private.h | 1 + src/adg/adg-dim-style.c | 57 ++++++++++++++++++++++++++++++++++++++++- src/adg/adg-dim-style.h | 3 +++ src/adg/tests/test-dim-style.c | 41 +++++++++++++++++++++++++++++ 4 files changed, 101 insertions(+), 1 deletion(-) diff --git a/src/adg/adg-dim-style-private.h b/src/adg/adg-dim-style-private.h index 5bdab4b4..14824a2d 100644 --- a/src/adg/adg-dim-style-private.h +++ b/src/adg/adg-dim-style-private.h @@ -51,6 +51,7 @@ struct _AdgDimStylePrivate { CpmlPair limits_shift; gchar *number_format; gchar *number_tag; + gint decimals; }; G_END_DECLS diff --git a/src/adg/adg-dim-style.c b/src/adg/adg-dim-style.c index 1110689e..78e442b8 100644 --- a/src/adg/adg-dim-style.c +++ b/src/adg/adg-dim-style.c @@ -73,7 +73,8 @@ enum { PROP_QUOTE_SHIFT, PROP_LIMITS_SHIFT, PROP_NUMBER_FORMAT, - PROP_NUMBER_TAG + PROP_NUMBER_TAG, + PROP_DECIMALS }; @@ -225,6 +226,14 @@ adg_dim_style_class_init(AdgDimStyleClass *klass) "<>", G_PARAM_READWRITE); g_object_class_install_property(gobject_class, PROP_NUMBER_TAG, param); + + param = g_param_spec_int("decimals", + P_("decimals"), + P_("Number of significant decimals to round the value to (-1 to disable)"), + -1, G_MAXINT, + -1, + G_PARAM_READWRITE); + g_object_class_install_property(gobject_class, PROP_DECIMALS, param); } static void @@ -257,6 +266,7 @@ adg_dim_style_init(AdgDimStyle *dim_style) data->limits_shift.y = +2; data->number_format = g_strdup("%-.7g"); data->number_tag = g_strdup("<>"); + data->decimals = -1; dim_style->data = data; } @@ -325,6 +335,9 @@ _adg_get_property(GObject *object, guint prop_id, case PROP_NUMBER_TAG: g_value_set_string(value, data->number_tag); break; + case PROP_DECIMALS: + g_value_set_int(value, data->decimals); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; @@ -392,6 +405,9 @@ _adg_set_property(GObject *object, guint prop_id, g_free(data->number_tag); data->number_tag = g_value_dup_string(value); break; + case PROP_DECIMALS: + data->decimals = g_value_get_int(value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; @@ -1062,6 +1078,45 @@ adg_dim_style_get_number_tag(AdgDimStyle *dim_style) return data->number_tag; } +/** + * adg_dim_style_set_decimals: + * @dim_style: an #AdgDimStyle object + * @decimals: number of significant decimals + * + * Sets a new value in the #AdgDimStyle:decimals property. + * + * Since: 1.0 + **/ +void +adg_dim_style_set_decimals(AdgDimStyle *dim_style, gint decimals) +{ + g_return_if_fail(ADG_IS_DIM_STYLE(dim_style)); + g_object_set(dim_style, "decimals", decimals, NULL); +} + +/** + * adg_dim_style_get_decimals: + * @dim_style: an #AdgDimStyle object + * + * Gets the decimals the value of a dimension will be rounded to before the + * rendering. + * + * Returns: the number of significant decimals or -2 on errors. + * + * Since: 1.0 + **/ +gint +adg_dim_style_get_decimals(AdgDimStyle *dim_style) +{ + AdgDimStylePrivate *data; + + g_return_val_if_fail(ADG_IS_DIM_STYLE(dim_style), -2); + + data = dim_style->data; + + return data->decimals; +} + static void _adg_apply(AdgStyle *style, AdgEntity *entity, cairo_t *cr) diff --git a/src/adg/adg-dim-style.h b/src/adg/adg-dim-style.h index 06f011b7..8d121368 100644 --- a/src/adg/adg-dim-style.h +++ b/src/adg/adg-dim-style.h @@ -104,6 +104,9 @@ const gchar * adg_dim_style_get_number_format (AdgDimStyle *dim_style); void adg_dim_style_set_number_tag (AdgDimStyle *dim_style, const gchar *tag); const gchar * adg_dim_style_get_number_tag (AdgDimStyle *dim_style); +void adg_dim_style_set_decimals (AdgDimStyle *dim_style, + gint decimals); +gint adg_dim_style_get_decimals (AdgDimStyle *dim_style); G_END_DECLS diff --git a/src/adg/tests/test-dim-style.c b/src/adg/tests/test-dim-style.c index 3f96f6ff..01c6cd5d 100644 --- a/src/adg/tests/test-dim-style.c +++ b/src/adg/tests/test-dim-style.c @@ -571,6 +571,46 @@ _adg_property_number_tag(void) } static void +_adg_property_decimals(void) +{ + AdgDimStyle *dim_style; + gint decimals; + + dim_style = adg_dim_style_new(); + + /* Using the public APIs */ + adg_dim_style_set_decimals(dim_style, 2); + decimals = adg_dim_style_get_decimals(dim_style); + g_assert_cmpint(decimals, ==, 2); + + adg_dim_style_set_decimals(dim_style, -2); + decimals = adg_dim_style_get_decimals(dim_style); + g_assert_cmpint(decimals, ==, 2); + + decimals = adg_dim_style_get_decimals(NULL); + g_assert_cmpint(decimals, ==, -2); + + adg_dim_style_set_decimals(dim_style, -1); + decimals = adg_dim_style_get_decimals(dim_style); + g_assert_cmpint(decimals, ==, -1); + + /* Using GObject property methods */ + g_object_set(dim_style, "decimals", 2, NULL); + g_object_get(dim_style, "decimals", &decimals, NULL); + g_assert_cmpint(decimals, ==, 2); + + g_object_set(dim_style, "decimals", -2, NULL); + g_object_get(dim_style, "decimals", &decimals, NULL); + g_assert_cmpint(decimals, ==, 2); + + g_object_set(dim_style, "decimals", -1, NULL); + g_object_get(dim_style, "decimals", &decimals, NULL); + g_assert_cmpint(decimals, ==, -1); + + g_object_unref(dim_style); +} + +static void _adg_property_quote_shift(void) { AdgDimStyle *dim_style; @@ -719,6 +759,7 @@ main(int argc, char *argv[]) g_test_add_func("/adg/dim-style/property/min-dress", _adg_property_min_dress); g_test_add_func("/adg/dim-style/property/number-format", _adg_property_number_format); g_test_add_func("/adg/dim-style/property/number-tag", _adg_property_number_tag); + g_test_add_func("/adg/dim-style/property/decimals", _adg_property_decimals); g_test_add_func("/adg/dim-style/property/quote-shift", _adg_property_quote_shift); g_test_add_func("/adg/dim-style/property/to-offset", _adg_property_to_offset); g_test_add_func("/adg/dim-style/property/value-dress", _adg_property_value_dress); -- 2.11.4.GIT