void AppMenuView::addMenuItems(QStandardItem* parentItem, MenuCacheDir* dir) { GSList* l; GSList* list; /* Iterate over all menu items in this directory. */ for(l = list = menu_cache_dir_list_children(dir); l != NULL; l = l->next) { /* Get the menu item. */ MenuCacheItem* menuItem = MENU_CACHE_ITEM(l->data); switch(menu_cache_item_get_type(menuItem)) { case MENU_CACHE_TYPE_NONE: case MENU_CACHE_TYPE_SEP: break; case MENU_CACHE_TYPE_APP: case MENU_CACHE_TYPE_DIR: { AppMenuViewItem* newItem = new AppMenuViewItem(menuItem); if(parentItem) parentItem->insertRow(parentItem->rowCount(), newItem); else model_->insertRow(model_->rowCount(), newItem); if(menu_cache_item_get_type(menuItem) == MENU_CACHE_TYPE_DIR) addMenuItems(newItem, MENU_CACHE_DIR(menuItem)); break; } } } g_slist_free_full(list, (GDestroyNotify)menu_cache_item_unref); }
static void add_menu_items(GtkTreeIter* parent_it, MenuCacheDir* dir) { GtkTreeIter it; GSList * l; GIcon* gicon; /* Iterate over all menu items in this directory. */ for (l = menu_cache_dir_get_children(dir); l != NULL; l = l->next) { /* Get the menu item. */ MenuCacheItem* item = MENU_CACHE_ITEM(l->data); switch(menu_cache_item_get_type(item)) { case MENU_CACHE_TYPE_NONE: case MENU_CACHE_TYPE_SEP: break; case MENU_CACHE_TYPE_APP: case MENU_CACHE_TYPE_DIR: if(menu_cache_item_get_icon(item)) { if(g_path_is_absolute(menu_cache_item_get_icon(item))) { GFile* gf = g_file_new_for_path(menu_cache_item_get_icon(item)); gicon = g_file_icon_new(gf); g_object_unref(gf); } else { char* dot = strrchr((char*)menu_cache_item_get_icon(item), '.'); if(dot && (strcmp(dot+1, "png") == 0 || strcmp(dot+1, "svg") == 0 || strcmp(dot+1, "xpm") == 0)) { char* name = g_strndup(menu_cache_item_get_icon(item), dot - menu_cache_item_get_icon(item)); gicon = g_themed_icon_new(name); g_free(name); } else gicon = g_themed_icon_new(menu_cache_item_get_icon(item)); } } else gicon = NULL; gtk_tree_store_append(store, &it, parent_it); gtk_tree_store_set(store, &it, COL_ICON, gicon, COL_TITLE, menu_cache_item_get_name(item), COL_ITEM, item, -1); if(gicon) g_object_unref(gicon); if(menu_cache_item_get_type(item) == MENU_CACHE_TYPE_DIR) add_menu_items(&it, MENU_CACHE_DIR(item)); break; } } }
void XdgCachedMenu::addMenuItems(QMenu* menu, MenuCacheDir* dir) { for(GSList* l = menu_cache_dir_get_children(dir); l; l = l->next) { MenuCacheItem* item = (MenuCacheItem*)l->data; MenuCacheType type = menu_cache_item_get_type(item); if(type == MENU_CACHE_TYPE_SEP) { menu->addSeparator(); continue; } else { XdgCachedMenuAction* action = new XdgCachedMenuAction(item, menu); menu->addAction(action); if(type == MENU_CACHE_TYPE_APP) connect(action, SIGNAL(triggered(bool)), SLOT(onItemTrigerred())); else if(type == MENU_CACHE_TYPE_DIR) { XdgCachedMenu* submenu = new XdgCachedMenu(menu); action->setMenu(submenu); addMenuItems(submenu, (MenuCacheDir*)item); } } } }
gboolean fm_app_menu_view_is_item_app(GtkTreeView* view, GtkTreeIter* it) { MenuCacheItem* item; gtk_tree_model_get(GTK_TREE_MODEL(store), it, COL_ITEM, &item, -1); if(item && menu_cache_item_get_type(item) == MENU_CACHE_TYPE_APP) return TRUE; return FALSE; }
/* called with lock held */ static void add_menu_items(GtkTreeIter* parent_it, MenuCacheDir* dir) { GtkTreeIter it; GSList * l; #if MENU_CACHE_CHECK_VERSION(0, 4, 0) GSList *list; #endif GIcon* gicon; /* Iterate over all menu items in this directory. */ #if MENU_CACHE_CHECK_VERSION(0, 4, 0) for (l = list = menu_cache_dir_list_children(dir); l != NULL; l = l->next) #else for (l = menu_cache_dir_get_children(dir); l != NULL; l = l->next) #endif { /* Get the menu item. */ MenuCacheItem* item = MENU_CACHE_ITEM(l->data); switch(menu_cache_item_get_type(item)) { case MENU_CACHE_TYPE_NONE: case MENU_CACHE_TYPE_SEP: break; case MENU_CACHE_TYPE_APP: case MENU_CACHE_TYPE_DIR: if(menu_cache_item_get_icon(item)) gicon = G_ICON(fm_icon_from_name(menu_cache_item_get_icon(item))); else gicon = NULL; gtk_tree_store_append(store, &it, parent_it); gtk_tree_store_set(store, &it, COL_ICON, gicon, COL_TITLE, menu_cache_item_get_name(item), COL_ITEM, item, -1); if(gicon) g_object_unref(gicon); if(menu_cache_item_get_type(item) == MENU_CACHE_TYPE_DIR) add_menu_items(&it, MENU_CACHE_DIR(item)); break; } } #if MENU_CACHE_CHECK_VERSION(0, 4, 0) g_slist_free_full(list, (GDestroyNotify)menu_cache_item_unref); #endif }
/** * fm_app_menu_view_is_item_app * @view: a widget * @it: tree iterator * * Checks if item at @it is an application. * * Returns: %TRUE if item is an application. * * Since: 0.1.0 */ gboolean fm_app_menu_view_is_item_app(GtkTreeView* view, GtkTreeIter* it) { MenuCacheItem* item; /* FIXME: this should be checked if it's exactly app menu tree! */ gboolean ret = FALSE; gtk_tree_model_get(GTK_TREE_MODEL(store), it, COL_ITEM, &item, -1); if(item && menu_cache_item_get_type(item) == MENU_CACHE_TYPE_APP) ret = TRUE; return ret; }
char* fm_app_menu_view_get_selected_app_desktop_id(GtkTreeView* view) { GtkTreeIter it; GtkTreeSelection* sel = gtk_tree_view_get_selection(view); if(gtk_tree_selection_get_selected(sel, NULL, &it)) { MenuCacheItem* item; gtk_tree_model_get(GTK_TREE_MODEL(store), &it, COL_ITEM, &item, -1); if(item && menu_cache_item_get_type(item) == MENU_CACHE_TYPE_APP) return g_strdup(menu_cache_item_get_id(item)); } return NULL; }
XdgCachedMenuAction::XdgCachedMenuAction(MenuCacheItem* item, QObject* parent): QAction(parent), item_(menu_cache_item_ref(item)) { QString title = QString::fromUtf8(menu_cache_item_get_name(item)); title = title.replace('&', QLatin1String("&&")); // & is reserved for mnemonics setText(title); // Only set tooltips for app items if(menu_cache_item_get_type(item) == MENU_CACHE_TYPE_APP) { QString comment = QString::fromUtf8(menu_cache_item_get_comment(item)); setToolTip(comment); } }
/** * fm_app_menu_view_dup_selected_app_desktop_id * @view: a widget * * Retrieves name of selected application from the widget. * The returned data should be freed with g_free() after usage. * * Before 1.0.0 this call had name fm_app_menu_view_get_selected_app_desktop_id. * * Returns: (transfer full): selected application name. * * Since: 0.1.0 */ char* fm_app_menu_view_dup_selected_app_desktop_id(GtkTreeView* view) { GtkTreeIter it; GtkTreeSelection* sel = gtk_tree_view_get_selection(view); /* FIXME: this should be checked if it's exactly app menu tree! */ char* id = NULL; if(gtk_tree_selection_get_selected(sel, NULL, &it)) { MenuCacheItem* item; gtk_tree_model_get(GTK_TREE_MODEL(store), &it, COL_ITEM, &item, -1); if(item && menu_cache_item_get_type(item) == MENU_CACHE_TYPE_APP) id = g_strdup(menu_cache_item_get_id(item)); } return id; }
XdgCachedMenuAction::XdgCachedMenuAction(MenuCacheItem* item, QObject* parent): QAction(parent), item_(menu_cache_item_ref(item)) { QString title = QString::fromUtf8(menu_cache_item_get_name(item)); setText(title); // Only set tooltips for app items if(menu_cache_item_get_type(item) == MENU_CACHE_TYPE_APP) { QString comment = QString::fromUtf8(menu_cache_item_get_comment(item)); setToolTip(comment); } QIcon icon = XdgIcon::fromTheme(menu_cache_item_get_icon(item)); setIcon(icon); }
/** * fm_app_menu_view_dup_selected_app_desktop_path * @view: a widget * * Retrieves #FmPath to selected application from the widget as a child * below fm_path_get_apps_menu() root path. Return %NULL if there is no * application selected. * The returned data should be freed with fm_path_unref() after usage. * * Returns: (transfer full): path to selected application file. * * Since: 1.2.0 */ FmPath * fm_app_menu_view_dup_selected_app_desktop_path(GtkTreeView* view) { GtkTreeIter it; GtkTreeSelection* sel = gtk_tree_view_get_selection(view); /* FIXME: this should be checked if it's exactly app menu tree! */ if(gtk_tree_selection_get_selected(sel, NULL, &it)) { MenuCacheItem* item; gtk_tree_model_get(GTK_TREE_MODEL(store), &it, COL_ITEM, &item, -1); if(item && menu_cache_item_get_type(item) == MENU_CACHE_TYPE_APP) { char *mpath = menu_cache_dir_make_path(MENU_CACHE_DIR(item)); FmPath *path = fm_path_new_relative(fm_path_get_apps_menu(), mpath+13 /* skip "/Applications" */); g_free(mpath); return path; } } return NULL; }
/****f* pekwm-menu/generate_pekwm_menu * FUNCTION * main routine of menu creation. * * NOTES * It calls itself when 'dir' type is MENU_CACHE_TYPE_DIR. ****/ void generate_pekwm_menu (MenuCacheDir *dir, OB_Menu *context) { GSList *l = NULL; for (l = menu_cache_dir_get_children (dir); l; l = l->next) switch ((guint) menu_cache_item_get_type (MENU_CACHE_ITEM(l->data))) { case MENU_CACHE_TYPE_DIR: menu_directory (l->data, context); generate_pekwm_menu (MENU_CACHE_DIR(l->data), context); g_string_append (context->builder, "}\n"); break; case MENU_CACHE_TYPE_SEP: g_string_append (context->builder, "Separator {}\n"); break; case MENU_CACHE_TYPE_APP: if (app_is_visible (MENU_CACHE_APP(l->data), 0)) menu_application (l->data, context); } }