/* * The GMenu @menu is modified adding to the section @submodel_name * the item @item. */ void nautilus_gmenu_add_item_in_submodel (GMenu *menu, GMenuItem *item, const gchar *submodel_name, gboolean prepend) { GMenuModel *submodel; g_return_if_fail (G_IS_MENU (menu)); g_return_if_fail (G_IS_MENU_ITEM (item)); submodel = find_gmenu_model (G_MENU_MODEL (menu), submodel_name); g_return_if_fail (submodel != NULL); if (prepend) { g_menu_prepend_item (G_MENU (submodel), item); } else { g_menu_append_item (G_MENU (submodel), item); } g_object_unref (submodel); }
/* * The original GMenu is modified adding to the section @submodel_name * the items in @gmenu_to_merge. * @gmenu_to_merge should be a list of menu items. */ void nautilus_gmenu_merge (GMenu *original, GMenu *gmenu_to_merge, const gchar *submodel_name, gboolean prepend) { gint i, n_items; GMenuModel *submodel; GMenuItem *item; g_return_if_fail (G_IS_MENU (original)); g_return_if_fail (G_IS_MENU (gmenu_to_merge)); submodel = find_gmenu_model (G_MENU_MODEL (original), submodel_name); g_return_if_fail (submodel != NULL); n_items = g_menu_model_get_n_items (G_MENU_MODEL (gmenu_to_merge)); for (i = 0; i < n_items; i++) { item = g_menu_item_new_from_model (G_MENU_MODEL (gmenu_to_merge), i); if (prepend) { g_menu_prepend_item (G_MENU (submodel), item); } else { g_menu_append_item (G_MENU (submodel), item); } g_object_unref (item); } g_object_unref (submodel); }
static GMenuModel * find_gmenu_model (GMenuModel *model, const gchar *model_id) { gint i, n_items; GMenuModel *insertion_model = NULL; n_items = g_menu_model_get_n_items (model); for (i = 0; i < n_items && !insertion_model; i++) { gchar *id = NULL; if (g_menu_model_get_item_attribute (model, i, "id", "s", &id) && g_strcmp0 (id, model_id) == 0) { insertion_model = g_menu_model_get_item_link (model, i, G_MENU_LINK_SECTION); if (!insertion_model) insertion_model = g_menu_model_get_item_link (model, i, G_MENU_LINK_SUBMENU); } else { GMenuModel *submodel; GMenuModel *submenu; gint j, j_items; submodel = g_menu_model_get_item_link (model, i, G_MENU_LINK_SECTION); if (!submodel) submodel = g_menu_model_get_item_link (model, i, G_MENU_LINK_SUBMENU); if (!submodel) continue; j_items = g_menu_model_get_n_items (submodel); for (j = 0; j < j_items; j++) { submenu = g_menu_model_get_item_link (submodel, j, G_MENU_LINK_SUBMENU); if (submenu) { insertion_model = find_gmenu_model (submenu, model_id); g_object_unref (submenu); } if (insertion_model) break; } g_object_unref (submodel); } g_free (id); } return insertion_model; }
void nautilus_gmenu_replace_section (GMenu *menu, const gchar *section_id, GMenuModel *section) { GMenuModel *orig_section; GMenuItem *item; gint idx; orig_section = find_gmenu_model (G_MENU_MODEL (menu), section_id); g_return_if_fail (orig_section != NULL); g_menu_remove_all (G_MENU (orig_section)); for (idx = 0; idx < g_menu_model_get_n_items (section); idx++) { item = g_menu_item_new_from_model (section, idx); g_menu_append_item (G_MENU (orig_section), item); g_object_unref (item); } g_object_unref (orig_section); }