[gnome-builder] libide/gui: add "workspace." actions with action mixin



commit 4cd796c93abf15de5495a9fc4cf89c1d2bf0444b
Author: Christian Hergert <chergert redhat com>
Date:   Thu Jul 28 01:14:52 2022 -0700

    libide/gui: add "workspace." actions with action mixin
    
    This doesn't seem like much now, but it will allow us to merge in actions
    from various places like addins and have them merge in cleanly like we
    do for context actions.
    
    "workspace.sysprof.run" would indicate "run" action of "sysprof" plugin
    that is a workspace-addin.

 src/libide/greeter/gtk/menus.ui        |  2 +-
 src/libide/gui/ide-workspace-actions.c | 12 -----------
 src/libide/gui/ide-workspace-private.h |  1 -
 src/libide/gui/ide-workspace.c         | 37 ++++++++++++++++++++++++++++++----
 src/libide/gui/ide-workspace.h         |  2 ++
 src/libide/gui/meson.build             |  1 -
 src/libide/terminal/gtk/menus.ui       |  2 +-
 7 files changed, 37 insertions(+), 20 deletions(-)
---
diff --git a/src/libide/greeter/gtk/menus.ui b/src/libide/greeter/gtk/menus.ui
index 4c8b216f1..50c6d548f 100644
--- a/src/libide/greeter/gtk/menus.ui
+++ b/src/libide/greeter/gtk/menus.ui
@@ -18,7 +18,7 @@
       <item>
         <attribute name="id">ide-greeter-workspace-menu-close</attribute>
         <attribute name="label" translatable="yes">Close</attribute>
-        <attribute name="action">win.close</attribute>
+        <attribute name="action">workspace.close</attribute>
       </item>
     </section>
     <section id="ide-greeter-workspace-menu-app">
diff --git a/src/libide/gui/ide-workspace-actions.c b/src/libide/gui/ide-workspace-actions.c
index 106e39a36..f2d712c37 100644
--- a/src/libide/gui/ide-workspace-actions.c
+++ b/src/libide/gui/ide-workspace-actions.c
@@ -25,18 +25,6 @@
 #include "ide-gui-global.h"
 #include "ide-workspace-private.h"
 
-static void
-ide_workspace_actions_close (GSimpleAction *action,
-                             GVariant      *param,
-                             gpointer       user_data)
-{
-  IdeWorkspace *self = user_data;
-
-  g_assert (G_IS_SIMPLE_ACTION (action));
-  g_assert (IDE_IS_WORKSPACE (self));
-
-  gtk_window_close (GTK_WINDOW (self));
-}
 
 static const GActionEntry actions[] = {
   { "close", ide_workspace_actions_close },
diff --git a/src/libide/gui/ide-workspace-private.h b/src/libide/gui/ide-workspace-private.h
index 691d303ba..9f52c8987 100644
--- a/src/libide/gui/ide-workspace-private.h
+++ b/src/libide/gui/ide-workspace-private.h
@@ -26,7 +26,6 @@
 
 G_BEGIN_DECLS
 
-void        _ide_workspace_init_actions        (IdeWorkspace        *self);
 GList      *_ide_workspace_get_mru_link        (IdeWorkspace        *self);
 void        _ide_workspace_add_page_mru        (IdeWorkspace        *self,
                                                 GList               *mru_link);
diff --git a/src/libide/gui/ide-workspace.c b/src/libide/gui/ide-workspace.c
index 92b180436..8dcb3571f 100644
--- a/src/libide/gui/ide-workspace.c
+++ b/src/libide/gui/ide-workspace.c
@@ -493,6 +493,36 @@ ide_workspace_real_get_header_bar (IdeWorkspace *workspace)
   return NULL;
 }
 
