#include "gtkmodelmenuitem.h"
+#include "gtkaccelmapprivate.h"
+#include "gtkmodelmenu.h"
+
struct _GtkModelMenuItem
{
GtkCheckMenuItem parent_instance;
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))
{
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);
}
}
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);
}