[gnome-builder] libide/gui: auto-connect workbench addin action groups



commit 449df62c533d4a02d19f3e47c13bbdc9e44936ed
Author: Christian Hergert <chergert redhat com>
Date:   Thu Jul 28 00:53:10 2022 -0700

    libide/gui: auto-connect workbench addin action groups
    
    This will allow workbench addins to use the action mixin and have those
    auto connected to the context action group.

 src/libide/gui/ide-workbench-addin.c | 23 +++++++++
 src/libide/gui/ide-workbench-addin.h | 93 +++++++++++++++++++-----------------
 src/libide/gui/ide-workbench.c       | 10 ++++
 3 files changed, 81 insertions(+), 45 deletions(-)
---
diff --git a/src/libide/gui/ide-workbench-addin.c b/src/libide/gui/ide-workbench-addin.c
index 8b0ba2ce9..59fc5a837 100644
--- a/src/libide/gui/ide-workbench-addin.c
+++ b/src/libide/gui/ide-workbench-addin.c
@@ -324,3 +324,26 @@ ide_workbench_addin_project_loaded (IdeWorkbenchAddin *self,
   if (IDE_WORKBENCH_ADDIN_GET_IFACE (self)->project_loaded)
     IDE_WORKBENCH_ADDIN_GET_IFACE (self)->project_loaded (self, project_info);
 }
+
+/**
+ * ide_workbench_addin_ref_action_group:
+ * @self: a #IdeWorkbenchAddin
+ *
+ * Gets the action group for the addin.
+ *
+ * If provided, the action group will be registered for the addin at
+ * "context.workbench.module-name" where "module-name" is replaced with the
+ * module-name of the plugin.
+ *
+ * Returns: (transfer full) (nullable): a #GActionGroup or %NULL
+ */
+GActionGroup *
+ide_workbench_addin_ref_action_group (IdeWorkbenchAddin *self)
+{
+  g_return_val_if_fail (IDE_IS_WORKBENCH_ADDIN (self), NULL);
+
+  if (IDE_WORKBENCH_ADDIN_GET_IFACE (self)->ref_action_group)
+    return IDE_WORKBENCH_ADDIN_GET_IFACE (self)->ref_action_group (self);
+
+  return NULL;
+}
diff --git a/src/libide/gui/ide-workbench-addin.h b/src/libide/gui/ide-workbench-addin.h
index 971380058..b1ff19fbd 100644
--- a/src/libide/gui/ide-workbench-addin.h
+++ b/src/libide/gui/ide-workbench-addin.h
@@ -39,51 +39,52 @@ struct _IdeWorkbenchAddinInterface
 {
   GTypeInterface parent;
 
-  void     (*load)                  (IdeWorkbenchAddin     *self,
-                                     IdeWorkbench          *workbench);
-  void     (*unload)                (IdeWorkbenchAddin     *self,
-                                     IdeWorkbench          *workbench);
-  void     (*load_project_async)    (IdeWorkbenchAddin     *self,
-                                     IdeProjectInfo        *project_info,
-                                     GCancellable          *cancellable,
-                                     GAsyncReadyCallback    callback,
-                                     gpointer               user_data);
-  gboolean (*load_project_finish)   (IdeWorkbenchAddin     *self,
-                                     GAsyncResult          *result,
-                                     GError               **error);
-  void     (*unload_project_async)  (IdeWorkbenchAddin     *self,
-                                     IdeProjectInfo        *project_info,
-                                     GCancellable          *cancellable,
-                                     GAsyncReadyCallback    callback,
-                                     gpointer               user_data);
-  gboolean (*unload_project_finish) (IdeWorkbenchAddin     *self,
-                                     GAsyncResult          *result,
-                                     GError               **error);
-  void     (*project_loaded)        (IdeWorkbenchAddin     *self,
-                                     IdeProjectInfo        *project_info);
-  void     (*workspace_added)       (IdeWorkbenchAddin     *self,
-                                     IdeWorkspace          *workspace);
-  void     (*workspace_removed)     (IdeWorkbenchAddin     *self,
-                                     IdeWorkspace          *workspace);
-  gboolean (*can_open)              (IdeWorkbenchAddin     *self,
-                                     GFile                 *file,
-                                     const gchar           *content_type,
-                                     gint                  *priority);
-  void     (*open_async)            (IdeWorkbenchAddin     *self,
-                                     GFile                 *file,
-                                     const gchar           *content_type,
-                                     int                    at_line,
-                                     int                    at_line_offset,
-                                     IdeBufferOpenFlags     flags,
-                                     IdePanelPosition      *position,
-                                     GCancellable          *cancellable,
-                                     GAsyncReadyCallback    callback,
-                                     gpointer               user_data);
-  gboolean (*open_finish)           (IdeWorkbenchAddin     *self,
-                                     GAsyncResult          *result,
-                                     GError               **error);
-  void     (*vcs_changed)           (IdeWorkbenchAddin     *self,
-                                     IdeVcs                *vcs);
+  void          (*load)                  (IdeWorkbenchAddin     *self,
+                                          IdeWorkbench          *workbench);
+  void          (*unload)                (IdeWorkbenchAddin     *self,
+                                          IdeWorkbench          *workbench);
+  void          (*load_project_async)    (IdeWorkbenchAddin     *self,
+                                          IdeProjectInfo        *project_info,
+                                          GCancellable          *cancellable,
+                                          GAsyncReadyCallback    callback,
+                                          gpointer               user_data);
+  gboolean      (*load_project_finish)   (IdeWorkbenchAddin     *self,
+                                          GAsyncResult          *result,
+                                          GError               **error);
+  void          (*unload_project_async)  (IdeWorkbenchAddin     *self,
+                                          IdeProjectInfo        *project_info,
+                                          GCancellable          *cancellable,
+                                          GAsyncReadyCallback    callback,
+                                          gpointer               user_data);
+  gboolean      (*unload_project_finish) (IdeWorkbenchAddin     *self,
+                                          GAsyncResult          *result,
+                                          GError               **error);
+  void          (*project_loaded)        (IdeWorkbenchAddin     *self,
+                                          IdeProjectInfo        *project_info);
+  void          (*workspace_added)       (IdeWorkbenchAddin     *self,
+                                          IdeWorkspace          *workspace);
+  void          (*workspace_removed)     (IdeWorkbenchAddin     *self,
+                                          IdeWorkspace          *workspace);
+  gboolean      (*can_open)              (IdeWorkbenchAddin     *self,
+                                          GFile                 *file,
+                                          const gchar           *content_type,
+                                          gint                  *priority);
+  void          (*open_async)            (IdeWorkbenchAddin     *self,
+                                          GFile                 *file,
+                                          const gchar           *content_type,
+                                          int                    at_line,
+                                          int                    at_line_offset,
+                                          IdeBufferOpenFlags     flags,
+                                          IdePanelPosition      *position,
+                                          GCancellable          *cancellable,
+                                          GAsyncReadyCallback    callback,
+                                          gpointer               user_data);
+  gboolean      (*open_finish)           (IdeWorkbenchAddin     *self,
+                                          GAsyncResult          *result,
+                                          GError               **error);
+  void          (*vcs_changed)           (IdeWorkbenchAddin     *self,
+                                          IdeVcs                *vcs);
+  GActionGroup *(*ref_action_group)      (IdeWorkbenchAddin     *self);
 };
 
 IDE_AVAILABLE_IN_ALL
