]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkmodelmenuitem.c
Draw no trough for color scales
[~andy/gtk] / gtk / gtkmodelmenuitem.c
index 08a3ac1db21e702c39967c964c3dcaced4689337..e6dd987cac3e1eb26f2941b8298da7ca66f3cfef 100644 (file)
@@ -23,6 +23,9 @@
 
 #include "gtkmodelmenuitem.h"
 
+#include "gtkaccelmapprivate.h"
+#include "gtkmodelmenu.h"
+
 struct _GtkModelMenuItem
 {
   GtkCheckMenuItem parent_instance;
@@ -190,12 +193,20 @@ static void
 gtk_model_menu_item_setup (GtkModelMenuItem  *item,
                            GMenuModel        *model,
                            gint               item_index,
-                           GActionObservable *actions)
+                           GActionObservable *actions,
+                           GtkAccelGroup     *accels)
 {
   GMenuAttributeIter *iter;
+  GMenuModel *submenu;
   const gchar *key;
   GVariant *value;
 
+  if ((submenu = g_menu_model_get_item_link (model, item_index, "submenu")))
+    {
+      gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), gtk_model_menu_create_menu (submenu, actions, accels));
+      g_object_unref (submenu);
+    }
+
   iter = g_menu_model_iterate_item_attributes (model, item_index);
   while (g_menu_attribute_iter_get_next (iter, &key, &value))
     {
@@ -219,20 +230,30 @@ gtk_model_menu_item_setup (GtkModelMenuItem  *item,
       const GVariantType *type;
       gboolean enabled;
       GVariant *state;
+      gchar *path;
 
       /* observer already causes us to hold a hard ref on the group */
       item->actions = G_ACTION_GROUP (actions);
 
-      g_action_observable_register_observer (actions, item->action_name, G_ACTION_OBSERVER (item));
-
-      if (g_action_group_query_action (G_ACTION_GROUP (actions), item->action_name, &enabled, &type, NULL, NULL, &state))
-        gtk_model_menu_item_action_added (G_ACTION_OBSERVER (item), actions, item->action_name, type, enabled, state);
-
+      if (actions)
+        {
+          g_action_observable_register_observer (actions, item->action_name, G_ACTION_OBSERVER (item));
+
+          if (g_action_group_query_action (G_ACTION_GROUP (actions), item->action_name, &enabled, &type, NULL, NULL, &state))
+            {
+              gtk_model_menu_item_action_added (G_ACTION_OBSERVER (item), actions, item->action_name, type, enabled, state);
+              if (state != NULL)
+                g_variant_unref (state);
+            }
+          else
+            gtk_widget_set_sensitive (GTK_WIDGET (item), FALSE);
+        }
       else
         gtk_widget_set_sensitive (GTK_WIDGET (item), FALSE);
 
-      if (state != NULL)
-        g_variant_unref (state);
+      path = _gtk_accel_path_for_action (item->action_name, item->target);
+      gtk_menu_item_set_accel_path (GTK_MENU_ITEM (item), path);
+      g_free (path);
     }
 }
 
@@ -275,13 +296,14 @@ gtk_model_menu_item_class_init (GtkModelMenuItemClass *class)
 GtkMenuItem *
 gtk_model_menu_item_new (GMenuModel        *model,
                          gint               item_index,
-                         GActionObservable *actions)
+                         GActionObservable *actions,
+                         GtkAccelGroup     *accels)
 {
   GtkModelMenuItem *item;
 
   item = g_object_new (GTK_TYPE_MODEL_MENU_ITEM, NULL);
 
-  gtk_model_menu_item_setup (item, model, item_index, actions);
+  gtk_model_menu_item_setup (item, model, item_index, actions, accels);
 
   return GTK_MENU_ITEM (item);
 }