[gnome-builder] libide/gui: add restore_session_item vfunc for workspace addin



commit 79f5daa725c703f23c676dd37e413c542894df9f
Author: Christian Hergert <chergert redhat com>
Date:   Fri Sep 16 12:41:37 2022 -0700

    libide/gui: add restore_session_item vfunc for workspace addin
    
    This just simplifies the process of workspace addins restoring items that
    are pinned to their module-name so we can remove all the duplication
    of checking it up-front in addins.

 src/libide/gui/ide-workspace-addin.c | 50 ++++++++++++++++++++++++++++++++++++
 src/libide/gui/ide-workspace-addin.h | 25 ++++++++++--------
 src/libide/gui/ide-workspace.c       |  2 ++
 3 files changed, 66 insertions(+), 11 deletions(-)
---
diff --git a/src/libide/gui/ide-workspace-addin.c b/src/libide/gui/ide-workspace-addin.c
index d82a18bf8..6a698cf15 100644
--- a/src/libide/gui/ide-workspace-addin.c
+++ b/src/libide/gui/ide-workspace-addin.c
@@ -22,6 +22,8 @@
 
 #include "config.h"
 
+#include <libpeas/peas.h>
+
 #include "ide-workspace.h"
 #include "ide-workspace-addin.h"
 
@@ -41,9 +43,53 @@
 
 G_DEFINE_INTERFACE (IdeWorkspaceAddin, ide_workspace_addin, G_TYPE_OBJECT)
 
+static void
+ide_workspace_addin_real_restore_sesion (IdeWorkspaceAddin *addin,
+                                         IdeSession        *session)
+{
+  PeasPluginInfo *plugin_info;
+  IdeWorkspace *workspace;
+  const char *module_name;
+  const char *workspace_id;
+  guint n_items;
+
+  g_assert (IDE_IS_MAIN_THREAD ());
+  g_assert (IDE_IS_WORKSPACE_ADDIN (addin));
+  g_assert (IDE_IS_SESSION (session));
+
+  if (IDE_WORKSPACE_ADDIN_GET_IFACE (addin)->restore_session_item == NULL)
+    return;
+
+  workspace = g_object_get_data (G_OBJECT (addin), "IDE_WORKSPACE");
+  g_assert (IDE_IS_WORKSPACE (workspace));
+
+  workspace_id = ide_workspace_get_id (workspace);
+  g_assert (workspace_id != NULL);
+
+  plugin_info = g_object_get_data (G_OBJECT (addin), "PEAS_PLUGIN_INFO");
+  g_assert (plugin_info != NULL);
+
+  module_name = peas_plugin_info_get_module_name (plugin_info);
+  g_assert (module_name != NULL);
+
+  n_items = ide_session_get_n_items (session);
+
+  for (guint i = 0; i < n_items; i++)
+    {
+      IdeSessionItem *item = ide_session_get_item (session, i);
+
+      if (!ide_str_equal0 (module_name, ide_session_item_get_module_name (item)) ||
+          !ide_str_equal0 (workspace_id, ide_session_item_get_workspace (item)))
+        continue;
+
+      IDE_WORKSPACE_ADDIN_GET_IFACE (addin)->restore_session_item (addin, session, item);
+    }
+}
+
 static void
 ide_workspace_addin_default_init (IdeWorkspaceAddinInterface *iface)
 {
+  iface->restore_session = ide_workspace_addin_real_restore_sesion;
 }
 
 /**
@@ -63,6 +109,8 @@ ide_workspace_addin_load (IdeWorkspaceAddin *self,
   g_return_if_fail (IDE_IS_WORKSPACE_ADDIN (self));
   g_return_if_fail (IDE_IS_WORKSPACE (workspace));
 
+  g_object_set_data (G_OBJECT (self), "IDE_WORKSPACE", workspace);
+
   if (IDE_WORKSPACE_ADDIN_GET_IFACE (self)->load)
     IDE_WORKSPACE_ADDIN_GET_IFACE (self)->load (self, workspace);
 }
@@ -86,6 +134,8 @@ ide_workspace_addin_unload (IdeWorkspaceAddin *self,
 
   if (IDE_WORKSPACE_ADDIN_GET_IFACE (self)->unload)
     IDE_WORKSPACE_ADDIN_GET_IFACE (self)->unload (self, workspace);
+
+  g_object_set_data (G_OBJECT (self), "IDE_WORKSPACE", NULL);
 }
 
 /**
diff --git a/src/libide/gui/ide-workspace-addin.h b/src/libide/gui/ide-workspace-addin.h
index 64f43691d..36c09fdc8 100644
--- a/src/libide/gui/ide-workspace-addin.h
+++ b/src/libide/gui/ide-workspace-addin.h
@@ -41,17 +41,20 @@ struct _IdeWorkspaceAddinInterface
 {
   GTypeInterface parent_iface;
 
-  void          (*load)             (IdeWorkspaceAddin *self,
-                                     IdeWorkspace      *workspace);
-  void          (*unload)           (IdeWorkspaceAddin *self,
-                                     IdeWorkspace      *workspace);
-  void          (*page_changed)     (IdeWorkspaceAddin *self,
-                                     IdePage           *page);
-  GActionGroup *(*ref_action_group) (IdeWorkspaceAddin *self);
-  void          (*save_session)     (IdeWorkspaceAddin *self,
-                                     IdeSession        *session);
-  void          (*restore_session)  (IdeWorkspaceAddin *self,
-                                     IdeSession        *session);
+  void          (*load)                 (IdeWorkspaceAddin *self,
+                                         IdeWorkspace      *workspace);
+  void          (*unload)               (IdeWorkspaceAddin *self,
+                                         IdeWorkspace      *workspace);
+  void          (*page_changed)         (IdeWorkspaceAddin *self,
+                                         IdePage           *page);
+  GActionGroup *(*ref_action_group)     (IdeWorkspaceAddin *self);
+  void          (*save_session)         (IdeWorkspaceAddin *self,
+                                         IdeSession        *session);
+  void          (*restore_session)      (IdeWorkspaceAddin *self,
+                                         IdeSession        *session);
+  void          (*restore_session_item) (IdeWorkspaceAddin *self,
+                                         IdeSession        *session,
+                                         IdeSessionItem    *item);
 };
 
 IDE_AVAILABLE_IN_ALL
diff --git a/src/libide/gui/ide-workspace.c b/src/libide/gui/ide-workspace.c
index fe4e68702..0d87fd953 100644
--- a/src/libide/gui/ide-workspace.c
+++ b/src/libide/gui/ide-workspace.c
@@ -227,6 +227,8 @@ ide_workspace_addin_added_cb (IdeExtensionSetAdapter *set,
   g_debug ("Loading workspace addin from module %s",
            peas_plugin_info_get_module_name (plugin_info));
 
+  g_object_set_data (G_OBJECT (addin), "PEAS_PLUGIN_INFO", plugin_info);
+
   ide_workspace_addin_load (addin, self);
 
   if ((action_group = ide_workspace_addin_ref_action_group (addin)))


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