[gnome-builder] menu: add gb_menu_extension_new_for_section()



commit 6c6860453d4435ece0f8dc46a800328fe901f8df
Author: Christian Hergert <christian hergert me>
Date:   Thu Sep 3 19:27:25 2015 -0700

    menu: add gb_menu_extension_new_for_section()
    
    This constructor creates a new menu extension to be used on a section of
    a GMenu.

 src/util/gb-menu-extension.c |   51 ++++++++++++++++++++++++++++++++++++++++++
 src/util/gb-menu-extension.h |    2 +
 2 files changed, 53 insertions(+), 0 deletions(-)
---
diff --git a/src/util/gb-menu-extension.c b/src/util/gb-menu-extension.c
index d5806c4..b369ac9 100644
--- a/src/util/gb-menu-extension.c
+++ b/src/util/gb-menu-extension.c
@@ -127,6 +127,57 @@ gb_menu_extension_new (GMenu *menu)
        return g_object_new (GB_TYPE_MENU_EXTENSION, "menu", menu, NULL);
 }
 
+GbMenuExtension *
+gb_menu_extension_new_for_section (GMenu       *menu,
+                                   const gchar *section)
+{
+       guint n_items;
+       guint i;
+
+       n_items = g_menu_model_get_n_items (G_MENU_MODEL (menu));
+
+       for (i = 0; i < n_items; i++)
+       {
+               g_autoptr(GMenuAttributeIter) iter = NULL;
+
+               iter = g_menu_model_iterate_item_attributes (G_MENU_MODEL (menu), i);
+
+                while (g_menu_attribute_iter_next (iter))
+               {
+                       g_autoptr(GVariant) variant = NULL;
+                       const gchar *name;
+                       const gchar *key;
+
+                       name = g_menu_attribute_iter_get_name (iter);
+                       if (g_strcmp0 (name, "id") != 0)
+                               continue;
+
+                       variant = g_menu_attribute_iter_get_value (iter);
+                       if (!g_variant_is_of_type (variant, G_VARIANT_TYPE_STRING))
+                               continue;
+
+                       key = g_variant_get_string (variant, NULL);
+                       if (g_strcmp0 (key, section) == 0)
+                       {
+                               GMenuModel *section_menu;
+
+                               section_menu = g_menu_model_get_item_link (G_MENU_MODEL (menu), i, 
G_MENU_LINK_SECTION);
+
+                               if (!G_IS_MENU (section_menu))
+                                       continue;
+
+                               return g_object_new (GB_TYPE_MENU_EXTENSION, "menu", section_menu, NULL);
+                       }
+               }
+       }
+
+       g_warning ("Failed to locate section \"%s\". "
+                  "Ensure you have set the <attribute name=\"id\"> element.",
+                  section);
+
+       return NULL;
+}
+
 void
 gb_menu_extension_append_menu_item (GbMenuExtension *menu,
                                     GMenuItem       *item)
diff --git a/src/util/gb-menu-extension.h b/src/util/gb-menu-extension.h
index 128e7ef..1bbc069 100644
--- a/src/util/gb-menu-extension.h
+++ b/src/util/gb-menu-extension.h
@@ -31,6 +31,8 @@ G_BEGIN_DECLS
 G_DECLARE_FINAL_TYPE (GbMenuExtension, gb_menu_extension, GB, MENU_EXTENSION, GObject)
 
 GbMenuExtension       *gb_menu_extension_new                 (GMenu           *menu);
+GbMenuExtension       *gb_menu_extension_new_for_section     (GMenu           *menu,
+                                                              const gchar     *section);
 
 void                   gb_menu_extension_append_menu_item    (GbMenuExtension *menu,
                                                               GMenuItem       *item);


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