[gnome-builder/wip/command-bar-slider] editor: add addin type for editor view extensions



commit c140a5f1f82ac2632f340b7338d8d68be75578ba
Author: Christian Hergert <christian hergert me>
Date:   Tue Jun 16 21:47:04 2015 -0700

    editor: add addin type for editor view extensions

 src/Makefile.am                     |    2 +
 src/editor/gb-editor-view-addin.c   |   54 +++++++++++++++++++++++++++++++++
 src/editor/gb-editor-view-addin.h   |   47 +++++++++++++++++++++++++++++
 src/editor/gb-editor-view-private.h |    2 +
 src/editor/gb-editor-view.c         |   56 +++++++++++++++++++++++++++++++++++
 5 files changed, 161 insertions(+), 0 deletions(-)
---
diff --git a/src/Makefile.am b/src/Makefile.am
index 22502de..62f8db5 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -40,6 +40,8 @@ libgnome_builder_la_SOURCES = \
        editor/gb-editor-tweak-widget.h \
        editor/gb-editor-view-actions.c \
        editor/gb-editor-view-actions.h \
+       editor/gb-editor-view-addin.c \
+       editor/gb-editor-view-addin.h \
        editor/gb-editor-view-private.h \
        editor/gb-editor-view.c \
        editor/gb-editor-view.h \
diff --git a/src/editor/gb-editor-view-addin.c b/src/editor/gb-editor-view-addin.c
new file mode 100644
index 0000000..c4c2a36
--- /dev/null
+++ b/src/editor/gb-editor-view-addin.c
@@ -0,0 +1,54 @@
+/* gb-editor-view-addin.c
+ *
+ * Copyright (C) 2015 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 "gb-editor-view-addin.h"
+
+G_DEFINE_INTERFACE (GbEditorViewAddin, gb_editor_view_addin, G_TYPE_OBJECT)
+
+static void
+dummy_vfunc (GbEditorViewAddin *self,
+             GbEditorView      *view)
+{
+}
+
+static void
+gb_editor_view_addin_default_init (GbEditorViewAddinInterface *iface)
+{
+  iface->load = dummy_vfunc;
+  iface->unload = dummy_vfunc;
+}
+
+void
+gb_editor_view_addin_load (GbEditorViewAddin *self,
+                           GbEditorView      *view)
+{
+  g_return_if_fail (GB_IS_EDITOR_VIEW_ADDIN (self));
+  g_return_if_fail (GB_IS_EDITOR_VIEW (view));
+
+  GB_EDITOR_VIEW_ADDIN_GET_IFACE (self)->load (self, view);
+}
+
+void
+gb_editor_view_addin_unload (GbEditorViewAddin *self,
+                             GbEditorView      *view)
+{
+  g_return_if_fail (GB_IS_EDITOR_VIEW_ADDIN (self));
+  g_return_if_fail (GB_IS_EDITOR_VIEW (view));
+
+  GB_EDITOR_VIEW_ADDIN_GET_IFACE (self)->unload (self, view);
+}
diff --git a/src/editor/gb-editor-view-addin.h b/src/editor/gb-editor-view-addin.h
new file mode 100644
index 0000000..04916e6
--- /dev/null
+++ b/src/editor/gb-editor-view-addin.h
@@ -0,0 +1,47 @@
+/* gb-editor-view-addin.h
+ *
+ * Copyright (C) 2015 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_EDITOR_VIEW_ADDIN_H
+#define GB_EDITOR_VIEW_ADDIN_H
+
+#include "gb-editor-view.h"
+
+G_BEGIN_DECLS
+
+#define GB_TYPE_EDITOR_VIEW_ADDIN (gb_editor_view_addin_get_type ())
+
+G_DECLARE_INTERFACE (GbEditorViewAddin, gb_editor_view_addin, GB, EDITOR_VIEW_ADDIN, GObject)
+
+struct _GbEditorViewAddinInterface
+{
+  GTypeInterface parent;
+
+  void (*load)   (GbEditorViewAddin *self,
+                  GbEditorView      *view);
+  void (*unload) (GbEditorViewAddin *self,
+                  GbEditorView      *view);
+};
+
+void gb_editor_view_addin_load   (GbEditorViewAddin *self,
+                                  GbEditorView      *view);
+void gb_editor_view_addin_unload (GbEditorViewAddin *self,
+                                  GbEditorView      *view);
+
+G_END_DECLS
+
+#endif /* GB_EDITOR_VIEW_ADDIN_H */
diff --git a/src/editor/gb-editor-view-private.h b/src/editor/gb-editor-view-private.h
index ec0621b..37cabf7 100644
--- a/src/editor/gb-editor-view-private.h
+++ b/src/editor/gb-editor-view-private.h
@@ -20,6 +20,7 @@
 #define GB_EDITOR_VIEW_PRIVATE_H
 
 #include <ide.h>