+static void
+ide_workspace_action_close (gpointer    instance,
+                            const char *action_name,
+                            GVariant   *param)
+{
+  IdeWorkspace *self = instance;
+
+  g_assert (IDE_IS_WORKSPACE (self));
+
+  gtk_window_close (GTK_WINDOW (self));
+}
+
+static void
+ide_workspace_constructed (GObject *object)
+{
+  IdeWorkspace *self = (IdeWorkspace *)object;
+  IdeActionMuxer *muxer;
+
+  G_OBJECT_CLASS (ide_workspace_parent_class)->constructed (object);
+
+  /* TODO: Connect addins to muxer */
+  /* TODO: Make sure we can get subclasses working (needs a fix
+   * for when/what/who should call ide_action_muxer_init() as you
+   * currently need to call that again in subclass.
+   */
+  ide_action_mixin_constructed (&IDE_WORKSPACE_GET_CLASS (self)->action_mixin, object);
+  muxer = ide_action_mixin_get_action_muxer (self);
+  gtk_widget_insert_action_group (GTK_WIDGET (self), "workspace", G_ACTION_GROUP (muxer));
+}
+
 static void
 ide_workspace_dispose (GObject *object)
 {
@@ -565,6 +595,7 @@ ide_workspace_class_init (IdeWorkspaceClass *klass)
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
   GtkWindowClass *window_class = GTK_WINDOW_CLASS (klass);
 
+  object_class->constructed = ide_workspace_constructed;
   object_class->dispose = ide_workspace_dispose;
   object_class->finalize = ide_workspace_finalize;
   object_class->get_property = ide_workspace_get_property;
@@ -599,7 +630,8 @@ ide_workspace_class_init (IdeWorkspaceClass *klass)
 
   g_object_class_install_properties (object_class, N_PROPS, properties);
 
-  gtk_widget_class_add_binding_action (widget_class, GDK_KEY_comma, GDK_CONTROL_MASK, "app.preferences", 
NULL);
+  ide_action_mixin_init (&klass->action_mixin, object_class);
+  ide_action_mixin_install_action (&klass->action_mixin, "close", NULL, ide_workspace_action_close);
 }
 
 static void
@@ -637,9 +669,6 @@ ide_workspace_init (IdeWorkspace *self)
                     "notify::focus-widget",
                     G_CALLBACK (ide_workspace_notify_focus_widget),
                     NULL);
-
-  /* Initialize GActions for workspace */
-  _ide_workspace_init_actions (self);
 }
 
 GList *
diff --git a/src/libide/gui/ide-workspace.h b/src/libide/gui/ide-workspace.h
index 8c27a2d4a..f9e558ecd 100644
--- a/src/libide/gui/ide-workspace.h
+++ b/src/libide/gui/ide-workspace.h
@@ -49,6 +49,8 @@ struct _IdeWorkspaceClass
 {
   AdwApplicationWindowClass parent_class;
 
+  IdeActionMixin action_mixin;
+
   const gchar *kind;
 
   guint has_statusbar : 1;
diff --git a/src/libide/gui/meson.build b/src/libide/gui/meson.build
index 8f318edec..68a5853cc 100644
--- a/src/libide/gui/meson.build
+++ b/src/libide/gui/meson.build
@@ -82,7 +82,6 @@ libide_gui_private_sources = [
   'ide-shortcut-manager.c',
   'ide-support.c',
   'ide-style-variant-preview.c',
-  'ide-workspace-actions.c',
 ]
 
 libide_gui_public_sources = [
diff --git a/src/libide/terminal/gtk/menus.ui b/src/libide/terminal/gtk/menus.ui
index f1684de20..a4b277292 100644
--- a/src/libide/terminal/gtk/menus.ui
+++ b/src/libide/terminal/gtk/menus.ui
@@ -15,7 +15,7 @@
       <item>
         <attribute name="id">ide-terminal-workspace-menu-close</attribute>
         <attribute name="label" translatable="yes">Close</attribute>
-        <attribute name="action">win.close</attribute>
+        <attribute name="action">workspace.close</attribute>
       </item>
     </section>
   </menu>


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