[gtk+/wip/otte/tokenizer: 53/78] stylesheet: Add properties



commit eb86a5fb3f5fcf3a82a51bd577fda6ad5bee860d
Author: Benjamin Otte <otte redhat com>
Date:   Fri Mar 25 06:26:46 2016 +0100

    stylesheet: Add properties
    
    ... and turn it into the API demanded by the CSSOM. That is, don't allow
    reloading in the stylesheet, demand that new ones are created and the
    token source be provided at construction.

 gtk/gtkcssstylesheet.c        |  173 ++++++++++++++++++++++++++++++++++-------
 gtk/gtkcssstylesheetprivate.h |   17 ++--
 gtk/inspector/css-editor.c    |   13 +--
 3 files changed, 159 insertions(+), 44 deletions(-)
---
diff --git a/gtk/gtkcssstylesheet.c b/gtk/gtkcssstylesheet.c
index afb9d53..ba59715 100644
--- a/gtk/gtkcssstylesheet.c
+++ b/gtk/gtkcssstylesheet.c
@@ -21,23 +21,99 @@
 
 #include "gtkcssstylesheetprivate.h"
 
+#include "gtkintl.h"
+#include "gtkprivate.h"
+
+enum {
+  PROP_0,
+  PROP_CSS_RULES,
+  PROP_FILE,
+  PROP_OWNER_RULE,
+  PROP_PARENT_STYLESHEET,
+  NUM_PROPERTIES
+};
+
 typedef struct _GtkCssStyleSheetPrivate GtkCssStyleSheetPrivate;
 struct _GtkCssStyleSheetPrivate {
-  GtkCssRule *parent_rule;
+  GtkCssRule *owner_rule;
   GtkCssRuleList *css_rules;
 
   GFile *file;
 };
 
+static GParamSpec *style_sheet_props[NUM_PROPERTIES] = { NULL, };
+
 G_DEFINE_TYPE_WITH_PRIVATE (GtkCssStyleSheet, gtk_css_style_sheet, G_TYPE_OBJECT)
 
 static void
+gtk_css_style_sheet_set_property (GObject      *gobject,
+                                  guint         prop_id,
+                                  const GValue *value,
+                                  GParamSpec   *pspec)
+{
+  GtkCssStyleSheet *style_sheet = GTK_CSS_STYLE_SHEET (gobject);
+  GtkCssStyleSheetPrivate *priv = gtk_css_style_sheet_get_instance_private (style_sheet);
+
+  switch (prop_id)
+    {
+      case PROP_FILE:
+        priv->file = g_value_dup_object (value);
+        break;
+
+      case PROP_OWNER_RULE:
+        priv->owner_rule = g_value_dup_object (value);
+        break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
+      break;
+    }
+}
+
+static void
+gtk_css_style_sheet_get_property (GObject    *gobject,
+                                  guint       prop_id,
+                                  GValue     *value,
+                                  GParamSpec *pspec)
+{
+  GtkCssStyleSheet *style_sheet = GTK_CSS_STYLE_SHEET (gobject);
+  GtkCssStyleSheetPrivate *priv = gtk_css_style_sheet_get_instance_private (style_sheet);
+
+  switch (prop_id)
+    {
+      case PROP_CSS_RULES:
+        g_value_set_object (value, priv->css_rules);
+        break;
+
+      case PROP_FILE:
+        g_value_set_object (value, priv->file);
+        break;
+
+      case PROP_OWNER_RULE:
+        g_value_set_object (value, priv->owner_rule);
+        break;
+
+      case PROP_PARENT_STYLESHEET:
+        if (priv->owner_rule)
+          g_value_set_object (value, gtk_css_rule_get_parent_style_sheet (priv->owner_rule));
+        else
+          g_value_set_object (value, NULL);
+        break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
+    }
+}
+
+static void
 gtk_css_style_sheet_finalize (GObject *object)
 {
   GtkCssStyleSheet *style_sheet = GTK_CSS_STYLE_SHEET (object);
   GtkCssStyleSheetPrivate *priv = gtk_css_style_sheet_get_instance_private (style_sheet);
 
   g_object_unref (priv->css_rules);
+  if (priv->owner_rule)
+    g_object_unref (priv->owner_rule);
   if (priv->file)
     g_object_unref (priv->file);
 
@@ -50,6 +126,35 @@ gtk_css_style_sheet_class_init (GtkCssStyleSheetClass *klass)
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
   object_class->finalize = gtk_css_style_sheet_finalize;
+  object_class->get_property = gtk_css_style_sheet_get_property;
+  object_class->set_property = gtk_css_style_sheet_set_property;
+
+  style_sheet_props[PROP_CSS_RULES] =
+      g_param_spec_object ("css-rules",
+                           P_("css rules"),
+                           P_("The CSS rules of the style sheet"),
+                           GTK_TYPE_CSS_RULE_LIST,
+                           GTK_PARAM_READABLE | G_PARAM_EXPLICIT_NOTIFY);
+  style_sheet_props[PROP_FILE] =
+      g_param_spec_object ("file",
+                           P_("file"),
+                           P_("The file the style sheet was loaded from or NULL if inline"),
+                           G_TYPE_FILE,
+                           GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_EXPLICIT_NOTIFY);
+  style_sheet_props[PROP_OWNER_RULE] =
+      g_param_spec_object ("owner-rule",
+                           P_("owner rule"),
+                           P_("The CSS rule that loaded this style sheet or NULL"),
+                           GTK_TYPE_CSS_RULE,
+                           GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_EXPLICIT_NOTIFY);
+  style_sheet_props[PROP_PARENT_STYLESHEET] =
+      g_param_spec_object ("parent-stylesheet",
+                           P_("parent style sheet"),
+                           P_("The parent style sheet that loaded this style sheet or NULL"),
+                           GTK_TYPE_CSS_STYLE_SHEET,
+                           GTK_PARAM_READABLE | G_PARAM_EXPLICIT_NOTIFY);
+
+  g_object_class_install_properties (object_class, NUM_PROPERTIES, style_sheet_props);
 }
 
 static void
