[gnome-builder/wip/slaf/colored-build-output: 25/36] xml: add color tags support
- From: Sébastien Lafargue <slafargue src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder/wip/slaf/colored-build-output: 25/36] xml: add color tags support
- Date: Sat, 11 Feb 2017 21:37:51 +0000 (UTC)
commit eb36dd7d3059289e568e11df2263333319fa30b5
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]