[gnome-builder/editor-layout] start on gutter for code assistant abstraction



commit acec204e7564d8c7b256108dc86509e0a146caba
Author: Christian Hergert <christian hergert me>
Date:   Sat Nov 29 00:09:33 2014 -0800

    start on gutter for code assistant abstraction

 .../gb-source-code-assistant-renderer.c            |  202 ++++++++++++++++++++
 .../gb-source-code-assistant-renderer.h            |   55 ++++++
 src/editor/gb-editor-frame.c                       |   75 ++++++--
 src/gnome-builder.mk                               |    2 +
 4 files changed, 316 insertions(+), 18 deletions(-)
---
diff --git a/src/code-assistant/gb-source-code-assistant-renderer.c 
b/src/code-assistant/gb-source-code-assistant-renderer.c
new file mode 100644
index 0000000..3144384
--- /dev/null
+++ b/src/code-assistant/gb-source-code-assistant-renderer.c
@@ -0,0 +1,202 @@
+/* gb-source-code-assistant-renderer.c
+ *
+ * Copyright (C) 2014 Christian Hergert <christian hergert me>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 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-code-assistant.h"
+#include "gb-source-code-assistant-renderer.h"
+
+struct _GbSourceCodeAssistantRendererPrivate
+{
+  GbSourceCodeAssistant *code_assistant;
+  GArray                *diagnostics;
+  gulong                 changed_handler;
+};
+
+enum
+{
+  PROP_0,
+  PROP_CODE_ASSISTANT,
+  LAST_PROP
+};
+
+G_DEFINE_TYPE_WITH_PRIVATE (GbSourceCodeAssistantRenderer,
+                            gb_source_code_assistant_renderer,
+                            GTK_SOURCE_TYPE_GUTTER_RENDERER_PIXBUF)
+
+static GParamSpec *gParamSpecs [LAST_PROP];
+
+GbSourceCodeAssistant *
+gb_source_code_assistant_renderer_get_code_assistant (GbSourceCodeAssistantRenderer *renderer)
+{
+  g_return_val_if_fail (GB_IS_SOURCE_CODE_ASSISTANT_RENDERER (renderer), NULL);
+
+  return renderer->priv->code_assistant;
+}
+
+static void
+gb_source_code_assistant_renderer_changed (GbSourceCodeAssistantRenderer *renderer,
+                                           GbSourceCodeAssistant         *code_assistant)
+{
+  GbSourceCodeAssistantRendererPrivate *priv;
+
+  g_return_if_fail (GB_IS_SOURCE_CODE_ASSISTANT_RENDERER (renderer));
+  g_return_if_fail (GB_IS_SOURCE_CODE_ASSISTANT (code_assistant));
+
+  priv = renderer->priv;
+
+  if (priv->diagnostics)
+    {
+      g_array_unref (priv->diagnostics);
+      priv->diagnostics = NULL;
+    }
+
+  priv->diagnostics = gb_source_code_assistant_get_diagnostics (code_assistant);
+
+  gtk_source_gutter_renderer_queue_draw (GTK_SOURCE_GUTTER_RENDERER (renderer));
+}
+
+static void
+gb_source_code_assistant_renderer_connect (GbSourceCodeAssistantRenderer *renderer)
+{
+  g_return_if_fail (GB_IS_SOURCE_CODE_ASSISTANT_RENDERER (renderer));
+
+  renderer->priv->changed_handler =
+    g_signal_connect_object (renderer->priv->code_assistant,
+                             "changed",
+                             G_CALLBACK (gb_source_code_assistant_renderer_changed),
+                             renderer,
+                             G_CONNECT_SWAPPED);
+}
+
+static void
+gb_source_code_assistant_renderer_disconnect (GbSourceCodeAssistantRenderer *renderer)
+{
+  g_return_if_fail (GB_IS_SOURCE_CODE_ASSISTANT_RENDERER (renderer));
+
+  g_signal_handler_disconnect (renderer->priv->code_assistant,
+                               renderer->priv->changed_handler);
+  renderer->priv->code_assistant = 0;
+}
+
+void
+gb_source_code_assistant_renderer_set_code_assistant (GbSourceCodeAssistantRenderer *renderer,
+                                                      GbSourceCodeAssistant         *code_assistant)
+{
+  GbSourceCodeAssistantRendererPrivate *priv;
+
+  g_return_if_fail (GB_IS_SOURCE_CODE_ASSISTANT_RENDERER (renderer));
+  g_return_if_fail (!code_assistant || GB_IS_SOURCE_CODE_ASSISTANT (code_assistant));
+
+  priv = renderer->priv;
+
+  if (code_assistant != priv->code_assistant)
+    {
+      if (priv->code_assistant)
+        {
+          gb_source_code_assistant_renderer_disconnect (renderer);
+          g_clear_object (&priv->code_assistant);
+        }
+
+      if (code_assistant)
+        {
+          priv->code_assistant = g_object_ref (code_assistant);
+          gb_source_code_assistant_renderer_connect (renderer);
+        }
+
+      gtk_source_gutter_renderer_queue_draw (GTK_SOURCE_GUTTER_RENDERER (renderer));
+
+      g_object_notify_by_pspec (G_OBJECT (renderer),
+                                gParamSpecs [PROP_CODE_ASSISTANT]);
+    }
+}
+
+static void
+gb_source_code_assistant_renderer_finalize (GObject *object)
+{
+  GbSourceCodeAssistantRendererPrivate *priv;
+
+  priv = GB_SOURCE_CODE_ASSISTANT_RENDERER (object)->priv;
+
+  g_clear_object (&priv->code_assistant);
+
+  G_OBJECT_CLASS (gb_source_code_assistant_renderer_parent_class)->finalize (object);
+}
+
+static void
+gb_source_code_assistant_renderer_get_property (GObject    *object,
+                                                guint       prop_id,
+                                                GValue     *value,
+                                                GParamSpec *pspec)
+{
+  GbSourceCodeAssistantRenderer *self = GB_SOURCE_CODE_ASSISTANT_RENDERER (object);
+
+  switch (prop_id)
+    {
+    case PROP_CODE_ASSISTANT:
+      g_value_set_object (value, gb_source_code_assistant_renderer_get_code_assistant (self));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+gb_source_code_assistant_renderer_set_property (GObject      *object,
+                                                guint         prop_id,
+                                                const GValue *value,
+                                                GParamSpec   *pspec)
+{
+  GbSourceCodeAssistantRenderer *self = GB_SOURCE_CODE_ASSISTANT_RENDERER (object);
+
+  switch (prop_id)
+    {
+    case PROP_CODE_ASSISTANT:
+      gb_source_code_assistant_renderer_set_code_assistant (self, g_value_get_object (value));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+gb_source_code_assistant_renderer_class_init (GbSourceCodeAssistantRendererClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  object_class->finalize = gb_source_code_assistant_renderer_finalize;
+  object_class->get_property = gb_source_code_assistant_renderer_get_property;
+  object_class->set_property = gb_source_code_assistant_renderer_set_property;
+
+  gParamSpecs [PROP_CODE_ASSISTANT] =
+    g_param_spec_object ("code-assistant",
+                         _("Code Assistant"),
+                         _("The code assistant to render."),
+                         GB_TYPE_SOURCE_CODE_ASSISTANT,
+                         (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  g_object_class_install_property (object_class, PROP_CODE_ASSISTANT,
+                                   gParamSpecs [PROP_CODE_ASSISTANT]);
+}
+
+static void
+gb_source_code_assistant_renderer_init (GbSourceCodeAssistantRenderer *renderer)
+{
+  renderer->priv = gb_source_code_assistant_renderer_get_instance_private (renderer);
+}
diff --git a/src/code-assistant/gb-source-code-assistant-renderer.h 
b/src/code-assistant/gb-source-code-assistant-renderer.h
new file mode 100644
index 0000000..5114cc7
--- /dev/null
+++ b/src/code-assistant/gb-source-code-assistant-renderer.h
@@ -0,0 +1,55 @@
+/* gb-source-code-assistant-renderer.h
+ *
+ * Copyright (C) 2014 Christian Hergert <christian hergert me>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 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_CODE_ASSISTANT_RENDERER_H
+#define GB_SOURCE_CODE_ASSISTANT_RENDERER_H
+
+#include <gtksourceview/gtksource.h>
+
+G_BEGIN_DECLS
+
+#define GB_TYPE_SOURCE_CODE_ASSISTANT_RENDERER            (gb_source_code_assistant_renderer_get_type())
+#define GB_SOURCE_CODE_ASSISTANT_RENDERER(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
GB_TYPE_SOURCE_CODE_ASSISTANT_RENDERER, GbSourceCodeAssistantRenderer))
+#define GB_SOURCE_CODE_ASSISTANT_RENDERER_CONST(obj)      (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
GB_TYPE_SOURCE_CODE_ASSISTANT_RENDERER, GbSourceCodeAssistantRenderer const))
+#define GB_SOURCE_CODE_ASSISTANT_RENDERER_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  
GB_TYPE_SOURCE_CODE_ASSISTANT_RENDERER, GbSourceCodeAssistantRendererClass))
+#define GB_IS_SOURCE_CODE_ASSISTANT_RENDERER(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), 
GB_TYPE_SOURCE_CODE_ASSISTANT_RENDERER))
+#define GB_IS_SOURCE_CODE_ASSISTANT_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  
GB_TYPE_SOURCE_CODE_ASSISTANT_RENDERER))
+#define GB_SOURCE_CODE_ASSISTANT_RENDERER_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  
GB_TYPE_SOURCE_CODE_ASSISTANT_RENDERER, GbSourceCodeAssistantRendererClass))
+
+typedef struct _GbSourceCodeAssistantRenderer        GbSourceCodeAssistantRenderer;
+typedef struct _GbSourceCodeAssistantRendererClass   GbSourceCodeAssistantRendererClass;
+typedef struct _GbSourceCodeAssistantRendererPrivate GbSourceCodeAssistantRendererPrivate;
+
+struct _GbSourceCodeAssistantRenderer
+{
+  GtkSourceGutterRendererPixbuf parent;
+
+  /*< private >*/
+  GbSourceCodeAssistantRendererPrivate *priv;
+};
+
+struct _GbSourceCodeAssistantRendererClass
+{
+  GtkSourceGutterRendererPixbufClass parent_class;
+};
+
+GType gb_source_code_assistant_renderer_get_type (void) G_GNUC_CONST;
+
+G_END_DECLS
+
+#endif /* GB_SOURCE_CODE_ASSISTANT_RENDERER_H */
diff --git a/src/editor/gb-editor-frame.c b/src/editor/gb-editor-frame.c
index 50da2bf..6f62626 100644
--- a/src/editor/gb-editor-frame.c
+++ b/src/editor/gb-editor-frame.c
@@ -23,6 +23,7 @@
 #include "gb-editor-frame.h"
 #include "gb-log.h"
 #include "gb-source-change-gutter-renderer.h"
