[gnome-builder] libide/gtk: add API to get menu ids in manager



commit 9652ba505f90c8b35fae96f7033ea90662b883ea
Author: Christian Hergert <chergert redhat com>
Date:   Fri Jul 15 21:58:39 2022 -0700

    libide/gtk: add API to get menu ids in manager

 src/libide/gtk/ide-menu-manager.c | 31 ++++++++++++++++++++++++++-----
 src/libide/gtk/ide-menu-manager.h | 30 ++++++++++++++++--------------
 2 files changed, 42 insertions(+), 19 deletions(-)
---
diff --git a/src/libide/gtk/ide-menu-manager.c b/src/libide/gtk/ide-menu-manager.c
index 1800722d7..6acf659e5 100644
--- a/src/libide/gtk/ide-menu-manager.c
+++ b/src/libide/gtk/ide-menu-manager.c
@@ -27,10 +27,10 @@
 
 struct _IdeMenuManager
 {
-  GObject     parent_instance;
-
-  guint       last_merge_id;
-  GHashTable *models;
+  GObject      parent_instance;
+  guint        last_merge_id;
+  GHashTable  *models;
+  char       **cached_keys;
 };
 
 G_DEFINE_TYPE (IdeMenuManager, ide_menu_manager, G_TYPE_OBJECT)
@@ -488,7 +488,10 @@ ide_menu_manager_merge_builder (IdeMenuManager *self,
         }
 
       if (!(menu = g_hash_table_lookup (self->models, id)))
-        g_hash_table_insert (self->models, g_strdup (id), g_menu_new ());
+        {
+          g_hash_table_insert (self->models, g_strdup (id), g_menu_new ());
+          g_clear_pointer (&self->cached_keys, g_strfreev);
+        }
     }
 
   /*
@@ -569,6 +572,7 @@ ide_menu_manager_merge (IdeMenuManager *self,
     {
       GMenu *new_model = g_menu_new ();
       g_hash_table_insert (self->models, g_strdup (menu_id), new_model);
+      g_clear_pointer (&self->cached_keys, g_strfreev);
       menu = new_model;
     }
 
@@ -622,6 +626,8 @@ ide_menu_manager_remove (IdeMenuManager *self,
             }
         }
     }
+
+  g_clear_pointer (&self->cached_keys, g_strfreev);
 }
 
 /**
@@ -644,6 +650,7 @@ ide_menu_manager_get_menu_by_id (IdeMenuManager *self,
     {
       menu = g_menu_new ();
       g_hash_table_insert (self->models, g_strdup (menu_id), menu);
+      g_clear_pointer (&self->cached_keys, g_strfreev);
     }
 
   return menu;
@@ -677,3 +684,17 @@ ide_menu_manager_add_resource (IdeMenuManager  *self,
 
   return merge_id;
 }
+
+const char * const *
+ide_menu_manager_get_menu_ids (IdeMenuManager *self)
+{
+  g_return_val_if_fail (IDE_IS_MENU_MANAGER (self), NULL);
+
+  if (self->cached_keys == NULL)
+    {
+      g_autofree gpointer *keys = g_hash_table_get_keys_as_array (self->models, NULL);
+      self->cached_keys = g_strdupv ((char **)keys);
+    }
+
+  return (const char * const *)self->cached_keys;
+}
diff --git a/src/libide/gtk/ide-menu-manager.h b/src/libide/gtk/ide-menu-manager.h
index c2ba702c3..e7ae6ee4d 100644
--- a/src/libide/gtk/ide-menu-manager.h
+++ b/src/libide/gtk/ide-menu-manager.h
@@ -34,24 +34,26 @@ IDE_AVAILABLE_IN_ALL
 G_DECLARE_FINAL_TYPE (IdeMenuManager, ide_menu_manager, IDE, MENU_MANAGER, GObject)
 
 IDE_AVAILABLE_IN_ALL
-IdeMenuManager *ide_menu_manager_new            (void);
+IdeMenuManager     *ide_menu_manager_new            (void);
 IDE_AVAILABLE_IN_ALL
-guint           ide_menu_manager_add_filename   (IdeMenuManager  *self,
-                                                 const gchar     *filename,
-                                                 GError         **error);
+guint               ide_menu_manager_add_filename   (IdeMenuManager  *self,
+                                                     const char      *filename,
+                                                     GError         **error);
 IDE_AVAILABLE_IN_ALL
-guint           ide_menu_manager_add_resource   (IdeMenuManager  *self,
-                                                 const gchar     *resource,
-                                                 GError         **error);
+guint               ide_menu_manager_add_resource   (IdeMenuManager  *self,
+                                                     const char      *resource,
+                                                     GError         **error);
 IDE_AVAILABLE_IN_ALL
-guint           ide_menu_manager_merge          (IdeMenuManager  *self,
-                                                 const gchar     *menu_id,
-                                                 GMenuModel      *model);
+guint               ide_menu_manager_merge          (IdeMenuManager  *self,
+                                                     const char      *menu_id,
+                                                     GMenuModel      *model);
 IDE_AVAILABLE_IN_ALL
-void            ide_menu_manager_remove         (IdeMenuManager  *self,
-                                                 guint            merge_id);
+void                ide_menu_manager_remove         (IdeMenuManager  *self,
+                                                     guint            merge_id);
 IDE_AVAILABLE_IN_ALL
-GMenu          *ide_menu_manager_get_menu_by_id (IdeMenuManager  *self,
-                                                 const gchar     *menu_id);
+GMenu              *ide_menu_manager_get_menu_by_id (IdeMenuManager  *self,
+                                                     const char      *menu_id);
+IDE_AVAILABLE_IN_ALL
+const char * const *ide_menu_manager_get_menu_ids   (IdeMenuManager  *self);
 
 G_END_DECLS


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