@@ -60,42 +165,53 @@ gtk_css_style_sheet_init (GtkCssStyleSheet *style_sheet)
   priv->css_rules = gtk_css_rule_list_new ();
 }
 
-GtkCssStyleSheet *
-gtk_css_style_sheet_new (void)
+static void
+gtk_css_style_sheet_parse (GtkCssStyleSheet  *style_sheet,
+                           GtkCssTokenSource *source)
 {
-  return g_object_new (GTK_TYPE_CSS_STYLE_SHEET, NULL);
+  GtkCssStyleSheetPrivate *priv;
+
+  g_return_if_fail (GTK_IS_CSS_STYLE_SHEET (style_sheet));
+  g_return_if_fail (source != NULL);
+
+  priv = gtk_css_style_sheet_get_instance_private (style_sheet);
+
+  gtk_css_rule_list_parse (priv->css_rules, source, NULL, style_sheet);
 }
 
-static void
-gtk_css_style_sheet_set_file (GtkCssStyleSheet *style_sheet,
-                              GFile            *file)
+GtkCssStyleSheet *
+gtk_css_style_sheet_new (GtkCssTokenSource *source)
 {
-  GtkCssStyleSheetPrivate *priv = gtk_css_style_sheet_get_instance_private (style_sheet);
+  GtkCssStyleSheet *sheet;
 
-  if (priv->file == file)
-    return;
+  g_return_val_if_fail (source != NULL, NULL);
 
-  if (priv->file)
-    g_object_unref (priv->file);
+  sheet = g_object_new (GTK_TYPE_CSS_STYLE_SHEET,
+                        "file", gtk_css_token_source_get_location (source),
+                        NULL);
 
-  priv->file = file;
-  if (file)
-    g_object_ref (file);
+  gtk_css_style_sheet_parse (sheet, source);
+
+  return sheet;
 }
 
-void
-gtk_css_style_sheet_parse (GtkCssStyleSheet  *style_sheet,
-                           GtkCssTokenSource *source)
+GtkCssStyleSheet *
+gtk_css_style_sheet_new_import (GtkCssTokenSource *source,
+                                GtkCssRule        *owner_rule)
 {
-  GtkCssStyleSheetPrivate *priv;
+  GtkCssStyleSheet *sheet;
 
-  g_return_if_fail (GTK_IS_CSS_STYLE_SHEET (style_sheet));
-  g_return_if_fail (source != NULL);
+  g_return_val_if_fail (source != NULL, NULL);
+  g_return_val_if_fail (GTK_IS_CSS_RULE (owner_rule), NULL);
 
-  priv = gtk_css_style_sheet_get_instance_private (style_sheet);
-  gtk_css_style_sheet_set_file (style_sheet, gtk_css_token_source_get_location (source));
+  sheet = g_object_new (GTK_TYPE_CSS_STYLE_SHEET,
+                        "file", gtk_css_token_source_get_location (source),
+                        "owner-rule", owner_rule,
+                        NULL);
 
-  gtk_css_rule_list_parse (priv->css_rules, source, NULL, style_sheet);
+  gtk_css_style_sheet_parse (sheet, source);
+
+  return sheet;
 }
 
 GFile *
@@ -119,11 +235,14 @@ gtk_css_style_sheet_get_parent_style_sheet (GtkCssStyleSheet *style_sheet)
 
   priv = gtk_css_style_sheet_get_instance_private (style_sheet);
 
-  return gtk_css_rule_get_parent_style_sheet (priv->parent_rule);
+  if (priv->owner_rule == NULL)
+    return NULL;
+
+  return gtk_css_rule_get_parent_style_sheet (priv->owner_rule);
 }
 
 GtkCssRule *
