From 0ab70ad33c4e22a176e89bb8a935aed8c7848e51 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Mon, 1 Nov 2010 17:17:42 -0400 Subject: Add GBinding transform funcs for enum types. We'll want to store enum settings by their nicknames. --- e-util/e-util.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ e-util/e-util.h | 10 ++++++++ 2 files changed, 84 insertions(+) (limited to 'e-util') diff --git a/e-util/e-util.c b/e-util/e-util.c index abc6ccc377..4c2764de4b 100644 --- a/e-util/e-util.c +++ b/e-util/e-util.c @@ -1564,6 +1564,80 @@ e_binding_transform_string_to_color (GBinding *binding, return success; } +/** + * e_binding_transform_enum_value_to_nick: + * @binding: a #GBinding + * @source_value: a #GValue whose type is derived from #G_TYPE_ENUM + * @target_value: a #GValue of type #G_TYPE_STRING + * @not_used: not used + * + * Transforms an enumeration value to its corresponding nickname. + * + * Returns: %TRUE if the enum value has a corresponding nickname + **/ +gboolean +e_binding_transform_enum_value_to_nick (GBinding *binding, + const GValue *source_value, + GValue *target_value, + gpointer not_used) +{ + GEnumClass *enum_class; + GEnumValue *enum_value; + gint value; + gboolean success = FALSE; + + g_return_val_if_fail (G_IS_BINDING (binding), FALSE); + + enum_class = g_type_class_peek (G_VALUE_TYPE (source_value)); + g_return_val_if_fail (G_IS_ENUM_CLASS (enum_class), FALSE); + + value = g_value_get_enum (source_value); + enum_value = g_enum_get_value (enum_class, value); + if (enum_value != NULL) { + g_value_set_string (target_value, enum_value->value_nick); + success = TRUE; + } + + return success; +} + +/** + * e_binding_transform_enum_nick_to_value: + * @binding: a #GBinding + * @source_value: a #GValue of type #G_TYPE_STRING + * @target_value: a #GValue whose type is derived from #G_TYPE_ENUM + * @not_used: not_used + * + * Transforms an enumeration nickname to its corresponding value. + * + * Returns: %TRUE if the enum nickname has a corresponding value + **/ +gboolean +e_binding_transform_enum_nick_to_value (GBinding *binding, + const GValue *source_value, + GValue *target_value, + gpointer not_used) +{ + GEnumClass *enum_class; + GEnumValue *enum_value; + const gchar *string; + gboolean success = FALSE; + + g_return_val_if_fail (G_IS_BINDING (binding), FALSE); + + enum_class = g_type_class_peek (G_VALUE_TYPE (target_value)); + g_return_val_if_fail (G_IS_ENUM_CLASS (enum_class), FALSE); + + string = g_value_get_string (source_value); + enum_value = g_enum_get_value_by_nick (enum_class, string); + if (enum_value != NULL) { + g_value_set_enum (target_value, enum_value->value); + success = TRUE; + } + + return success; +} + /** * e_binding_transform_source_to_uid: * @binding: a #GBinding diff --git a/e-util/e-util.h b/e-util/e-util.h index 4e982bf248..6560481f06 100644 --- a/e-util/e-util.h +++ b/e-util/e-util.h @@ -156,6 +156,16 @@ gboolean e_binding_transform_string_to_color const GValue *source_value, GValue *target_value, gpointer not_used); +gboolean e_binding_transform_enum_value_to_nick + (GBinding *binding, + const GValue *source_value, + GValue *target_value, + gpointer not_used); +gboolean e_binding_transform_enum_nick_to_value + (GBinding *binding, + const GValue *source_value, + GValue *target_value, + gpointer not_used); gboolean e_binding_transform_source_to_uid (GBinding *binding, const GValue *source_value, -- cgit v1.2.3