+#include <libpeas/peas.h>
 
 #include "gb-editor-document.h"
 #include "gb-editor-frame.h"
@@ -33,6 +34,7 @@ struct _GbEditorView
   GbView               parent_instance;
 
   GbEditorDocument    *document;
+  PeasExtensionSet    *extensions;
   GSettings           *settings;
   IdePatternSpec      *symbol_spec;
 
diff --git a/src/editor/gb-editor-view.c b/src/editor/gb-editor-view.c
index 9897cb1..92522af 100644
--- a/src/editor/gb-editor-view.c
+++ b/src/editor/gb-editor-view.c
@@ -23,6 +23,7 @@
 #include "gb-editor-frame-private.h"
 #include "gb-editor-view.h"
 #include "gb-editor-view-actions.h"
+#include "gb-editor-view-addin.h"
 #include "gb-editor-view-private.h"
 #include "gb-widget.h"
 
@@ -631,6 +632,59 @@ gb_editor_view_get_preferred_height (GtkWidget *widget,
 }
 
 static void
+gb_editor_view__extension_added (PeasExtensionSet  *set,
+                                 PeasPluginInfo    *info,
+                                 GbEditorViewAddin *addin,
+                                 GbEditorView      *self)
+{
+  g_assert (PEAS_IS_EXTENSION_SET (set));
+  g_assert (info != NULL);
+  g_assert (GB_IS_EDITOR_VIEW_ADDIN (addin));
+  g_assert (GB_IS_EDITOR_VIEW (self));
+
+  gb_editor_view_addin_load (addin, self);
+}
+
+static void
+gb_editor_view__extension_removed (PeasExtensionSet  *set,
+                                   PeasPluginInfo    *info,
+                                   GbEditorViewAddin *addin,
+                                   GbEditorView      *self)
+{
+  g_assert (PEAS_IS_EXTENSION_SET (set));
+  g_assert (info != NULL);
+  g_assert (GB_IS_EDITOR_VIEW_ADDIN (addin));
+  g_assert (GB_IS_EDITOR_VIEW (self));
+
+  gb_editor_view_addin_unload (addin, self);
+}
+
+static void
+gb_editor_view_constructed (GObject *object)
+{
+  GbEditorView *self = (GbEditorView *)object;
+  PeasEngine *engine;
+
+  G_OBJECT_CLASS (gb_editor_view_parent_class)->constructed (object);
+
+  engine = peas_engine_get_default ();
+  self->extensions = peas_extension_set_new (engine, GB_TYPE_EDITOR_VIEW_ADDIN, NULL);
+  g_signal_connect_object (self->extensions,
+                           "extension-added",
+                           G_CALLBACK (gb_editor_view__extension_added),
+                           self,
+                           G_CONNECT_SWAPPED);
+  g_signal_connect_object (self->extensions,
+                           "extension-added",
+                           G_CALLBACK (gb_editor_view__extension_removed),
+                           self,
+                           G_CONNECT_SWAPPED);
+  peas_extension_set_foreach (self->extensions,
+                              (PeasExtensionSetForeachFunc)gb_editor_view__extension_added,
+                              self);
+}
+
+static void
 gb_editor_view_finalize (GObject *object)
 {
   GbEditorView *self = (GbEditorView *)object;
@@ -641,6 +695,7 @@ gb_editor_view_finalize (GObject *object)
       self->symbol_timeout = 0;
     }
 
+  g_clear_object (&self->extensions);
   g_clear_object (&self->document);
   g_clear_object (&self->settings);
   g_clear_pointer (&self->symbol_spec, ide_pattern_spec_unref);
@@ -693,6 +748,7 @@ gb_editor_view_class_init (GbEditorViewClass *klass)
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
   GbViewClass *view_class = GB_VIEW_CLASS (klass);
 
+  object_class->constructed = gb_editor_view_constructed;
   object_class->finalize = gb_editor_view_finalize;
   object_class->get_property = gb_editor_view_get_property;
   object_class->set_property = gb_editor_view_set_property;


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