[gnome-builder] prefs: add GbSourceStyleSchemeButton and GbSourceStyleSchemeWidget



commit d9c127148b025c6bf50e95cb7d34c55eda7b85e1
Author: Christian Hergert <christian hergert me>
Date:   Thu Oct 16 14:37:42 2014 -0700

    prefs: add GbSourceStyleSchemeButton and GbSourceStyleSchemeWidget
    
    This are convenience classes for selecting a style scheme in a more visual
    way than just from a list of scheme names. This shows a bit of a preview
    of the style-scheme using C as the language in the buffer.
    
    This could probably use a bunch of work, but I think it's better than just
    a list even at this point.

 src/editor/gb-source-style-scheme-button.c |  262 +++++++++++++++++++++++++++
 src/editor/gb-source-style-scheme-button.h |   61 +++++++
 src/editor/gb-source-style-scheme-widget.c |  264 ++++++++++++++++++++++++++++
 src/editor/gb-source-style-scheme-widget.h |   59 ++++++
 src/gnome-builder.mk                       |    4 +
 5 files changed, 650 insertions(+), 0 deletions(-)
---
diff --git a/src/editor/gb-source-style-scheme-button.c b/src/editor/gb-source-style-scheme-button.c
new file mode 100644
index 0000000..94ff515
--- /dev/null
+++ b/src/editor/gb-source-style-scheme-button.c
@@ -0,0 +1,262 @@
+/* gb-source-style-scheme-button.c
+ *
+ * Copyright (C) 2014 Christian Hergert <christian hergert me>
+ *
+ * This file is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <glib/gi18n.h>
+
+#include "gb-source-style-scheme-button.h"
+#include "gb-source-style-scheme-widget.h"
+
+struct _GbSourceStyleSchemeButtonPrivate
+{
+  gchar    *style_scheme_name;
+
+  GtkLabel *label;
+};
+
+G_DEFINE_TYPE_WITH_PRIVATE (GbSourceStyleSchemeButton,
+                            gb_source_style_scheme_button,
+                            GTK_TYPE_TOGGLE_BUTTON)
+
+enum {
+  PROP_0,
+  PROP_STYLE_SCHEME,
+  PROP_STYLE_SCHEME_NAME,
+  LAST_PROP
+};
+
+static GParamSpec *gParamSpecs [LAST_PROP];
+
+GtkWidget *
+gb_source_style_scheme_button_new (void)
+{
+  return g_object_new (GB_TYPE_SOURCE_STYLE_SCHEME_BUTTON, NULL);
+}
+
+const gchar *
+gb_source_style_scheme_button_get_style_scheme_name (GbSourceStyleSchemeButton *button)
+{
+  g_return_val_if_fail (GB_IS_SOURCE_STYLE_SCHEME_BUTTON (button), NULL);
+
+  return button->priv->style_scheme_name;
+}
+
+static void
+gb_source_style_scheme_button_update_label (GbSourceStyleSchemeButton *button)
+{
+  GtkSourceStyleScheme *scheme;
+  const gchar *label;
+
+  g_return_if_fail (GB_IS_SOURCE_STYLE_SCHEME_BUTTON (button));
+
+  scheme = gb_source_style_scheme_button_get_style_scheme (button);
+  if (!scheme)
+    g_return_if_reached ();
+
+  label = gtk_source_style_scheme_get_name (scheme);
+  gtk_label_set_label (button->priv->label, label);
+}
+
+void
+gb_source_style_scheme_button_set_style_scheme_name (GbSourceStyleSchemeButton *button,
+                                                     const gchar               *style_scheme_name)
+{
+  g_return_if_fail (GB_IS_SOURCE_STYLE_SCHEME_BUTTON (button));
+
+  if (!style_scheme_name)
+    style_scheme_name = "tango";
+
+  if (style_scheme_name != button->priv->style_scheme_name)
+    {
+      g_free (button->priv->style_scheme_name);
+      button->priv->style_scheme_name = g_strdup (style_scheme_name);
+      gb_source_style_scheme_button_update_label (button);
+      g_object_notify_by_pspec (G_OBJECT (button),
+                                gParamSpecs [PROP_STYLE_SCHEME_NAME]);
+      g_object_notify_by_pspec (G_OBJECT (button),
+                                gParamSpecs [PROP_STYLE_SCHEME]);
+    }
+}
+
+/**
+ * gb_source_style_scheme_button_get_style_scheme:
+ *
+ * Returns: (transfer none): A #GtkSourceStyleScheme.
+ */
+GtkSourceStyleScheme *
+gb_source_style_scheme_button_get_style_scheme (GbSourceStyleSchemeButton *button)
+{
+  GtkSourceStyleSchemeManager *manager;
+
+  g_return_val_if_fail (GB_IS_SOURCE_STYLE_SCHEME_BUTTON (button), NULL);
+
+  manager = gtk_source_style_scheme_manager_get_default ();
+
+  return gtk_source_style_scheme_manager_get_scheme (manager,
+                                                     button->priv->style_scheme_name);
+}
+
+static void
+gb_source_style_scheme_button_toggled (GtkToggleButton *button)
+{
+  GbSourceStyleSchemeButton *self = (GbSourceStyleSchemeButton *)button;
+  GtkDialog *dialog;
+  GtkWidget *toplevel;
+  GbSourceStyleSchemeWidget *chooser;
+  GtkWidget *content_area;
+
+  g_return_if_fail (GB_IS_SOURCE_STYLE_SCHEME_BUTTON (button));
+
+  if (!gtk_toggle_button_get_active (button))
+    return;
+
+  toplevel = gtk_widget_get_toplevel (GTK_WIDGET (button));
+  dialog = g_object_new (GTK_TYPE_DIALOG,
+                         "transient-for", toplevel,
+                         "title", _("Select a Style"),
+                         "use-header-bar", TRUE,
+                         NULL);
+  gtk_dialog_add_buttons (dialog,
+                          _("Cancel"), GTK_RESPONSE_CANCEL,
+                          _("Select"), GTK_RESPONSE_OK,
+                          NULL);
+  gtk_dialog_set_default_response (dialog, GTK_RESPONSE_OK);
+
+  chooser = g_object_new (GB_TYPE_SOURCE_STYLE_SCHEME_WIDGET,
+                          "height-request", 325,
+                          "style-scheme-name", self->priv->style_scheme_name,
+                          "visible", TRUE,
+                          "width-request", 450,
+                          NULL);
+
+  content_area = gtk_dialog_get_content_area (dialog);
+  gtk_container_add (GTK_CONTAINER (content_area), GTK_WIDGET (chooser));
+
+  if (gtk_dialog_run (dialog) == GTK_RESPONSE_OK)
+    {
+      gchar *name;
+
+      g_object_get (chooser, "style-scheme-name", &name, NULL);
+      gb_source_style_scheme_button_set_style_scheme_name (self, name);
+      g_free (name);
+    }
+
+  gtk_widget_destroy (GTK_WIDGET (dialog));
+
+  gtk_toggle_button_set_active (button, FALSE);
+}
+
+static void
+gb_source_style_scheme_button_finalize (GObject *object)
+{
+  GbSourceStyleSchemeButtonPrivate *priv = GB_SOURCE_STYLE_SCHEME_BUTTON (object)->priv;
+
+  g_clear_pointer (&priv->style_scheme_name, g_free);
+
+  G_OBJECT_CLASS (gb_source_style_scheme_button_parent_class)->finalize (object);
+}
+
+static void
+gb_source_style_scheme_button_get_property (GObject    *object,
+                                            guint       prop_id,
+                                            GValue     *value,
+                                            GParamSpec *pspec)
+{
+  GbSourceStyleSchemeButton *self = GB_SOURCE_STYLE_SCHEME_BUTTON (object);
+
+  switch (prop_id)
+    {
+    case PROP_STYLE_SCHEME:
+      g_value_set_object (value,
+                          gb_source_style_scheme_button_get_style_scheme (self));
+      break;
+
+    case PROP_STYLE_SCHEME_NAME:
+      g_value_set_string (value, self->priv->style_scheme_name);
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+gb_source_style_scheme_button_set_property (GObject      *object,
+                                            guint         prop_id,
+                                            const GValue *value,
+                                            GParamSpec   *pspec)
+{
+  GbSourceStyleSchemeButton *self = GB_SOURCE_STYLE_SCHEME_BUTTON (object);
+
+  switch (prop_id)
+    {
+    case PROP_STYLE_SCHEME_NAME:
+      gb_source_style_scheme_button_set_style_scheme_name (self,
+                                                           g_value_get_string (value));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+gb_source_style_scheme_button_class_init (GbSourceStyleSchemeButtonClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  GtkToggleButtonClass *toggle_class = GTK_TOGGLE_BUTTON_CLASS (klass);
+
+  object_class->finalize = gb_source_style_scheme_button_finalize;
+  object_class->get_property = gb_source_style_scheme_button_get_property;
+  object_class->set_property = gb_source_style_scheme_button_set_property;
+
+  toggle_class->toggled = gb_source_style_scheme_button_toggled;
+
+  gParamSpecs [PROP_STYLE_SCHEME_NAME] =
+    g_param_spec_string ("style-scheme-name",
+                         _("Style Scheme Name"),
+                         _("THe name of the GtkSourceStyleScheme."),
+                         "tango",
+                         (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  g_object_class_install_property (object_class, PROP_STYLE_SCHEME_NAME,
+                                   gParamSpecs [PROP_STYLE_SCHEME_NAME]);
+
+  gParamSpecs [PROP_STYLE_SCHEME] =
+    g_param_spec_object ("style-scheme",
+                         _("Style Scheme"),
+                         _("The style scheme as an object."),
+                         GTK_SOURCE_TYPE_STYLE_SCHEME,
+                         (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+  g_object_class_install_property (object_class, PROP_STYLE_SCHEME,
+                                   gParamSpecs [PROP_STYLE_SCHEME]);
+}
+
+static void
+gb_source_style_scheme_button_init (GbSourceStyleSchemeButton *self)
+{
+  self->priv = gb_source_style_scheme_button_get_instance_private (self);
+
+  self->priv->label = g_object_new (GTK_TYPE_LABEL,
+                                    "halign", GTK_ALIGN_CENTER,
+                                    "valign", GTK_ALIGN_BASELINE,
+                                    "visible", TRUE,
+                                    NULL);
+  gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (self->priv->label));
+
+  self->priv->style_scheme_name = g_strdup ("tango");
+  gb_source_style_scheme_button_update_label (self);
+}
diff --git a/src/editor/gb-source-style-scheme-button.h b/src/editor/gb-source-style-scheme-button.h
new file mode 100644
index 0000000..4ec8804
--- /dev/null
+++ b/src/editor/gb-source-style-scheme-button.h
@@ -0,0 +1,61 @@
+/* gb-source-style-scheme-button.h
+ *
+ * Copyright (C) 2014 Christian Hergert <christian hergert me>
+ *
+ * This file is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GB_SOURCE_STYLE_SCHEME_BUTTON_H
+#define GB_SOURCE_STYLE_SCHEME_BUTTON_H
+
+#include <gtk/gtk.h>
+#include <gtksourceview/gtksource.h>
+
+G_BEGIN_DECLS
+
+#define GB_TYPE_SOURCE_STYLE_SCHEME_BUTTON            (gb_source_style_scheme_button_get_type())
+#define GB_SOURCE_STYLE_SCHEME_BUTTON(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
GB_TYPE_SOURCE_STYLE_SCHEME_BUTTON, GbSourceStyleSchemeButton))
+#define GB_SOURCE_STYLE_SCHEME_BUTTON_CONST(obj)      (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
GB_TYPE_SOURCE_STYLE_SCHEME_BUTTON, GbSourceStyleSchemeButton const))
+#define GB_SOURCE_STYLE_SCHEME_BUTTON_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  
GB_TYPE_SOURCE_STYLE_SCHEME_BUTTON, GbSourceStyleSchemeButtonClass))
+#define GB_IS_SOURCE_STYLE_SCHEME_BUTTON(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), 
GB_TYPE_SOURCE_STYLE_SCHEME_BUTTON))
+#define GB_IS_SOURCE_STYLE_SCHEME_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  
GB_TYPE_SOURCE_STYLE_SCHEME_BUTTON))
+#define GB_SOURCE_STYLE_SCHEME_BUTTON_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  
GB_TYPE_SOURCE_STYLE_SCHEME_BUTTON, GbSourceStyleSchemeButtonClass))
+
+typedef struct _GbSourceStyleSchemeButton        GbSourceStyleSchemeButton;
+typedef struct _GbSourceStyleSchemeButtonClass   GbSourceStyleSchemeButtonClass;
+typedef struct _GbSourceStyleSchemeButtonPrivate GbSourceStyleSchemeButtonPrivate;
+
+struct _GbSourceStyleSchemeButton
+{
+  GtkToggleButton parent;
+
+  /*< private >*/
+  GbSourceStyleSchemeButtonPrivate *priv;
+};
+
+struct _GbSourceStyleSchemeButtonClass
+{
+  GtkToggleButtonClass parent;
+};
+
+GType                 gb_source_style_scheme_button_get_type              (void);
+GtkWidget            *gb_source_style_scheme_button_new                   (void);
+GtkSourceStyleScheme *gb_source_style_scheme_button_get_style_scheme      (GbSourceStyleSchemeButton 
*button);
+const gchar          *gb_source_style_scheme_button_get_style_scheme_name (GbSourceStyleSchemeButton 
*button);
+void                  gb_source_style_scheme_button_set_style_scheme_name (GbSourceStyleSchemeButton *button,
+                                                                           const gchar               
*style_scheme_name);
+
+G_END_DECLS
+
+#endif /* GB_SOURCE_STYLE_SCHEME_BUTTON_H */
diff --git a/src/editor/gb-source-style-scheme-widget.c b/src/editor/gb-source-style-scheme-widget.c
new file mode 100644
index 0000000..71f0392
--- /dev/null
+++ b/src/editor/gb-source-style-scheme-widget.c
@@ -0,0 +1,264 @@
+/* gb-source-style-scheme-widget.c
+ *
+ * Copyright (C) 2014 Christian Hergert <christian hergert me>
+ *
+ * This file is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <glib/gi18n.h>
+#include <gtksourceview/gtksource.h>
+
+#include "gb-source-style-scheme-widget.h"
+
+struct _GbSourceStyleSchemeWidgetPrivate
+{
+  GtkBox            *vbox;
+  GtkListBox        *list_box;
+  GtkScrolledWindow *scroller;
+};
+
+G_DEFINE_TYPE_WITH_PRIVATE (GbSourceStyleSchemeWidget,
+                            gb_source_style_scheme_widget,
+                            GTK_TYPE_BIN)
+
+enum {
+  PROP_0,
+  PROP_STYLE_SCHEME_NAME,
+  LAST_PROP
+};
+
+static GParamSpec *gParamSpecs [LAST_PROP];
+
+GtkWidget *
+gb_source_style_scheme_widget_new (void)
+{
+  return g_object_new (GB_TYPE_SOURCE_STYLE_SCHEME_WIDGET, NULL);
+}
+
+const gchar *
+gb_source_style_scheme_widget_get_style_scheme_name (GbSourceStyleSchemeWidget *widget)
+{
+  GtkListBoxRow *row;
+
+  g_return_val_if_fail (GB_IS_SOURCE_STYLE_SCHEME_WIDGET (widget), NULL);
+
+  row = gtk_list_box_get_selected_row (widget->priv->list_box);
+
+  if (row)
+    return g_object_get_data (G_OBJECT (row), "scheme_id");
+
+  return NULL;
+}
+
+void
+gb_source_style_scheme_widget_set_style_scheme_name (GbSourceStyleSchemeWidget *widget,
+                                                     const gchar               *style_scheme_name)
+{
+  GList *children;
+  GList *iter;
+
+  g_return_if_fail (GB_IS_SOURCE_STYLE_SCHEME_WIDGET (widget));
+
+  children = gtk_container_get_children (GTK_CONTAINER (widget->priv->list_box));
+
+  for (iter = children; iter; iter = iter->next)
+    {
+      const gchar *cur;
+
+      cur = g_object_get_data (G_OBJECT (iter->data), "scheme_id");
+
+      if (0 == g_strcmp0 (cur, style_scheme_name))
+        {
+          gtk_list_box_select_row (widget->priv->list_box, iter->data);
+          break;
+        }
+    }
+
+  g_list_free (children);
+}
+
+static GtkListBoxRow *
+make_row (GtkSourceStyleScheme *scheme,
+          GtkSourceLanguage    *language,
+          PangoFontDescription *font_desc)
+{
+  GtkListBoxRow *row;
+  GtkSourceBuffer *buffer;
+  GtkSourceView *view;
+  const gchar *scheme_id;
+  gchar *text;
+
+  g_return_val_if_fail (GTK_SOURCE_IS_STYLE_SCHEME (scheme), NULL);
+  g_return_val_if_fail (GTK_SOURCE_IS_LANGUAGE (language), NULL);
+  g_return_val_if_fail (font_desc, NULL);
+
+  row = g_object_new (GTK_TYPE_LIST_BOX_ROW,
+                      "visible", TRUE,
+                      NULL);
+
+  scheme_id = gtk_source_style_scheme_get_id (scheme);
+  g_object_set_data_full (G_OBJECT (row), "scheme_id",
+                          g_strdup (scheme_id), g_free);
+
+  buffer = g_object_new (GTK_SOURCE_TYPE_BUFFER,
+                         "highlight-matching-brackets", FALSE,
+                         "language", language,
+                         "style-scheme", scheme,
+                         NULL);
+
+  text = g_strdup_printf ("/* %s */\n#include <gnome-builder.h>",
+                          gtk_source_style_scheme_get_name (scheme));
+  gtk_text_buffer_set_text (GTK_TEXT_BUFFER (buffer), text, -1);
+
+  view = g_object_new (GTK_SOURCE_TYPE_VIEW,
+                       "buffer", buffer,
+                       "can-focus", FALSE,
+                       "cursor-visible", FALSE,
+                       "editable", FALSE,
+                       "visible", TRUE,
+                       "show-line-numbers", TRUE,
+                       "right-margin-position", 30,
+                       "show-right-margin", TRUE,
+                       NULL);
+  gtk_widget_override_font (GTK_WIDGET (view), font_desc);
+  gtk_container_add (GTK_CONTAINER (row), GTK_WIDGET (view));
+
+  return row;
+}
+
+static void
+gb_source_style_scheme_widget_populate (GbSourceStyleSchemeWidget *widget)
+{
+  GtkSourceLanguageManager *lm;
+  GtkSourceLanguage *lang;
+  GtkSourceStyleSchemeManager *manager;
+  PangoFontDescription *font_desc;
+  const gchar * const *scheme_ids;
+  guint i;
+
+  g_assert (GB_IS_SOURCE_STYLE_SCHEME_WIDGET (widget));
+
+  manager = gtk_source_style_scheme_manager_get_default ();
+  scheme_ids = gtk_source_style_scheme_manager_get_scheme_ids (manager);
+
+  lm = gtk_source_language_manager_get_default ();
+  lang = gtk_source_language_manager_get_language (lm, "c");
+
+  font_desc = pango_font_description_from_string ("Monospace");
+
+  for (i = 0; scheme_ids [i]; i++)
+    {
+      GtkListBoxRow *row;
+      GtkSourceStyleScheme *scheme;
+
+      scheme = gtk_source_style_scheme_manager_get_scheme (manager, scheme_ids [i]);
+      row = make_row (scheme, lang, font_desc);
+      gtk_container_add (GTK_CONTAINER (widget->priv->list_box), GTK_WIDGET (row));
+    }
+
+  pango_font_description_free (font_desc);
+}
+
+static void
+gb_source_style_scheme_widget_constructed (GObject *object)
+{
+  G_OBJECT_CLASS (gb_source_style_scheme_widget_parent_class)->constructed (object);
+
+  gb_source_style_scheme_widget_populate (GB_SOURCE_STYLE_SCHEME_WIDGET (object));
+}
+
+static void
+gb_source_style_scheme_widget_get_property (GObject    *object,
+                                            guint       prop_id,
+                                            GValue     *value,
+                                            GParamSpec *pspec)
+{
+  GbSourceStyleSchemeWidget *self = GB_SOURCE_STYLE_SCHEME_WIDGET (object);
+
+  switch (prop_id)
+    {
+    case PROP_STYLE_SCHEME_NAME:
+      g_value_set_string (value,
+                          gb_source_style_scheme_widget_get_style_scheme_name (self));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+gb_source_style_scheme_widget_set_property (GObject      *object,
+                                            guint         prop_id,
+                                            const GValue *value,
+                                            GParamSpec   *pspec)
+{
+  GbSourceStyleSchemeWidget *self = GB_SOURCE_STYLE_SCHEME_WIDGET (object);
+
+  switch (prop_id)
+    {
+    case PROP_STYLE_SCHEME_NAME:
+      gb_source_style_scheme_widget_set_style_scheme_name (self,
+                                                           g_value_get_string (value));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+gb_source_style_scheme_widget_class_init (GbSourceStyleSchemeWidgetClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  object_class->constructed = gb_source_style_scheme_widget_constructed;
+  object_class->get_property = gb_source_style_scheme_widget_get_property;
+  object_class->set_property = gb_source_style_scheme_widget_set_property;
+
+  gParamSpecs [PROP_STYLE_SCHEME_NAME] =
+    g_param_spec_string ("style-scheme-name",
+                         _("Style Scheme Name"),
+                         _("The style scheme name that is selected."),
+                         NULL,
+                         (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  g_object_class_install_property (object_class, PROP_STYLE_SCHEME_NAME,
+                                   gParamSpecs [PROP_STYLE_SCHEME_NAME]);
+}
+
+static void
+gb_source_style_scheme_widget_init (GbSourceStyleSchemeWidget *self)
+{
+  self->priv = gb_source_style_scheme_widget_get_instance_private (self);
+
+  self->priv->vbox = g_object_new (GTK_TYPE_BOX,
+                                   "orientation", GTK_ORIENTATION_VERTICAL,
+                                   "spacing", 3,
+                                   "visible", TRUE,
+                                   NULL);
+  gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (self->priv->vbox));
+
+  self->priv->scroller = g_object_new (GTK_TYPE_SCROLLED_WINDOW,
+                                       "visible", TRUE,
+                                       "vexpand", TRUE,
+                                       NULL);
+  gtk_container_add (GTK_CONTAINER (self->priv->vbox),
+                     GTK_WIDGET (self->priv->scroller));
+
+  self->priv->list_box = g_object_new (GTK_TYPE_LIST_BOX,
+                                       "visible", TRUE,
+                                       NULL);
+  gtk_container_add (GTK_CONTAINER (self->priv->scroller),
+                     GTK_WIDGET (self->priv->list_box));
+}
diff --git a/src/editor/gb-source-style-scheme-widget.h b/src/editor/gb-source-style-scheme-widget.h
new file mode 100644
index 0000000..33803c9
--- /dev/null
+++ b/src/editor/gb-source-style-scheme-widget.h
@@ -0,0 +1,59 @@
+/* gb-source-style-scheme-widget.h
+ *
+ * Copyright (C) 2014 Christian Hergert <christian hergert me>
+ *
+ * This file is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GB_SOURCE_STYLE_SCHEME_WIDGET_H
+#define GB_SOURCE_STYLE_SCHEME_WIDGET_H
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define GB_TYPE_SOURCE_STYLE_SCHEME_WIDGET            (gb_source_style_scheme_widget_get_type())
+#define GB_SOURCE_STYLE_SCHEME_WIDGET(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
GB_TYPE_SOURCE_STYLE_SCHEME_WIDGET, GbSourceStyleSchemeWidget))
+#define GB_SOURCE_STYLE_SCHEME_WIDGET_CONST(obj)      (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
GB_TYPE_SOURCE_STYLE_SCHEME_WIDGET, GbSourceStyleSchemeWidget const))
+#define GB_SOURCE_STYLE_SCHEME_WIDGET_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  
GB_TYPE_SOURCE_STYLE_SCHEME_WIDGET, GbSourceStyleSchemeWidgetClass))
+#define GB_IS_SOURCE_STYLE_SCHEME_WIDGET(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), 
GB_TYPE_SOURCE_STYLE_SCHEME_WIDGET))
+#define GB_IS_SOURCE_STYLE_SCHEME_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  
GB_TYPE_SOURCE_STYLE_SCHEME_WIDGET))
+#define GB_SOURCE_STYLE_SCHEME_WIDGET_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  
GB_TYPE_SOURCE_STYLE_SCHEME_WIDGET, GbSourceStyleSchemeWidgetClass))
+
+typedef struct _GbSourceStyleSchemeWidget        GbSourceStyleSchemeWidget;
+typedef struct _GbSourceStyleSchemeWidgetClass   GbSourceStyleSchemeWidgetClass;
+typedef struct _GbSourceStyleSchemeWidgetPrivate GbSourceStyleSchemeWidgetPrivate;
+
+struct _GbSourceStyleSchemeWidget
+{
+  GtkBin parent;
+
+  /*< private >*/
+  GbSourceStyleSchemeWidgetPrivate *priv;
+};
+
+struct _GbSourceStyleSchemeWidgetClass
+{
+  GtkBinClass parent;
+};
+
+GType        gb_source_style_scheme_widget_get_type              (void);
+GtkWidget   *gb_source_style_scheme_widget_new                   (void);
+const gchar *gb_source_style_scheme_widget_get_style_scheme_name (GbSourceStyleSchemeWidget *widget);
+void         gb_source_style_scheme_widget_set_style_scheme_name (GbSourceStyleSchemeWidget *widget,
+                                                                  const gchar               
*style_scheme_name);
+
+G_END_DECLS
+
+#endif /* GB_SOURCE_STYLE_SCHEME_WIDGET_H */
diff --git a/src/gnome-builder.mk b/src/gnome-builder.mk
index 795e42c..76e1d82 100644
--- a/src/gnome-builder.mk
+++ b/src/gnome-builder.mk
@@ -71,6 +71,10 @@ libgnome_builder_la_SOURCES = \
        src/editor/gb-source-highlight-menu.h \
        src/editor/gb-source-search-highlighter.h \
        src/editor/gb-source-search-highlighter.c \
+       src/editor/gb-source-style-scheme-button.c \
+       src/editor/gb-source-style-scheme-button.h \
+       src/editor/gb-source-style-scheme-widget.c \
+       src/editor/gb-source-style-scheme-widget.h \
        src/markdown/gs-markdown.c \
        src/markdown/gs-markdown.h \
        src/markdown/gb-markdown-preview.c \


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