]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkmodelmenuitem.c
filechooserbutton: In SELECT_FOLDER, when the selection is empty, show (None) in...
[~andy/gtk] / gtk / gtkmodelmenuitem.c
index 450cd9a4bf81b66343b5f0e03dd8b8d64011b186..6d902c2352d3502f97678f872be62120c2aaf60d 100644 (file)
@@ -23,8 +23,8 @@
 
 #include "gtkaccelmapprivate.h"
 #include "gtkactionhelper.h"
-#include "gtkmodelmenu.h"
 #include "gtkwidgetprivate.h"
+#include "gtkaccellabel.h"
 
 struct _GtkModelMenuItem
 {
@@ -107,8 +107,7 @@ static void
 gtk_model_menu_item_setup (GtkModelMenuItem  *item,
                            GMenuModel        *model,
                            gint               item_index,
-                           const gchar       *action_namespace,
-                           GtkAccelGroup     *accels)
+                           const gchar       *action_namespace)
 {
   GMenuAttributeIter *iter;
   GMenuModel *submenu;
@@ -121,17 +120,16 @@ gtk_model_menu_item_setup (GtkModelMenuItem  *item,
       GtkWidget *menu;
 
       g_menu_model_get_item_attribute (model, item_index, "action-namespace", "s", &section_namespace);
+      menu = gtk_menu_new ();
 
       if (action_namespace)
         {
           gchar *namespace = g_strjoin (".", action_namespace, section_namespace, NULL);
-          menu = gtk_model_menu_create_menu (submenu, namespace, accels);
+          gtk_menu_shell_bind_model (GTK_MENU_SHELL (menu), submenu, namespace, TRUE);
           g_free (namespace);
         }
       else
-        {
-          menu = gtk_model_menu_create_menu (submenu, section_namespace, accels);
-        }
+        gtk_menu_shell_bind_model (GTK_MENU_SHELL (menu), submenu, section_namespace, TRUE);
 
       gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), menu);
 
@@ -145,6 +143,26 @@ gtk_model_menu_item_setup (GtkModelMenuItem  *item,
       if (g_str_equal (key, "label") && g_variant_is_of_type (value, G_VARIANT_TYPE_STRING))
         gtk_menu_item_set_label (GTK_MENU_ITEM (item), g_variant_get_string (value, NULL));
 
+      else if (g_str_equal (key, "accel") && g_variant_is_of_type (value, G_VARIANT_TYPE_STRING))
+        {
+          GdkModifierType modifiers;
+          guint key;
+
+          gtk_accelerator_parse (g_variant_get_string (value, NULL), &key, &modifiers);
+
+          if (key)
+            {
+              GtkAccelLabel *accel_label;
+
+              /* Ensure that the GtkAccelLabel has been created... */
+              (void) gtk_menu_item_get_label (GTK_MENU_ITEM (item));
+              accel_label = GTK_ACCEL_LABEL (gtk_bin_get_child (GTK_BIN (item)));
+              g_assert (accel_label);
+
+              gtk_accel_label_set_accel (accel_label, key, modifiers);
+            }
+        }
+
       else if (g_str_equal (key, "action") && g_variant_is_of_type (value, G_VARIANT_TYPE_STRING))
         gtk_actionable_set_namespaced_action_name (GTK_ACTIONABLE (item), action_namespace,
                                                    g_variant_get_string (value, NULL));
@@ -260,14 +278,13 @@ gtk_model_menu_item_class_init (GtkModelMenuItemClass *class)
 GtkMenuItem *
 gtk_model_menu_item_new (GMenuModel        *model,
                          gint               item_index,
-                         const gchar       *action_namespace,
-                         GtkAccelGroup     *accels)
+                         const gchar       *action_namespace)
 {
   GtkModelMenuItem *item;
 
   item = g_object_new (GTK_TYPE_MODEL_MENU_ITEM, NULL);
 
-  gtk_model_menu_item_setup (item, model, item_index, action_namespace, accels);
+  gtk_model_menu_item_setup (item, model, item_index, action_namespace);
 
   return GTK_MENU_ITEM (item);
 }