[gtk+/wip/pbor/css-text-attributes: 4/7] css: add support for text-decoration-line



commit e654dc30d6377a0673c8171e954c996c138dc509
Author: Paolo Borelli <pborelli gnome org>
Date:   Sun Jul 5 18:59:27 2015 +0200

    css: add support for text-decoration-line

 gtk/gtkcssenumvalue.c         |   46 +++++++++++++++++++++++++++++++++++++++++
 gtk/gtkcssenumvalueprivate.h  |    4 +++
 gtk/gtkcssstylepropertyimpl.c |   22 +++++++++++++++++++
 gtk/gtkcsstypesprivate.h      |    7 ++++++
 gtk/gtkstylecontext.c         |   38 +++++++++++++++++++++++++++------
 5 files changed, 110 insertions(+), 7 deletions(-)
---
diff --git a/gtk/gtkcssenumvalue.c b/gtk/gtkcssenumvalue.c
index add4af3..15d9b4a 100644
--- a/gtk/gtkcssenumvalue.c
+++ b/gtk/gtkcssenumvalue.c
@@ -553,6 +553,52 @@ _gtk_css_font_stretch_value_get (const GtkCssValue *value)
   return value->value;
 }
 
+/* GtkTextDecorationLine */
+
+static const GtkCssValueClass GTK_CSS_VALUE_TEXT_DECORATION_LINE = {
+  gtk_css_value_enum_free,
+  gtk_css_value_enum_compute,
+  gtk_css_value_enum_equal,
+  gtk_css_value_enum_transition,
+  gtk_css_value_enum_print
+};
+
+static GtkCssValue text_decoration_line_values[] = {
+  { &GTK_CSS_VALUE_TEXT_DECORATION_LINE, 1, GTK_CSS_TEXT_DECORATION_LINE_NONE, "none" },
+  { &GTK_CSS_VALUE_TEXT_DECORATION_LINE, 1, GTK_CSS_TEXT_DECORATION_LINE_UNDERLINE, "underline" },
+  { &GTK_CSS_VALUE_TEXT_DECORATION_LINE, 1, GTK_CSS_TEXT_DECORATION_LINE_LINE_THROUGH, "line-through" },
+};
+
+GtkCssValue *
+_gtk_css_text_decoration_line_value_new (GtkTextDecorationLine line)
+{
+  g_return_val_if_fail (line < G_N_ELEMENTS (text_decoration_line_values), NULL);
+
+  return _gtk_css_value_ref (&text_decoration_line_values[line]);
+}
+
+GtkCssValue *_gtk_css_text_decoration_line_value_try_parse (GtkCssParser *parser)
+{
+  guint i;
+
+  g_return_val_if_fail (parser != NULL, NULL);
+
+  for (i = 0; i < G_N_ELEMENTS (text_decoration_line_values); i++)
+    {
+      if (_gtk_css_parser_try (parser, text_decoration_line_values[i].name, TRUE))
+        return _gtk_css_value_ref (&text_decoration_line_values[i]);
+    }
+
+  return NULL;
+}
+
+GtkTextDecorationLine _gtk_css_text_decoration_line_value_get (const GtkCssValue *value)
+{
+  g_return_val_if_fail (value->class == &GTK_CSS_VALUE_TEXT_DECORATION_LINE, 
GTK_CSS_TEXT_DECORATION_LINE_NONE);
+
+  return value->value;
+}
+
 /* GtkCssArea */
 
 static const GtkCssValueClass GTK_CSS_VALUE_AREA = {
diff --git a/gtk/gtkcssenumvalueprivate.h b/gtk/gtkcssenumvalueprivate.h
index ad09adb..008b548 100644
--- a/gtk/gtkcssenumvalueprivate.h
+++ b/gtk/gtkcssenumvalueprivate.h
@@ -52,6 +52,10 @@ GtkCssValue *   _gtk_css_font_stretch_value_new       (PangoStretch       stretc
 GtkCssValue *   _gtk_css_font_stretch_value_try_parse (GtkCssParser      *parser);
 PangoStretch    _gtk_css_font_stretch_value_get       (const GtkCssValue *value);
 
+GtkCssValue *         _gtk_css_text_decoration_line_value_new       (GtkTextDecorationLine  line);
+GtkCssValue *         _gtk_css_text_decoration_line_value_try_parse (GtkCssParser          *parser);
+GtkTextDecorationLine _gtk_css_text_decoration_line_value_get       (const GtkCssValue     *value);
+
 GtkCssValue *   _gtk_css_area_value_new               (GtkCssArea         area);
 GtkCssValue *   _gtk_css_area_value_try_parse         (GtkCssParser      *parser);
 GtkCssArea      _gtk_css_area_value_get               (const GtkCssValue *value);
diff --git a/gtk/gtkcssstylepropertyimpl.c b/gtk/gtkcssstylepropertyimpl.c
index 511165f..ff32f20 100644
--- a/gtk/gtkcssstylepropertyimpl.c
+++ b/gtk/gtkcssstylepropertyimpl.c
@@ -620,6 +620,18 @@ parse_letter_spacing (GtkCssStyleProperty *property,
 }
 
 static GtkCssValue *
+parse_text_decoration_line (GtkCssStyleProperty *property,
+                            GtkCssParser        *parser)
+{
+  GtkCssValue *value = _gtk_css_text_decoration_line_value_try_parse (parser);
+
+  if (value == NULL)
+    _gtk_css_parser_error (parser, "unknown value for property");
+
+  return value;
+}
+
+static GtkCssValue *
 box_shadow_value_parse (GtkCssStyleProperty *property,
                         GtkCssParser        *parser)
 {
@@ -1084,6 +1096,16 @@ _gtk_css_style_property_init_properties (void)
                                           NULL,
                                           _gtk_css_number_value_new (0.0, GTK_CSS_PX));
 
+  gtk_css_style_property_register        ("text-decoration-line",
+                                          GTK_CSS_PROPERTY_TEXT_DECORATION_LINE,
+                                          G_TYPE_NONE,
+                                          GTK_STYLE_PROPERTY_ANIMATED,
+                                          GTK_CSS_AFFECTS_TEXT | GTK_CSS_AFFECTS_TEXT_ATTRS,
+                                          parse_text_decoration_line,
+                                          NULL,
+                                          NULL,
+                                          _gtk_css_text_decoration_line_value_new 
(GTK_CSS_TEXT_DECORATION_LINE_NONE));
+
   gtk_css_style_property_register        ("text-shadow",
                                           GTK_CSS_PROPERTY_TEXT_SHADOW,
                                           G_TYPE_NONE,
diff --git a/gtk/gtkcsstypesprivate.h b/gtk/gtkcsstypesprivate.h
index 76cae97..cac528e 100644
--- a/gtk/gtkcsstypesprivate.h
+++ b/gtk/gtkcsstypesprivate.h
@@ -119,6 +119,7 @@ enum { /*< skip >*/
   GTK_CSS_PROPERTY_FONT_WEIGHT,
   GTK_CSS_PROPERTY_FONT_STRETCH,
   GTK_CSS_PROPERTY_LETTER_SPACING,
+  GTK_CSS_PROPERTY_TEXT_DECORATION_LINE,
   GTK_CSS_PROPERTY_TEXT_SHADOW,
   GTK_CSS_PROPERTY_BOX_SHADOW,
   GTK_CSS_PROPERTY_MARGIN_TOP,
@@ -238,6 +239,12 @@ typedef enum /*< skip >*/ {
   GTK_CSS_FONT_SIZE_XX_LARGE
 } GtkCssFontSize;
 
+typedef enum /*< skip >*/ {
+  GTK_CSS_TEXT_DECORATION_LINE_NONE,
+  GTK_CSS_TEXT_DECORATION_LINE_UNDERLINE,
+  GTK_CSS_TEXT_DECORATION_LINE_LINE_THROUGH
+} GtkTextDecorationLine;
+
 /* for the order in arrays */
 typedef enum /*< skip >*/ {
   GTK_CSS_TOP,
diff --git a/gtk/gtkstylecontext.c b/gtk/gtkstylecontext.c
index c34edd1..51c4a1c 100644
--- a/gtk/gtkstylecontext.c
+++ b/gtk/gtkstylecontext.c
@@ -3148,21 +3148,45 @@ _gtk_style_context_get_icon_extents (GtkStyleContext *context,
   extents->height += border.top + border.bottom;
 }
 
+static PangoAttrList *
+add_pango_attr(PangoAttrList *attrs, PangoAttribute *attr)
+{
+  if (attrs == NULL)
+    attrs = pango_attr_list_new ();
+
+  pango_attr_list_insert (attrs, attr);
+
+  return attrs;
+}
+
 PangoAttrList *
 _gtk_style_context_get_pango_attributes (GtkStyleContext *context)
 {
-  gint letter_spacing;
   PangoAttrList *attrs = NULL;
+  GtkTextDecorationLine decoration_line;
+  gint letter_spacing;
 
+  /* text-decoration */
+  decoration_line = _gtk_css_text_decoration_line_value_get (_gtk_style_context_peek_property (context, 
GTK_CSS_PROPERTY_TEXT_DECORATION_LINE));
+
+  switch (decoration_line)
+    {
+    case GTK_CSS_TEXT_DECORATION_LINE_UNDERLINE:
+      attrs = add_pango_attr (attrs, pango_attr_underline_new (PANGO_UNDERLINE_SINGLE));
+      break;
+    case GTK_CSS_TEXT_DECORATION_LINE_LINE_THROUGH:
+      attrs = add_pango_attr (attrs, pango_attr_strikethrough_new (TRUE));
+      break;
+    case GTK_CSS_TEXT_DECORATION_LINE_NONE:
+    default:
+      break;
+    }
+
+  /* letter-spacing */
   letter_spacing = _gtk_css_number_value_get (_gtk_style_context_peek_property (context, 
GTK_CSS_PROPERTY_LETTER_SPACING), 100);
   if (letter_spacing != 0)
     {
-      PangoAttribute *letter_spacing_attr;
-
-      letter_spacing_attr = pango_attr_letter_spacing_new (letter_spacing * PANGO_SCALE);
-
-      attrs = pango_attr_list_new ();
-      pango_attr_list_insert (attrs, letter_spacing_attr);
+      attrs = add_pango_attr (attrs, pango_attr_letter_spacing_new (letter_spacing * PANGO_SCALE));
     }
 
     return attrs;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]