[gnome-builder/editor-layout] start on gutter for code assistant abstraction
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder/editor-layout] start on gutter for code assistant abstraction
- Date: Sat, 29 Nov 2014 08:09:41 +0000 (UTC)
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]