+#include "gb-source-code-assistant-renderer.h"
 #include "gb-source-search-highlighter.h"
 #include "gb-source-view.h"
 #include "gd-tagged-entry.h"
@@ -31,25 +32,26 @@
 struct _GbEditorFramePrivate
 {
   /* Widgets owned by GtkBuilder */
-  GtkSpinner                   *busy_spinner;
-  GbSourceChangeGutterRenderer *diff_renderer;
-  NautilusFloatingBar          *floating_bar;
-  GtkButton                    *forward_search;
-  GtkButton                    *backward_search;
-  GtkScrolledWindow            *scrolled_window;
-  GtkRevealer                  *search_revealer;
-  GdTaggedEntry                *search_entry;
-  GdTaggedEntryTag             *search_entry_tag;
-  GbSourceView                 *source_view;
+  GtkSpinner                    *busy_spinner;
+  GbSourceChangeGutterRenderer  *diff_renderer;
+  GbSourceCodeAssistantRenderer *code_assistant_renderer;
+  NautilusFloatingBar           *floating_bar;
+  GtkButton                     *forward_search;
+  GtkButton                     *backward_search;
+  GtkScrolledWindow             *scrolled_window;
+  GtkRevealer                   *search_revealer;
+  GdTaggedEntry                 *search_entry;
+  GdTaggedEntryTag              *search_entry_tag;
+  GbSourceView                  *source_view;
 
   /* Objects owned by GbEditorFrame */
-  GbEditorDocument             *document;
-  GtkSourceSearchContext       *search_context;
-  GtkSourceSearchSettings      *search_settings;
-  GbSourceSearchHighlighter    *search_highlighter;
+  GbEditorDocument              *document;
+  GtkSourceSearchContext        *search_context;
+  GtkSourceSearchSettings       *search_settings;
+  GbSourceSearchHighlighter     *search_highlighter;
 
   /* Signal handler identifiers */
-  gulong                        cursor_moved_handler;
+  gulong                         cursor_moved_handler;
 };
 
 G_DEFINE_TYPE_WITH_PRIVATE (GbEditorFrame, gb_editor_frame, GTK_TYPE_OVERLAY)