@@ -145,6 +146,8 @@ IDE_AVAILABLE_IN_ALL
 void               ide_workbench_addin_vcs_changed           (IdeWorkbenchAddin    *self,
                                                               IdeVcs               *vcs);
 IDE_AVAILABLE_IN_ALL
+GActionGroup      *ide_workbench_addin_ref_action_group      (IdeWorkbenchAddin    *self);
+IDE_AVAILABLE_IN_ALL
 IdeWorkbenchAddin *ide_workbench_addin_find_by_module_name   (IdeWorkbench         *workbench,
                                                               const gchar          *module_name);
 
diff --git a/src/libide/gui/ide-workbench.c b/src/libide/gui/ide-workbench.c
index c85039080..d605dc85b 100644
--- a/src/libide/gui/ide-workbench.c
+++ b/src/libide/gui/ide-workbench.c
@@ -253,6 +253,7 @@ ide_workbench_addin_added_cb (PeasExtensionSet *set,
 {
   IdeWorkbench *self = user_data;
   IdeWorkbenchAddin *addin = (IdeWorkbenchAddin *)exten;
+  GActionGroup *action_group;
 
   g_assert (PEAS_IS_EXTENSION_SET (set));
   g_assert (plugin_info != NULL);
@@ -261,6 +262,15 @@ ide_workbench_addin_added_cb (PeasExtensionSet *set,
 
   ide_workbench_addin_load (addin, self);
 
+  if ((action_group = ide_workbench_addin_ref_action_group (addin)))
+    {
+      IdeActionMuxer *muxer = ide_action_mixin_get_action_muxer (self);
+      ide_action_muxer_insert_action_group (muxer,
+                                            peas_plugin_info_get_module_name (plugin_info),
+                                            action_group);
+      g_clear_object (&action_group);
+    }
+
   /* Notify of the VCS system up-front */
   if (self->vcs != NULL)
     ide_workbench_addin_vcs_changed (addin, self->vcs);


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