[gnome-builder] libide/sourceview: use IdeExtensionAdapter for indenter



commit 000190b40f8b9b3c306729717f4feb9dad164c5a
Author: Christian Hergert <chergert redhat com>
Date:   Sat Jul 23 15:43:42 2022 -0700

    libide/sourceview: use IdeExtensionAdapter for indenter
    
    We only want one indenter, and for it to be prioritized by plugin
    priority metadata.

 src/libide/sourceview/ide-source-view-addins.c  | 87 +++++++------------------
 src/libide/sourceview/ide-source-view-private.h |  2 +-
 src/libide/sourceview/ide-source-view.c         |  2 +-
 3 files changed, 26 insertions(+), 65 deletions(-)
---
diff --git a/src/libide/sourceview/ide-source-view-addins.c b/src/libide/sourceview/ide-source-view-addins.c
index af408bd7d..c6140cfea 100644
--- a/src/libide/sourceview/ide-source-view-addins.c
+++ b/src/libide/sourceview/ide-source-view-addins.c
@@ -135,54 +135,21 @@ ide_source_view_hover_provider_removed_cb (IdeExtensionSetAdapter *adapter,
 }
 
 static void
-ide_source_view_indenter_added_cb (IdeExtensionSetAdapter *adapter,
-                                   PeasPluginInfo         *plugin_info,
-                                   PeasExtension          *exten,
-                                   gpointer                user_data)
+on_indenter_extension_changed_cb (IdeSourceView       *self,
+                                  GParamSpec          *pspec,
+                                  IdeExtensionAdapter *adapter)
 {
-  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;
+  PeasExtension *indenter;
 
   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_MAIN_THREAD ());
   g_assert (IDE_IS_SOURCE_VIEW (self));
+  g_assert (IDE_IS_EXTENSION_ADAPTER (adapter));
 
-  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);
+  indenter = ide_extension_adapter_get_extension (adapter);
+  gtk_source_view_set_indenter (GTK_SOURCE_VIEW (self),
+                                GTK_SOURCE_INDENTER (indenter));
 
   IDE_EXIT;
 }
@@ -248,24 +215,18 @@ _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);
+  /* Create our indenter and attach it */
+  self->indenter =
+    ide_extension_adapter_new (IDE_OBJECT (parent),
+                               peas_engine_get_default (),
+                               GTK_SOURCE_TYPE_INDENTER,
+                               "Indenter-Languages",
+                               language_id);
+  g_signal_connect_swapped (self->indenter,
+                            "notify::extension",
+                            G_CALLBACK (on_indenter_extension_changed_cb),
+                            self);
+  on_indenter_extension_changed_cb (self, NULL, self->indenter);
 
   IDE_EXIT;
 }
@@ -279,7 +240,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_clear_and_destroy_object (&self->indenter);
 
   IDE_EXIT;
 }
@@ -296,7 +257,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);
+  g_return_if_fail (self->indenter != NULL);
 
   if (language != NULL)
     language_id = gtk_source_language_get_id (language);
@@ -305,7 +266,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_extension_adapter_set_value (self->indenter, 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 aa33c12d4..d1699a2a7 100644
--- a/src/libide/sourceview/ide-source-view-private.h
+++ b/src/libide/sourceview/ide-source-view-private.h
@@ -61,7 +61,7 @@ struct _IdeSourceView
    */
   IdeExtensionSetAdapter *completion_providers;
   IdeExtensionSetAdapter *hover_providers;
-  IdeExtensionSetAdapter *indenters;
+  IdeExtensionAdapter *indenter;
 
   /* 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 3fd77271c..f3d45d10c 100644
--- a/src/libide/sourceview/ide-source-view.c
+++ b/src/libide/sourceview/ide-source-view.c
@@ -671,7 +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_assert (self->indenter == 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]