[gnome-builder] libide/gui: add restore_session_item vfunc for workspace addin
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] libide/gui: add restore_session_item vfunc for workspace addin
- Date: Fri, 16 Sep 2022 19:47:08 +0000 (UTC)
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]