[gnome-builder] xml: add color tags support



commit 80170f5838e413995b5a513cd4b70e059d18cd1b
Author: Sebastien Lafargue <slafargue gnome org>
Date:   Tue Jan 31 17:42:38 2017 +0100

    xml: add color tags support

 data/style-schemes/builder-dark.xml     |    8 ++
 data/style-schemes/builder.xml          |    8 ++
 plugins/xml-pack/ide-xml-tree-builder.c |  144 ++++++++++++++++++++++++++++++-
 plugins/xml-pack/ide-xml-tree-builder.h |   17 ++++-
 4 files changed, 175 insertions(+), 2 deletions(-)
---
diff --git a/data/style-schemes/builder-dark.xml b/data/style-schemes/builder-dark.xml
index ec0e382..957aa44 100644
--- a/data/style-schemes/builder-dark.xml
+++ b/data/style-schemes/builder-dark.xml
@@ -176,5 +176,13 @@
   <style name="xml:attribute-value"         foreground="#669900"/>
   <style name="xml:tag-match"               background="#rgba(114,159,207,.20)"/>
 
+  <!-- Symbol-tree xml-pack coloring -->
+  <style name="symboltree::ui-label"        foreground="#000000" background="#D5E7FC"/>
+  <style name="symboltree::ui-id"           foreground="#000000" background="#D9E7BD"/>
+  <style name="symboltree::ui-style-class"  foreground="#000000" background="#DFCD9B"/>
+  <style name="symboltree::ui-type"         foreground="#000000" background="#F4DAC3"/>
+  <style name="symboltree::ui-parent"       foreground="#000000" background="#DEBECF"/>
+  <style name="symboltree::ui-class"        foreground="#000000" background="#FFEF98"/>
+
 </style-scheme>
 
diff --git a/data/style-schemes/builder.xml b/data/style-schemes/builder.xml
index 4d0ffa0..d29e847 100644
--- a/data/style-schemes/builder.xml
+++ b/data/style-schemes/builder.xml
@@ -181,4 +181,12 @@
   <style name="sh:variable"                 foreground="plum3"/>
   <style name="sh:variable-definition"      foreground="chameleon3"/>
 
+  <!-- Symbol-tree xml-pack coloring -->
+  <style name="symboltree::ui-label"        foreground="#000000" background="#D5E7FC"/>
+  <style name="symboltree::ui-id"           foreground="#000000" background="#D9E7BD"/>
+  <style name="symboltree::ui-style-class"  foreground="#000000" background="#DFCD9B"/>
+  <style name="symboltree::ui-type"         foreground="#000000" background="#F4DAC3"/>
+  <style name="symboltree::ui-parent"       foreground="#000000" background="#DEBECF"/>
+  <style name="symboltree::ui-class"        foreground="#000000" background="#FFEF98"/>
+
 </style-scheme>
diff --git a/plugins/xml-pack/ide-xml-tree-builder.c b/plugins/xml-pack/ide-xml-tree-builder.c
index cb580f6..c5fb1f7 100644
--- a/plugins/xml-pack/ide-xml-tree-builder.c
+++ b/plugins/xml-pack/ide-xml-tree-builder.c
@@ -26,9 +26,41 @@
 
 #include "ide-xml-tree-builder.h"
 
