[gnome-builder] libide/sourceview: Add extension set for indenters



commit 74708e9ea4c3a18618777f63753f351e7aa0e242
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Sat Jul 23 17:44:36 2022 -0300

    libide/sourceview: Add extension set for indenters
    
    It operates pretty much exactly like the hover and completion
    providers.

 src/libide/sourceview/ide-source-view-addins.c  | 75 +++++++++++++++++++++++++
 src/libide/sourceview/ide-source-view-private.h |  1 +
 src/libide/sourceview/ide-source-view.c         |  1 +
 3 files changed, 77 insertions(+)
---
diff --git a/src/libide/sourceview/ide-source-view-addins.c b/src/libide/sourceview/ide-source-view-addins.c
index e5124cdc2..af408bd7d 100644
--- a/src/libide/sourceview/ide-source-view-addins.c
+++ b/src/libide/sourceview/ide-source-view-addins.c
@@ -134,6 +134,59 @@ ide_source_view_hover_provider_removed_cb (IdeExtensionSetAdapter *adapter,
   IDE_EXIT;
 }
 
+static void
+ide_source_view_indenter_added_cb (IdeExtensionSetAdapter *adapter,
+                                   PeasPluginInfo         *plugin_info,
+                                   PeasExtension          *exten,
+                                   gpointer                user_data)
+{
+  GtkSourceIndenter *indenter = (GtkSourceIndenter *)exten;
+  IdeSourceView *self = user_data;
+
+  IDE_ENTRY;
+
+  g_assert (IDE_IS_EXTENSION_SET_ADAPTER (adapter));
+  g_assert (plugin_info != NULL);
+  g_assert (GTK_SOURCE_IS_INDENTER (indenter));
+  g_assert (IDE_IS_SOURCE_VIEW (self));
+
+  g_debug ("Adding indenter %s from module %s",
+           G_OBJECT_TYPE_NAME (indenter),
+           peas_plugin_info_get_module_name (plugin_info));
+
+  // TODO: how to handle multiple indenters?
+  gtk_source_view_set_indenter (GTK_SOURCE_VIEW (self), indenter);
+
+  IDE_EXIT;
+}
+
+static void
+ide_source_view_indenter_removed_cb (IdeExtensionSetAdapter *adapter,
+                                     PeasPluginInfo         *plugin_info,
+                                     PeasExtension          *exten,
+                                     gpointer                user_data)
+{
+  GtkSourceIndenter *indenter = (GtkSourceIndenter *)exten;
+  IdeSourceView *self = user_data;
+
+  IDE_ENTRY;
+
+  g_assert (IDE_IS_EXTENSION_SET_ADAPTER (adapter));
+  g_assert (plugin_info != NULL);
+  g_assert (GTK_SOURCE_IS_INDENTER (indenter));
+  g_assert (IDE_IS_SOURCE_VIEW (self));
+
+  g_debug ("Removing indenter %s from module %s",
+           G_OBJECT_TYPE_NAME (indenter),
+           peas_plugin_info_get_module_name (plugin_info));
+
+  // TODO: how to handle multiple indenters?
+  if (indenter == gtk_source_view_get_indenter (GTK_SOURCE_VIEW (self)))
+    gtk_source_view_set_indenter (GTK_SOURCE_VIEW (self), NULL);
+
+  IDE_EXIT;
+}
+
 void
 _ide_source_view_addins_init (IdeSourceView     *self,
                               GtkSourceLanguage *language)
@@ -195,6 +248,25 @@ _ide_source_view_addins_init (IdeSourceView     *self,
                                      ide_source_view_hover_provider_added_cb,
                                      self);
 
+  /* Create our hover providers and attach them */
+  self->indenters =
+    ide_extension_set_adapter_new (IDE_OBJECT (parent),
+                                   peas_engine_get_default (),
+                                   GTK_SOURCE_TYPE_INDENTER,
+                                   "Indenter-Languages",
+                                   language_id);
+  g_signal_connect (self->indenters,
+                    "extension-added",
+                    G_CALLBACK (ide_source_view_indenter_added_cb),
+                    self);
+  g_signal_connect (self->indenters,
+                    "extension-removed",
+                    G_CALLBACK (ide_source_view_indenter_removed_cb),
+                    self);
+  ide_extension_set_adapter_foreach (self->indenters,
+                                     ide_source_view_indenter_added_cb,
+                                     self);
+
   IDE_EXIT;
 }
 
@@ -207,6 +279,7 @@ _ide_source_view_addins_shutdown (IdeSourceView *self)
 
   ide_clear_and_destroy_object (&self->completion_providers);
   ide_clear_and_destroy_object (&self->hover_providers);
+  ide_clear_and_destroy_object (&self->indenters);
 
   IDE_EXIT;
 }
@@ -223,6 +296,7 @@ _ide_source_view_addins_set_language (IdeSourceView     *self,
   g_return_if_fail (!language || GTK_SOURCE_IS_LANGUAGE (language));
   g_return_if_fail (self->completion_providers != NULL);
   g_return_if_fail (self->hover_providers != NULL);
+  g_return_if_fail (self->indenters != NULL);
 
   if (language != NULL)
     language_id = gtk_source_language_get_id (language);
@@ -231,6 +305,7 @@ _ide_source_view_addins_set_language (IdeSourceView     *self,
 
   ide_extension_set_adapter_set_value (self->completion_providers, language_id);
   ide_extension_set_adapter_set_value (self->hover_providers, language_id);
+  ide_extension_set_adapter_set_value (self->indenters, language_id);
 
   IDE_EXIT;
 }
diff --git a/src/libide/sourceview/ide-source-view-private.h b/src/libide/sourceview/ide-source-view-private.h
index 07cffe69b..aa33c12d4 100644
--- a/src/libide/sourceview/ide-source-view-private.h
+++ b/src/libide/sourceview/ide-source-view-private.h
@@ -61,6 +61,7 @@ struct _IdeSourceView
    */
   IdeExtensionSetAdapter *completion_providers;
   IdeExtensionSetAdapter *hover_providers;
+  IdeExtensionSetAdapter *indenters;
 
   /* Mouse click position */
   double click_x;
diff --git a/src/libide/sourceview/ide-source-view.c b/src/libide/sourceview/ide-source-view.c
index bfeab5a6f..3fd77271c 100644
--- a/src/libide/sourceview/ide-source-view.c
+++ b/src/libide/sourceview/ide-source-view.c
@@ -671,6 +671,7 @@ ide_source_view_dispose (GObject *object)
 
   g_assert (self->completion_providers == NULL);
   g_assert (self->hover_providers == NULL);
+  g_assert (self->indenters == NULL);
 
   G_OBJECT_CLASS (ide_source_view_parent_class)->dispose (object);
 


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