@@ -242,6 +244,7 @@ gb_editor_frame_connect (GbEditorFrame    *frame,
 {
   GbEditorFramePrivate *priv;
   GbSourceChangeMonitor *monitor;
+  GbSourceCodeAssistant *code_assistant;
 
   ENTRY;
 
@@ -251,31 +254,48 @@ gb_editor_frame_connect (GbEditorFrame    *frame,
 
   priv = frame->priv;
 
+  /*
+   * Save the document for later.
+   */
   priv->document = g_object_ref (document);
-
   gtk_text_view_set_buffer (GTK_TEXT_VIEW (priv->source_view),
                             GTK_TEXT_BUFFER (priv->document));
 
+  /*
+   * Connect change monitor to gutter.
+   */
   monitor = gb_editor_document_get_change_monitor (document);
   g_object_set (priv->diff_renderer,
                 "change-monitor", monitor,
                 NULL);
 
+  /*
+   * Connect code assistance to gutter.
+   */
+  code_assistant = gb_editor_document_get_code_assistant (document);
+  g_object_set (priv->code_assistant_renderer,
+                "code-assistant", code_assistant,
+                NULL);
+
+  /*
+   * Create search defaults for this frame.
+   */
   priv->search_settings = g_object_new (GTK_SOURCE_TYPE_SEARCH_SETTINGS,
                                         NULL);
-
   priv->search_context = g_object_new (GTK_SOURCE_TYPE_SEARCH_CONTEXT,
                                        "buffer", priv->document,
                                        "settings", priv->search_settings,
                                        "highlight", TRUE,
                                        NULL);
-
   priv->search_highlighter =
     g_object_new (GB_TYPE_SOURCE_SEARCH_HIGHLIGHTER,
                   "search-context", priv->search_context,
                   "search-settings", priv->search_settings,
                   NULL);
 
+  /*
+   * Connect to cursor-moved signal to update cursor position label.
+   */
   if (GB_IS_EDITOR_DOCUMENT (priv->document))
     {
       priv->cursor_moved_handler =
@@ -310,6 +330,14 @@ gb_editor_frame_disconnect (GbEditorFrame *frame)
       priv->cursor_moved_handler = 0;
     }
 
+  g_object_set (priv->diff_renderer,
+                "change-monitor", NULL,
+                NULL);
+
+  g_object_set (priv->code_assistant_renderer,
+                "code-assistant", NULL,
+                NULL);
+
   g_clear_object (&priv->document);
   g_clear_object (&priv->search_settings);
   g_clear_object (&priv->search_context);
@@ -494,6 +522,7 @@ gb_editor_frame_constructed (GObject *object)
 
   gutter = gtk_source_view_get_gutter (GTK_SOURCE_VIEW (priv->source_view),
                                        GTK_TEXT_WINDOW_LEFT);
+
   priv->diff_renderer = g_object_new (GB_TYPE_SOURCE_CHANGE_GUTTER_RENDERER,
                                       "change-monitor", monitor,
                                       "size", 2,
@@ -504,6 +533,16 @@ gb_editor_frame_constructed (GObject *object)
                             GTK_SOURCE_GUTTER_RENDERER (priv->diff_renderer),
                             0);
 
+  priv->code_assistant_renderer =
+    g_object_new (GB_TYPE_SOURCE_CODE_ASSISTANT_RENDERER,
+                  "code-assistant", NULL,
+                  "size", 16,
+                  "visible", TRUE,
+                  NULL);
+  gtk_source_gutter_insert (gutter,
+                            GTK_SOURCE_GUTTER_RENDERER (priv->code_assistant_renderer),
+                            -50);
+
   g_signal_connect_object (priv->source_view,
                            "focus-in-event",
                            G_CALLBACK (gb_editor_frame_on_focus_in_event),
diff --git a/src/gnome-builder.mk b/src/gnome-builder.mk
index 2688c5b..9a47aa6 100644
--- a/src/gnome-builder.mk
+++ b/src/gnome-builder.mk
@@ -19,6 +19,8 @@ libgnome_builder_la_SOURCES = \
        src/auto-indent/gb-source-auto-indenter-xml.h \
        src/code-assistant/gb-source-code-assistant.h \
        src/code-assistant/gb-source-code-assistant.c \
+       src/code-assistant/gb-source-code-assistant-renderer.c \
+       src/code-assistant/gb-source-code-assistant-renderer.h \
        src/commands/gb-command.c \
        src/commands/gb-command.h \
        src/commands/gb-command-bar.c \


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