162 lines
3.4 KiB
C
162 lines
3.4 KiB
C
#include <Elementary.h>
|
|
|
|
#include "utils.h"
|
|
|
|
typedef struct _Elfe_Grid_Item Elfe_Grid_Item;
|
|
|
|
struct _Elfe_Grid_Item
|
|
{
|
|
const char *icon_path;
|
|
Efreet_Menu *menu;
|
|
};
|
|
|
|
static Elm_Gengrid_Item_Class app_itc;
|
|
static Efreet_Menu *menus;
|
|
static Eina_List *grid_items = NULL;
|
|
|
|
static void _populate_items_cb(void *data, Evas_Object *obj, void *event_info);
|
|
|
|
static char *
|
|
_label_get(void *data, Evas_Object *obj, const char *part)
|
|
{
|
|
|
|
Elfe_Grid_Item *gitem = data;
|
|
|
|
if (gitem->menu->name)
|
|
return strdup(gitem->menu->name);
|
|
else
|
|
return NULL;
|
|
|
|
}
|
|
|
|
static Evas_Object *
|
|
_icon_get(void *data, Evas_Object *obj, const char *part)
|
|
{
|
|
const char *path;
|
|
Evas_Object *ic = NULL;
|
|
Elfe_Grid_Item *gitem = data;
|
|
|
|
if (!gitem)
|
|
return NULL;
|
|
|
|
/* Fixme use elfe_util_fdo_icon_add */
|
|
if (!strcmp(part, "elm.swallow.icon"))
|
|
{
|
|
ic = elm_icon_add(obj);
|
|
elm_icon_file_set(ic, gitem->icon_path, NULL);
|
|
}
|
|
|
|
return ic;
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
_gl_longpress(void *data, Evas_Object *obj, void *event_info)
|
|
{
|
|
Evas_Object *popup;
|
|
Evas_Object *ic;
|
|
Elfe_Grid_Item *gitem;
|
|
Elm_Ctxpopup_Item *it;
|
|
|
|
gitem = elm_gengrid_item_data_get(event_info);
|
|
|
|
if (gitem->menu->type != EFREET_MENU_ENTRY_DESKTOP)
|
|
return;
|
|
|
|
evas_object_smart_callback_call(data,
|
|
"entry,longpressed", gitem->menu);
|
|
}
|
|
|
|
static void
|
|
_item_selected(void *data, Evas_Object *obj, void *event_info)
|
|
{
|
|
Elfe_Grid_Item *gitem = data;
|
|
printf("Selected\n");
|
|
evas_object_smart_callback_call(obj, "item,selected", gitem->menu);
|
|
}
|
|
|
|
|
|
static void
|
|
_add_items(Evas_Object *parent, Efreet_Menu *entry)
|
|
{
|
|
Efreet_Menu *menu;
|
|
Efreet_Menu *it;
|
|
Eina_List *l;
|
|
Elfe_Grid_Item *gitem;
|
|
|
|
if (!entry)
|
|
menu = efreet_menu_get();
|
|
else
|
|
menu = entry;
|
|
|
|
EINA_LIST_FOREACH(menu->entries, l, it)
|
|
{
|
|
switch (it->type)
|
|
{
|
|
case EFREET_MENU_ENTRY_MENU :
|
|
_add_items(parent, it);
|
|
break;
|
|
case EFREET_MENU_ENTRY_DESKTOP :
|
|
gitem = calloc(1, sizeof(Elfe_Grid_Item));
|
|
gitem->icon_path = elfe_utils_fdo_icon_path_get(it, 72);
|
|
gitem->menu = it;
|
|
grid_items = eina_list_append(grid_items, gitem);
|
|
elm_gengrid_item_append(parent, &app_itc, gitem, _item_selected, gitem);
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
static void
|
|
_list_resize_cb(void *data , Evas *e , Evas_Object *obj, void *event_info )
|
|
{
|
|
Evas_Coord w, h;
|
|
Evas_Coord size = 0;
|
|
|
|
evas_object_geometry_get(obj, NULL, NULL, &w, &h);
|
|
|
|
(h > w) ? (size = w / 4) : (size = h / 4);
|
|
|
|
elm_gengrid_item_size_set(obj, size, size);
|
|
}
|
|
|
|
Evas_Object *
|
|
elfe_allapps_add(Evas_Object *parent)
|
|
{
|
|
Evas_Object *list;
|
|
char *path;
|
|
Evas_Object *ic;
|
|
Eina_List *l;
|
|
|
|
|
|
/* FIXME use dynamic item size */
|
|
list = elm_gengrid_add(parent);
|
|
elm_gengrid_item_size_set(list, 0, 0);
|
|
|
|
evas_object_event_callback_add(list, EVAS_CALLBACK_RESIZE,
|
|
_list_resize_cb, NULL);
|
|
|
|
elm_gengrid_multi_select_set(list, EINA_FALSE);
|
|
elm_gengrid_bounce_set(list, EINA_FALSE, EINA_TRUE);
|
|
|
|
evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
|
evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
|
|
|
|
evas_object_smart_callback_add(list, "longpressed", _gl_longpress, list);
|
|
evas_object_show(list);
|
|
|
|
app_itc.item_style = "default";
|
|
app_itc.func.label_get = _label_get;
|
|
app_itc.func.icon_get = _icon_get;
|
|
app_itc.func.state_get = NULL;
|
|
app_itc.func.del = NULL;
|
|
|
|
_add_items(list, NULL);
|
|
evas_object_show(list);
|
|
|
|
return list;
|
|
}
|
|
|