-gtk_css_style_sheet_get_parent_rule (GtkCssStyleSheet *style_sheet)
+gtk_css_style_sheet_get_owner_rule (GtkCssStyleSheet *style_sheet)
 {
   GtkCssStyleSheetPrivate *priv;
 
@@ -131,7 +250,7 @@ gtk_css_style_sheet_get_parent_rule (GtkCssStyleSheet *style_sheet)
 
   priv = gtk_css_style_sheet_get_instance_private (style_sheet);
 
-  return priv->parent_rule;
+  return priv->owner_rule;
 }
 
 GtkCssRuleList *
diff --git a/gtk/gtkcssstylesheetprivate.h b/gtk/gtkcssstylesheetprivate.h
index 6cc319f..d75aecc 100644
--- a/gtk/gtkcssstylesheetprivate.h
+++ b/gtk/gtkcssstylesheetprivate.h
@@ -47,21 +47,20 @@ struct _GtkCssStyleSheetClass
   GObjectClass parent_class;
 };
 
-GType                  gtk_css_style_sheet_get_type                     (void) G_GNUC_CONST;
+GType                   gtk_css_style_sheet_get_type                    (void) G_GNUC_CONST;
 
-GtkCssStyleSheet *     gtk_css_style_sheet_new                          (void);
-
-void                   gtk_css_style_sheet_parse                        (GtkCssStyleSheet       *style_sheet,
-                                                                         GtkCssTokenSource      *source);
+GtkCssStyleSheet *      gtk_css_style_sheet_new                         (GtkCssTokenSource      *source);
+GtkCssStyleSheet *      gtk_css_style_sheet_new_import                  (GtkCssTokenSource      *source,
+                                                                         GtkCssRule             *owner_rule);
 
 /* StyleSheet interface */
-GtkCssStyleSheet *     gtk_css_style_sheet_get_parent_style_sheet       (GtkCssStyleSheet       
*style_sheet);
+GtkCssStyleSheet *      gtk_css_style_sheet_get_parent_style_sheet      (GtkCssStyleSheet       
*style_sheet);
 
-GFile *                gtk_css_style_sheet_get_file                     (GtkCssStyleSheet       
*style_sheet);
+GFile *                 gtk_css_style_sheet_get_file                    (GtkCssStyleSheet       
*style_sheet);
 
 /* CSSStyleSheet interface */
-GtkCssRule *           gtk_css_style_sheet_get_parent_rule              (GtkCssStyleSheet       
*style_sheet);
-GtkCssRuleList *       gtk_css_style_sheet_get_css_rules                (GtkCssStyleSheet       
*style_sheet);
+GtkCssRule *            gtk_css_style_sheet_get_owner_rule              (GtkCssStyleSheet       
*style_sheet);
+GtkCssRuleList *        gtk_css_style_sheet_get_css_rules               (GtkCssStyleSheet       
*style_sheet);
 
 
 G_END_DECLS
diff --git a/gtk/inspector/css-editor.c b/gtk/inspector/css-editor.c
index d2dec43..da00446 100644
--- a/gtk/inspector/css-editor.c
+++ b/gtk/inspector/css-editor.c
@@ -473,9 +473,9 @@ update_style_sheet (GtkInspectorCssEditor *ce)
   GtkCssTokenSource *source;
 
   source = gtk_css_chunk_token_source_new (priv->tokens);
-  g_object_unref (priv->style_sheet);
-  priv->style_sheet = gtk_css_style_sheet_new ();
-  gtk_css_style_sheet_parse (priv->style_sheet, source);
+  if (priv->style_sheet)
+    g_object_unref (priv->style_sheet);
+  priv->style_sheet = gtk_css_style_sheet_new (source);
 
   gtk_css_token_source_unref (source);
 
@@ -757,15 +757,11 @@ gtk_inspector_css_editor_init (GtkInspectorCssEditor *ce)
 {
   ce->priv = gtk_inspector_css_editor_get_instance_private (ce);
   gtk_widget_init_template (GTK_WIDGET (ce));
-  ce->priv->style_sheet = gtk_css_style_sheet_new ();
   ce->priv->tokens = gtk_css_rb_tree_new (GtkCssChunk,
                                           GtkCssChunkSize,
                                           gtk_css_chunk_augment,
                                           gtk_css_chunk_clear,
                                           NULL);
-
-  gtk_inspector_css_rule_view_set_style_sheet (GTK_INSPECTOR_CSS_RULE_VIEW (ce->priv->ruleview),
-                                               ce->priv->style_sheet);
 }
 
 static void
@@ -792,7 +788,8 @@ finalize (GObject *object)
 
   gtk_inspector_css_editor_set_node (ce, NULL);
 
-  g_object_unref (ce->priv->style_sheet);
+  if (ce->priv->style_sheet)
+    g_object_unref (ce->priv->style_sheet);
 
   destroy_provider (ce);
 


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