GtkStyleSet: Allow custom parsers on registered properties.

This commit is contained in:
Carlos Garnacho 2010-08-04 17:49:15 +02:00
parent 99224c9eec
commit 355f0d69ab
3 changed files with 44 additions and 20 deletions

View File

@ -1398,7 +1398,9 @@ parse_rule (GtkCssProvider *css_provider,
while (scanner->token == G_TOKEN_IDENTIFIER)
{
const gchar *value_str = NULL;
GtkStylePropertyParser parse_func = NULL;
GType prop_type;
GError *error = NULL;
gchar *prop;
prop = g_strdup (scanner->value.v_identifier);
@ -1432,7 +1434,7 @@ parse_rule (GtkCssProvider *css_provider,
g_hash_table_insert (priv->cur_properties, prop, val);
}
else if (gtk_style_set_lookup_property (prop, &prop_type))
else if (gtk_style_set_lookup_property (prop, &prop_type, &parse_func))
{
GValue *val;
@ -1444,10 +1446,17 @@ parse_rule (GtkCssProvider *css_provider,
g_value_set_string (val, value_str);
g_hash_table_insert (priv->cur_properties, prop, val);
}
else if (css_provider_parse_value (value_str, val))
else if ((parse_func && (parse_func) (value_str, val, &error)) ||
(!parse_func && css_provider_parse_value (value_str, val)))
g_hash_table_insert (priv->cur_properties, prop, val);
else
{
if (error)
{
g_warning ("Error parsing property value: %s\n", error->message);
g_error_free (error);
}
g_value_unset (val);
g_slice_free (GValue, val);
g_free (prop);

View File

@ -39,6 +39,7 @@ struct PropertyNode
GQuark property_quark;
GType property_type;
GValue default_value;
GtkStylePropertyParser parse_func;
};
struct PropertyData
@ -72,19 +73,19 @@ gtk_style_set_class_init (GtkStyleSetClass *klass)
object_class->finalize = gtk_style_set_finalize;
/* Initialize default property set */
gtk_style_set_register_property ("foreground-color", GDK_TYPE_COLOR, NULL);
gtk_style_set_register_property ("background-color", GDK_TYPE_COLOR, NULL);
gtk_style_set_register_property ("text-color", GDK_TYPE_COLOR, NULL);
gtk_style_set_register_property ("base-color", GDK_TYPE_COLOR, NULL);
gtk_style_set_register_property ("foreground-color", GDK_TYPE_COLOR, NULL, NULL);
gtk_style_set_register_property ("background-color", GDK_TYPE_COLOR, NULL, NULL);
gtk_style_set_register_property ("text-color", GDK_TYPE_COLOR, NULL, NULL);
gtk_style_set_register_property ("base-color", GDK_TYPE_COLOR, NULL, NULL);
gtk_style_set_register_property ("font", PANGO_TYPE_FONT_DESCRIPTION, NULL);
gtk_style_set_register_property ("font", PANGO_TYPE_FONT_DESCRIPTION, NULL, NULL);
gtk_style_set_register_property ("padding", GTK_TYPE_BORDER, NULL);
gtk_style_set_register_property ("border", G_TYPE_INT, NULL);
gtk_style_set_register_property ("padding", GTK_TYPE_BORDER, NULL, NULL);
gtk_style_set_register_property ("border", G_TYPE_INT, NULL, NULL);
g_value_init (&val, GTK_TYPE_THEMING_ENGINE);
g_value_set_object (&val, (GObject *) gtk_theming_engine_load (NULL));
gtk_style_set_register_property ("engine", GTK_TYPE_THEMING_ENGINE, &val);
gtk_style_set_register_property ("engine", GTK_TYPE_THEMING_ENGINE, &val, NULL);
g_value_unset (&val);
g_type_class_add_private (object_class, sizeof (GtkStyleSetPrivate));
@ -186,9 +187,10 @@ property_node_lookup (GQuark quark)
/* Property registration functions */
void
gtk_style_set_register_property (const gchar *property_name,
GType type,
const GValue *default_value)
gtk_style_set_register_property (const gchar *property_name,
GType type,
const GValue *default_value,
GtkStylePropertyParser parse_func)
{
PropertyNode *node, new = { 0 };
GQuark quark;
@ -220,6 +222,9 @@ gtk_style_set_register_property (const gchar *property_name,
g_value_copy (default_value, &new.default_value);
}
if (parse_func)
new.parse_func = parse_func;
for (i = 0; i < properties->len; i++)
{
node = &g_array_index (properties, PropertyNode, i);
@ -232,8 +237,9 @@ gtk_style_set_register_property (const gchar *property_name,
}
gboolean
gtk_style_set_lookup_property (const gchar *property_name,
GType *type)
gtk_style_set_lookup_property (const gchar *property_name,
GType *type,
GtkStylePropertyParser *parse_func)
{
PropertyNode *node;
GtkStyleSetClass *klass;
@ -261,6 +267,9 @@ gtk_style_set_lookup_property (const gchar *property_name,
if (type)
*type = node->property_type;
if (parse_func)
*parse_func = node->parse_func;
found = TRUE;
break;
}

View File

@ -48,14 +48,20 @@ struct GtkStyleSetClass
GObjectClass parent_class;
};
typedef gboolean (* GtkStylePropertyParser) (const gchar *string,
GValue *value,
GError **error);
GType gtk_style_set_get_type (void) G_GNUC_CONST;
/* Functions to register style properties */
void gtk_style_set_register_property (const gchar *property_name,
GType type,
const GValue *default_value);
gboolean gtk_style_set_lookup_property (const gchar *property_name,
GType *type);
void gtk_style_set_register_property (const gchar *property_name,
GType type,
const GValue *default_value,
GtkStylePropertyParser parse_func);
gboolean gtk_style_set_lookup_property (const gchar *property_name,
GType *type,
GtkStylePropertyParser *parse_func);
GtkStyleSet * gtk_style_set_new (void);