+typedef struct _ColorTag
+{
+  gchar *name;
+  gchar *fg;
+  gchar *bg;
+} ColorTag;
+
+static void
+color_tag_free (gpointer *data)
+{
+  ColorTag *tag = (ColorTag *)data;
+
+  g_free (tag->name);
+  g_free (tag->fg);
+  g_free (tag->bg);
+}
+
+/* Keep it in sync with ColorTagId enum */
+static ColorTag default_color_tags [] =
+{
+  { "label",       "#000000", "#D5E7FC" }, // COLOR_TAG_LABEL
+  { "id",          "#000000", "#D9E7BD" }, // COLOR_TAG_ID
+  { "style-class", "#000000", "#DFCD9B" }, // COLOR_TAG_STYLE_CLASS
+  { "type",        "#000000", "#F4DAC3" }, // COLOR_TAG_TYPE
+  { "parent",      "#000000", "#DEBECF" }, // COLOR_TAG_PARENT
+  { "class",       "#000000", "#FFEF98" }, // COLOR_TAG_CLASS
+  { NULL },
+};
+
 struct _IdeXmlTreeBuilder
 {
-  IdeObject parent_instance;
+  IdeObject  parent_instance;
+
+  GSettings *settings;
+  GArray    *color_tags;
 };
 
 typedef struct{
@@ -193,6 +225,101 @@ ide_xml_tree_builder_build_tree_finish (IdeXmlTreeBuilder  *self,
   return g_task_propagate_pointer (task, error);
 }
 
+gchar *
+ide_xml_tree_builder_get_color_tag (IdeXmlTreeBuilder *self,
+                                    const gchar       *str,
+                                    ColorTagId         id,
+                                    gboolean           space_before,
+                                    gboolean           space_after,
+                                    gboolean           space_inside)
+{
+  ColorTag *tag;
+
+  g_assert (IDE_IS_XML_TREE_BUILDER (self));
+  g_assert (self->color_tags != NULL);
+  g_assert (!ide_str_empty0 (str));
+
+  tag = &g_array_index (self->color_tags, ColorTag, id);
+  return g_strdup_printf ("%s<span foreground=\"%s\" background=\"%s\">%s%s%s</span>%s",
+                          space_before ? " " : "",
+                          tag->fg,
+                          tag->bg,
+                          space_inside ? " " : "",
+                          str,
+                          space_inside ? " " : "",
+                          space_after ? " " : "");
+}
+
+static void
+init_color_tags (IdeXmlTreeBuilder *self)
+{
+  g_autofree gchar *scheme_name = NULL;
+  GtkSourceStyleSchemeManager *manager;
+  GtkSourceStyleScheme *scheme;
+  gchar *tag_name;
+  GtkSourceStyle *style;
+  gchar *foreground;
+  gchar *background;
+  ColorTag tag;
+  ColorTag *tag_ptr;
+  gboolean tag_set;
+
+  g_assert (IDE_IS_XML_TREE_BUILDER (self));
+
+  scheme_name = g_settings_get_string (self->settings, "style-scheme-name");
+  manager = gtk_source_style_scheme_manager_get_default ();
+  scheme = gtk_source_style_scheme_manager_get_scheme (manager, scheme_name);
+
+  g_array_remove_range (self->color_tags, 0, self->color_tags->len);
+  tag_ptr = default_color_tags;
+  while (tag_ptr->fg != NULL)
+    {
+      tag_set = FALSE;
+      if (scheme != NULL)
+        {
+          tag_name = g_strconcat ("symboltree::ui-", tag_ptr->name, NULL);
+          if (NULL != (style = gtk_source_style_scheme_get_style (scheme, tag_name)))
+            {
+              g_object_get (style, "foreground", &foreground, NULL);
+              g_object_get (style, "background", &background, NULL);
+              if (foreground != NULL && background != NULL)
+                {
+                  tag_set = TRUE;
+                  tag.name = g_strdup (tag_ptr->name);
+                  tag.fg = g_steal_pointer (&foreground);
+                  tag.bg = g_steal_pointer (&background);
+                }
+
+              g_free (foreground);
+              g_free (background);
+            }
+
+          g_free (tag_name);
+        }
+
+      if (!tag_set)
+        {
+          tag.name = g_strdup (tag_ptr->name);
+          tag.fg = g_strdup (tag_ptr->fg);
+          tag.bg = g_strdup (tag_ptr->bg);
+        }
+
+      g_array_append_val (self->color_tags, tag);
+      ++tag_ptr;
+    }
+}
+
+static void
+editor_settings_changed_cb (IdeXmlTreeBuilder *self,
+                            gchar             *key,
+                            GSettings         *settings)
+{
+  g_assert (IDE_IS_XML_TREE_BUILDER (self));
+
+  if (ide_str_equal0 (key, "style-scheme-name"))
+    init_color_tags (self);
+}
+
 IdeXmlTreeBuilder *
 ide_xml_tree_builder_new (void)
 {
@@ -202,6 +329,11 @@ ide_xml_tree_builder_new (void)
 static void
 ide_xml_tree_builder_finalize (GObject *object)
 {
+  IdeXmlTreeBuilder *self = (IdeXmlTreeBuilder *)object;
+
+  g_clear_pointer (&self->color_tags, g_array_unref);
+  g_clear_object (&self->settings);
+
   G_OBJECT_CLASS (ide_xml_tree_builder_parent_class)->finalize (object);
 }
 
@@ -216,4 +348,14 @@ ide_xml_tree_builder_class_init (IdeXmlTreeBuilderClass *klass)
 static void
 ide_xml_tree_builder_init (IdeXmlTreeBuilder *self)
 {
+  self->color_tags = g_array_new (TRUE, TRUE, sizeof (ColorTag));
+  g_array_set_clear_func (self->color_tags, (GDestroyNotify)color_tag_free);
+
+  self->settings = g_settings_new ("org.gnome.builder.editor");
+  g_signal_connect_swapped (self->settings,
+                            "changed",
+                            G_CALLBACK (editor_settings_changed_cb),
+                            self);
+
+  init_color_tags (self);
 }
diff --git a/plugins/xml-pack/ide-xml-tree-builder.h b/plugins/xml-pack/ide-xml-tree-builder.h
index 9043103..93614a7 100644
--- a/plugins/xml-pack/ide-xml-tree-builder.h
+++ b/plugins/xml-pack/ide-xml-tree-builder.h
@@ -30,6 +30,16 @@ G_BEGIN_DECLS
 
 G_DECLARE_FINAL_TYPE (IdeXmlTreeBuilder, ide_xml_tree_builder, IDE, XML_TREE_BUILDER, IdeObject)
 
+typedef enum _ColorTagId
+{
+  COLOR_TAG_LABEL,
+  COLOR_TAG_ID,
+  COLOR_TAG_STYLE_CLASS,
+  COLOR_TAG_TYPE,
+  COLOR_TAG_PARENT,
+  COLOR_TAG_CLASS,
+} ColorTagId;
+
 IdeXmlTreeBuilder   *ide_xml_tree_builder_new                    (void);
 void                 ide_xml_tree_builder_build_tree_async       (IdeXmlTreeBuilder     *self,
                                                                   GFile                 *file,
@@ -39,7 +49,12 @@ void                 ide_xml_tree_builder_build_tree_async       (IdeXmlTreeBuil
 IdeXmlSymbolNode    *ide_xml_tree_builder_build_tree_finish      (IdeXmlTreeBuilder     *self,
                                                                   GAsyncResult          *result,
                                                                   GError               **error);
-
+gchar               *ide_xml_tree_builder_get_color_tag          (IdeXmlTreeBuilder     *self,
+                                                                  const gchar           *str,
+                                                                  ColorTagId             id,
+                                                                  gboolean               space_before,
+                                                                  gboolean               space_after,
+                                                                  gboolean               space_inside);
 G_END_DECLS
 
 #endif /* IDE_XML_TREE_BUILDER_H */


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