[Elementary] Use elm_icon_standard_set() on Elm_Menu items.

This breaks the API *and* the ABI, but this should be consistent with
Elm_Toolbar.  We'll probably need a tweak here and there, but I really
think Elm_Menu should be rewritten.

SVN revision: 53694
This commit is contained in:
Leandro Pereira 2010-10-20 21:30:00 +00:00
parent 0025811ff9
commit 5174660ea7
5 changed files with 154 additions and 221 deletions

View File

@ -4,8 +4,7 @@
#endif
#ifndef ELM_LIB_QUICKLAUNCH
static Evas_Object *win, *bg, *menu, *rect, *ic;;
static char buf[PATH_MAX];
static Evas_Object *win, *bg, *menu, *rect;
static void
_show(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
@ -18,83 +17,38 @@ _show(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_i
static void
_populate_4(Elm_Menu_Item *item)
{
Evas_Object *ic;
Elm_Menu_Item *item2;
ic = elm_icon_add(win);
snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR);
elm_icon_file_set(ic, buf, NULL);
elm_menu_item_add(menu, item, ic, "menu 2", NULL, NULL);
ic = elm_icon_add(win);
snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR);
elm_icon_file_set(ic, buf, NULL);
elm_menu_item_add(menu, item, ic, "menu 3", NULL, NULL);
elm_menu_item_add(menu, item, "go-bottom", "menu 2", NULL, NULL);
elm_menu_item_add(menu, item, "go-first", "menu 3", NULL, NULL);
elm_menu_item_separator_add(menu, item);
ic = elm_icon_add(win);
snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR);
elm_icon_file_set(ic, buf, NULL);
item2 = elm_menu_item_add(menu, item, ic, "Disabled item", NULL, NULL);
item2 = elm_menu_item_add(menu, item, "go-last", "Disabled item", NULL, NULL);
elm_menu_item_disabled_set(item2, 1);
ic = elm_icon_add(win);
snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR);
elm_icon_file_set(ic, buf, NULL);
item2 = elm_menu_item_add(menu, item, ic, "Disabled item", NULL, NULL);
item2 = elm_menu_item_add(menu, item, "go-next", "Disabled item", NULL, NULL);
elm_menu_item_disabled_set(item2, 1);
ic = elm_icon_add(win);
snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR);
elm_icon_file_set(ic, buf, NULL);
item2 = elm_menu_item_add(menu, item, ic, "Disabled item", NULL, NULL);
item2 = elm_menu_item_add(menu, item, "go-up", "Disabled item", NULL, NULL);
elm_menu_item_disabled_set(item2, 1);
}
static void
_populate_3(Elm_Menu_Item *item)
{
Evas_Object *ic;
Elm_Menu_Item *item2;
ic = elm_icon_add(win);
snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR);
elm_icon_file_set(ic, buf, NULL);
elm_menu_item_add(menu, item, ic, "menu 2", NULL, NULL);
ic = elm_icon_add(win);
snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR);
elm_icon_file_set(ic, buf, NULL);
elm_menu_item_add(menu, item, ic, "menu 3", NULL, NULL);
elm_menu_item_add(menu, item, "media-eject", "menu 2", NULL, NULL);
elm_menu_item_add(menu, item, "media-playback-start", "menu 3", NULL, NULL);
elm_menu_item_separator_add(menu,item);
ic = elm_icon_add(win);
snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR);
elm_icon_file_set(ic, buf, NULL);
item2 = elm_menu_item_add(menu, item, ic, "Disabled item", NULL, NULL);
item2 = elm_menu_item_add(menu, item, "media-playback-stop", "Disabled item", NULL, NULL);
elm_menu_item_disabled_set(item2, 1);
}
static void
_populate_2(Elm_Menu_Item *item)
{
Evas_Object *ic;
Elm_Menu_Item *item2, *item3;
ic = elm_icon_add(win);
snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR);
elm_icon_file_set(ic, buf, NULL);
elm_menu_item_add(menu, item, ic, "menu 2", NULL, NULL);
ic = elm_icon_add(win);
snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR);
elm_icon_file_set(ic, buf, NULL);
item2 = elm_menu_item_add(menu, item, ic, "menu 3", NULL, NULL);
elm_menu_item_add(menu, item, "system-reboot", "menu 2", NULL, NULL);
item2 = elm_menu_item_add(menu, item, "system-shutdown", "menu 3", NULL, NULL);
_populate_3(item2);
@ -106,18 +60,10 @@ _populate_2(Elm_Menu_Item *item)
elm_menu_item_separator_add(menu,item);
elm_menu_item_separator_add(menu,item);
ic = elm_icon_add(win);
snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR);
elm_icon_file_set(ic, buf, NULL);
item2 = elm_menu_item_add(menu, item, ic, "menu 2", NULL, NULL);
item2 = elm_menu_item_add(menu, item, "system-lock-screen", "menu 2", NULL, NULL);
elm_menu_item_separator_add(menu,item);
ic = elm_icon_add(win);
snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR);
elm_icon_file_set(ic, buf, NULL);
item3 = elm_menu_item_add(menu, item, ic, "Disabled item", NULL, NULL);
item3 = elm_menu_item_add(menu, item, "system-run", "Disabled item", NULL, NULL);
elm_menu_item_disabled_set(item3, 1);
_populate_4(item2);
@ -128,10 +74,7 @@ _populate_1(Elm_Menu_Item *item)
{
Elm_Menu_Item *item2;
ic = elm_icon_add(win);
snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR);
elm_icon_file_set(ic, buf, NULL);
item2 = elm_menu_item_add(menu, item, ic, "menu 1", NULL, NULL);
item2 = elm_menu_item_add(menu, item, "object-rotate-left", "menu 1", NULL, NULL);
_populate_2(item2);
}
@ -158,17 +101,10 @@ test_menu(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info _
menu = elm_menu_add(win);
elm_menu_item_add(menu, NULL, NULL, "first item", NULL, NULL);
ic = elm_icon_add(win);
snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR);
elm_icon_file_set(ic, buf, NULL);
item = elm_menu_item_add(menu, NULL, ic, "second item", NULL, NULL);
item = elm_menu_item_add(menu, NULL, "mail-reply-all", "second item", NULL, NULL);
_populate_1(item);
ic = elm_icon_add(win);
snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR);
elm_icon_file_set(ic, buf, NULL);
elm_menu_item_add(menu, item, ic, "sub menu", NULL, NULL);
elm_menu_item_add(menu, item, "window-new", "sub menu", NULL, NULL);
evas_object_event_callback_add(rect, EVAS_CALLBACK_MOUSE_DOWN, _show, menu);

View File

@ -44,7 +44,7 @@ tb_5(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
void
test_toolbar(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
Evas_Object *win, *bg, *bx, *tb, *ic, *ph, *menu;
Evas_Object *win, *bg, *bx, *tb, *ph, *menu;
Evas_Object *ph1, *ph2, *ph3, *ph4;
Elm_Toolbar_Item *item;
Elm_Menu_Item *menu_item;
@ -93,29 +93,14 @@ test_toolbar(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_inf
item = elm_toolbar_item_add(tb, "refresh", "Menu", NULL, NULL);
elm_toolbar_item_menu_set(item, 1);
elm_toolbar_item_priority_set(item, 999999);
elm_toolbar_item_priority_set(item, -999999);
elm_toolbar_menu_parent_set(tb, win);
menu = elm_toolbar_item_menu_get(item);
ic = elm_icon_add(win);
snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR);
elm_icon_file_set(ic, buf, NULL);
elm_menu_item_add(menu, NULL, ic, "Here", tb_3, ph4);
ic = elm_icon_add(win);
snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR);
elm_icon_file_set(ic, buf, NULL);
menu_item = elm_menu_item_add(menu, NULL, ic, "Comes", tb_4, ph4);
ic = elm_icon_add(win);
snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR);
elm_icon_file_set(ic, buf, NULL);
elm_menu_item_add(menu, menu_item, ic, "hey ho", tb_4, ph4);
ic = elm_icon_add(win);
snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR);
elm_icon_file_set(ic, buf, NULL);
elm_menu_item_add(menu, NULL, ic, "Elementary", tb_5, ph4);
elm_menu_item_add(menu, NULL, "edit-cut", "Here", tb_3, ph4);
menu_item = elm_menu_item_add(menu, NULL, "edit-copy", "Comes", tb_4, ph4);
elm_menu_item_add(menu, menu_item, "edit-paste", "Hey ho", tb_4, ph4);
elm_menu_item_add(menu, NULL, "edit-delete", "Elementary", tb_5, ph4);
elm_box_pack_end(bx, tb);
evas_object_show(tb);

View File

@ -1233,25 +1233,26 @@ extern "C" {
EAPI Eina_Bool elm_cursor_engine_only_set(int engine_only);
typedef struct _Elm_Menu_Item Elm_Menu_Item; /**< Item of Elm_Menu. Sub-type of Elm_Widget_Item */
EAPI Evas_Object *elm_menu_add(Evas_Object *parent);
EAPI void elm_menu_parent_set(Evas_Object *obj, Evas_Object *parent);
EAPI Evas_Object *elm_menu_parent_get(const Evas_Object *obj);
EAPI void elm_menu_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y);
EAPI Evas_Object *elm_menu_object_get(const Elm_Menu_Item *it);
EAPI Elm_Menu_Item *elm_menu_item_add(Evas_Object *obj, Elm_Menu_Item *parent, Evas_Object *icon, const char *label, Evas_Smart_Cb func, const void *data);
EAPI void elm_menu_item_label_set(Elm_Menu_Item *item, const char *label);
EAPI const char *elm_menu_item_label_get(Elm_Menu_Item *item);
EAPI void elm_menu_item_icon_set(Elm_Menu_Item *item, Evas_Object *icon);
EAPI Evas_Object *elm_menu_item_icon_get(Elm_Menu_Item *item);
EAPI void elm_menu_item_disabled_set(Elm_Menu_Item *item, Eina_Bool disabled);
EAPI Eina_Bool elm_menu_item_disabled_get(Elm_Menu_Item *item);
EAPI Elm_Menu_Item *elm_menu_item_separator_add(Evas_Object *obj, Elm_Menu_Item *parent);
EAPI Eina_Bool elm_menu_item_is_separator(Elm_Menu_Item *item);
EAPI void elm_menu_item_del(Elm_Menu_Item *item);
EAPI void elm_menu_item_del_cb_set(Elm_Menu_Item *it, Evas_Smart_Cb func);
EAPI void *elm_menu_item_data_get(const Elm_Menu_Item *it);
EAPI void elm_menu_item_data_set(Elm_Menu_Item *item, const void *data);
EAPI const Eina_List *elm_menu_item_subitems_get(Elm_Menu_Item *item);
EAPI Evas_Object *elm_menu_add(Evas_Object *parent);
EAPI void elm_menu_parent_set(Evas_Object *obj, Evas_Object *parent);
EAPI Evas_Object *elm_menu_parent_get(const Evas_Object *obj);
EAPI void elm_menu_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y);
EAPI Evas_Object *elm_menu_object_get(const Elm_Menu_Item *it);
EAPI Elm_Menu_Item *elm_menu_item_add(Evas_Object *obj, Elm_Menu_Item *parent, const char *icon, const char *label, Evas_Smart_Cb func, const void *data);
EAPI void elm_menu_item_label_set(Elm_Menu_Item *item, const char *label);
EAPI const char *elm_menu_item_label_get(Elm_Menu_Item *item);
EAPI void elm_menu_item_icon_set(Elm_Menu_Item *item, const char *icon);
EAPI const char *elm_menu_item_icon_get(Elm_Menu_Item *item);
EAPI const Evas_Object *elm_menu_item_object_icon_get(Elm_Menu_Item *item);
EAPI void elm_menu_item_disabled_set(Elm_Menu_Item *item, Eina_Bool disabled);
EAPI Eina_Bool elm_menu_item_disabled_get(Elm_Menu_Item *item);
EAPI Elm_Menu_Item *elm_menu_item_separator_add(Evas_Object *obj, Elm_Menu_Item *parent);
EAPI Eina_Bool elm_menu_item_is_separator(Elm_Menu_Item *item);
EAPI void elm_menu_item_del(Elm_Menu_Item *item);
EAPI void elm_menu_item_del_cb_set(Elm_Menu_Item *it, Evas_Smart_Cb func);
EAPI void *elm_menu_item_data_get(const Elm_Menu_Item *it);
EAPI void elm_menu_item_data_set(Elm_Menu_Item *item, const void *data);
EAPI const Eina_List *elm_menu_item_subitems_get(Elm_Menu_Item *item);
/* smart callbacks called:
* "clicked" - the user clicked the empty space in the menu to dismiss. event_info is NULL.
*/

View File

@ -16,20 +16,19 @@ struct _Elm_Menu_Item
{
Elm_Widget_Item base;
Elm_Menu_Item *parent;
Eina_Bool separator;
Eina_Bool disabled;
//if classic item or submenu
Evas_Object *icon;
const char *icon_str;
const char *label;
Evas_Smart_Cb func;
//if submenu
Eina_Bool open;
Evas_Object *hv, *bx, *location;
Eina_List *items;
struct {
Evas_Object *hv, *bx, *location;
Eina_List *items;
Eina_Bool open : 1;
} submenu;
Eina_Bool separator : 1;
Eina_Bool disabled : 1;
};
struct _Widget_Data
@ -45,7 +44,6 @@ static void _theme_hook(Evas_Object *obj);
static void _sizing_eval(Evas_Object *obj);
static void _submenu_sizing_eval(Elm_Menu_Item *parent);
static void _item_sizing_eval(Elm_Menu_Item *item);
static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info);
static void _submenu_hide(Elm_Menu_Item *item);
static void _submenu_open(void *data, Evas_Object *obj, const char *emission, const char *source);
static void _parent_resize(void *data, Evas *e, Evas_Object *obj, void *event_info);
@ -58,12 +56,13 @@ _del_item(Elm_Menu_Item *item)
elm_widget_item_pre_notify_del(item);
EINA_LIST_FREE(item->items, child)
EINA_LIST_FREE(item->submenu.items, child)
_del_item(child);
if (item->label) eina_stringshare_del(item->label);
if (item->hv) evas_object_del(item->hv);
if (item->location) evas_object_del(item->location);
if (item->submenu.hv) evas_object_del(item->submenu.hv);
if (item->submenu.location) evas_object_del(item->submenu.location);
if (item->icon_str) eina_stringshare_del(item->icon_str);
elm_widget_item_del(item);
}
@ -102,24 +101,24 @@ _theme_hook(Evas_Object *obj)
{
EINA_LIST_FOREACH(l, _l, item)
{
ll = eina_list_append(ll, item->items);
ll = eina_list_append(ll, item->submenu.items);
if (item->separator)
_elm_theme_object_set(obj, item->base.view, "menu", "separator",
elm_widget_style_get(obj));
else if (item->bx)
else if (item->submenu.bx)
{
_elm_theme_object_set
(obj, item->base.view, "menu", "item_with_submenu",
elm_widget_style_get(obj));
elm_menu_item_label_set(item, item->label);
elm_menu_item_icon_set(item, item->icon);
elm_menu_item_icon_set(item, item->icon_str);
}
else
{
_elm_theme_object_set(obj, item->base.view, "menu", "item",
elm_widget_style_get(obj));
elm_menu_item_label_set(item, item->label);
elm_menu_item_icon_set(item, item->icon);
elm_menu_item_icon_set(item, item->icon_str);
}
if (item->disabled)
edje_object_signal_emit
@ -165,7 +164,7 @@ _sizing_eval(Evas_Object *obj)
EINA_LIST_FOREACH(wd->items,l,item)
{
if (item->open) _submenu_sizing_eval(item);
if (item->submenu.open) _submenu_sizing_eval(item);
}
}
@ -177,10 +176,10 @@ _submenu_sizing_eval(Elm_Menu_Item *parent)
Evas_Coord x_p, y_p, w_p, h_p, x2, y2, w2, h2, bx, by, bw, bh, px, py, pw, ph;
Widget_Data *wd = elm_widget_data_get(parent->base.widget);
if (!wd) return;
EINA_LIST_FOREACH(parent->items,l,item) _item_sizing_eval(item);
evas_object_geometry_get(parent->location, &x_p, &y_p, &w_p, &h_p);
EINA_LIST_FOREACH(parent->submenu.items, l, item) _item_sizing_eval(item);
evas_object_geometry_get(parent->submenu.location, &x_p, &y_p, &w_p, &h_p);
evas_object_geometry_get(parent->base.view, &x2, &y2, &w2, &h2);
evas_object_geometry_get(parent->bx, &bx, &by, &bw, &bh);
evas_object_geometry_get(parent->submenu.bx, &bx, &by, &bw, &bh);
evas_object_geometry_get(wd->parent, &px, &py, &pw, &ph);
x_p = x2+w2;
@ -194,15 +193,15 @@ _submenu_sizing_eval(Elm_Menu_Item *parent)
if (y_p < py)
y_p += y_p - y_p;
evas_object_move(parent->location, x_p, y_p);
evas_object_resize(parent->location, bw, h_p);
evas_object_size_hint_min_set(parent->location, bw, h_p);
evas_object_size_hint_max_set(parent->location, bw, h_p);
elm_hover_target_set(parent->hv, parent->location);
evas_object_move(parent->submenu.location, x_p, y_p);
evas_object_resize(parent->submenu.location, bw, h_p);
evas_object_size_hint_min_set(parent->submenu.location, bw, h_p);
evas_object_size_hint_max_set(parent->submenu.location, bw, h_p);
elm_hover_target_set(parent->submenu.hv, parent->submenu.location);
EINA_LIST_FOREACH(parent->items,l,item)
EINA_LIST_FOREACH(parent->submenu.items, l, item)
{
if (item->open)
if (item->submenu.open)
_submenu_sizing_eval(item);
}
}
@ -220,12 +219,6 @@ _item_sizing_eval(Elm_Menu_Item *item)
evas_object_size_hint_max_set(item->base.view, maxw, maxh);
}
static void
_changed_size_hints(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
_sizing_eval(data);
}
static void
_menu_resize(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
@ -242,7 +235,7 @@ static void
_item_move_resize(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{
Elm_Menu_Item *item = data;
if (item->open) _submenu_sizing_eval(item);
if (item->submenu.open) _submenu_sizing_eval(item);
}
static void
@ -264,7 +257,7 @@ _menu_hide(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
EINA_LIST_FOREACH(wd->items, l, item2)
{
if (item2->open) _submenu_hide(item2);
if (item2->submenu.open) _submenu_hide(item2);
}
}
@ -273,11 +266,11 @@ _submenu_hide(Elm_Menu_Item *item)
{
Eina_List *l;
Elm_Menu_Item *item2;
evas_object_hide(item->hv);
item->open = EINA_FALSE;
EINA_LIST_FOREACH(item->items, l, item2)
evas_object_hide(item->submenu.hv);
item->submenu.open = EINA_FALSE;
EINA_LIST_FOREACH(item->submenu.items, l, item2)
{
if (item2->open) _submenu_hide(item2);
if (item2->submenu.open) _submenu_hide(item2);
}
}
@ -285,9 +278,9 @@ static void
_menu_item_select(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
{
Elm_Menu_Item *it = data;
if (it->items)
if (it->submenu.items)
{
if (!it->open) _submenu_open(it, NULL, NULL, NULL);
if (!it->submenu.open) _submenu_open(it, NULL, NULL, NULL);
else _submenu_hide(it);
}
else
@ -304,9 +297,9 @@ _menu_item_activate(void *data, Evas_Object *obj __UNUSED__, const char *emissio
Elm_Menu_Item *item = data;
if (item->parent)
{
EINA_LIST_FOREACH(item->parent->items, l, item2)
EINA_LIST_FOREACH(item->parent->submenu.items, l, item2)
{
if ((item2->open) && (item2 != item)) _submenu_hide(item2);
if ((item2->submenu.open) && (item2 != item)) _submenu_hide(item2);
}
}
else
@ -314,7 +307,7 @@ _menu_item_activate(void *data, Evas_Object *obj __UNUSED__, const char *emissio
Widget_Data *wd = elm_widget_data_get(item->base.widget);
EINA_LIST_FOREACH(wd->items, l, item2)
{
if ((item2->open) && (item2 != item)) _submenu_hide(item2);
if ((item2->submenu.open) && (item2 != item)) _submenu_hide(item2);
}
}
}
@ -323,8 +316,8 @@ static void
_submenu_open(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
{
Elm_Menu_Item *it = data;
it->open = EINA_TRUE;
evas_object_show(it->hv);
it->submenu.open = EINA_TRUE;
evas_object_show(it->submenu.hv);
_sizing_eval(it->base.widget);
}
@ -371,27 +364,27 @@ _item_submenu_obj_create(Elm_Menu_Item *item)
{
Widget_Data *wd = elm_widget_data_get(item->base.widget);
if (!wd) return;
item->location = elm_icon_add(wd->bx);
item->hv = elm_hover_add(wd->bx);
elm_hover_target_set(item->hv, item->location);
elm_hover_parent_set(item->hv, wd->parent);
elm_object_style_set(item->hv, "submenu");
item->submenu.location = elm_icon_add(wd->bx);
item->submenu.hv = elm_hover_add(wd->bx);
elm_hover_target_set(item->submenu.hv, item->submenu.location);
elm_hover_parent_set(item->submenu.hv, wd->parent);
elm_object_style_set(item->submenu.hv, "submenu");
item->bx = elm_box_add(wd->bx);
evas_object_size_hint_weight_set(item->bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_show(item->bx);
elm_hover_content_set(item->hv, elm_hover_best_content_location_get(item->hv, ELM_HOVER_AXIS_VERTICAL), item->bx);
item->submenu.bx = elm_box_add(wd->bx);
evas_object_size_hint_weight_set(item->submenu.bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_show(item->submenu.bx);
elm_hover_content_set(item->submenu.hv, elm_hover_best_content_location_get(item->submenu.hv, ELM_HOVER_AXIS_VERTICAL), item->submenu.bx);
_elm_theme_object_set(item->base.widget, item->base.view, "menu", "item_with_submenu", elm_widget_style_get(item->base.widget));
elm_menu_item_label_set(item, item->label);
elm_menu_item_icon_set(item, item->icon);
elm_menu_item_icon_set(item, item->icon_str);
edje_object_signal_callback_add(item->base.view, "elm,action,open", "",
_submenu_open, item);
evas_object_event_callback_add(item->base.view, EVAS_CALLBACK_MOVE, _item_move_resize, item);
evas_object_event_callback_add(item->base.view, EVAS_CALLBACK_RESIZE, _item_move_resize, item);
evas_object_event_callback_add(item->bx, EVAS_CALLBACK_RESIZE, _menu_resize, item->base.widget);
evas_object_event_callback_add(item->submenu.bx, EVAS_CALLBACK_RESIZE, _menu_resize, item->base.widget);
}
/**
@ -469,10 +462,10 @@ elm_menu_parent_set(Evas_Object *obj, Evas_Object *parent)
{
EINA_LIST_FOREACH(l, _l, item)
{
if (item->hv)
if (item->submenu.hv)
{
elm_hover_parent_set(item->hv, parent);
ll = eina_list_append(ll, item->items);
elm_hover_parent_set(item->submenu.hv, parent);
ll = eina_list_append(ll, item->submenu.items);
}
}
}
@ -542,28 +535,39 @@ elm_menu_object_get(const Elm_Menu_Item *it)
* @ingroup Menu
*/
EAPI Elm_Menu_Item *
elm_menu_item_add(Evas_Object *obj, Elm_Menu_Item *parent, Evas_Object *icon, const char *label, Evas_Smart_Cb func, const void *data)
elm_menu_item_add(Evas_Object *obj, Elm_Menu_Item *parent, const char *icon, const char *label, Evas_Smart_Cb func, const void *data)
{
Elm_Menu_Item *subitem;
ELM_CHECK_WIDTYPE(obj, widtype) NULL;
Widget_Data *wd = elm_widget_data_get(obj);
Evas_Object *icon_obj;
if (!wd) return NULL;
icon_obj = elm_icon_add(obj);
if (!icon_obj) return NULL;
subitem = elm_widget_item_new(obj, Elm_Menu_Item);
if (!subitem) return NULL;
if (!subitem)
{
evas_object_del(icon_obj);
return NULL;
}
subitem->base.data = data;
subitem->func = func;
subitem->parent = parent;
subitem->icon = icon_obj;
_item_obj_create(subitem);
elm_menu_item_label_set(subitem, label);
elm_widget_sub_object_add(subitem->base.widget, subitem->icon);
edje_object_part_swallow(subitem->base.view, "elm.swallow.content", subitem->icon);
elm_menu_item_icon_set(subitem, icon);
if (parent)
{
if (!parent->bx) _item_submenu_obj_create(parent);
elm_box_pack_end(parent->bx, subitem->base.view);
parent->items = eina_list_append(parent->items, subitem);
if (!parent->submenu.bx) _item_submenu_obj_create(parent);
elm_box_pack_end(parent->submenu.bx, subitem->base.view);
parent->submenu.items = eina_list_append(parent->submenu.items, subitem);
}
else
{
@ -624,20 +628,21 @@ elm_menu_item_label_get(Elm_Menu_Item *item)
* @ingroup Menu
*/
EAPI void
elm_menu_item_icon_set(Elm_Menu_Item *item, Evas_Object *icon)
elm_menu_item_icon_set(Elm_Menu_Item *item, const char *icon)
{
if(item->icon == icon) return;
if (item->icon) evas_object_del(item->icon);
item->icon = icon;
if (icon)
char icon_tmp[512];
if (!item) return;
if (!icon || !*icon) return;
if (item->icon_str && !strcmp(item->icon_str, icon)) return;
if (snprintf(icon_tmp, sizeof(icon_tmp), "menu/%s", icon) > 0 &&
elm_icon_standard_set(item->icon, icon_tmp))
{
elm_widget_sub_object_add(item->base.widget, icon);
evas_object_event_callback_add(icon, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
_changed_size_hints, item->base.widget);
edje_object_part_swallow(item->base.view, "elm.swallow.content", icon);
eina_stringshare_replace(&item->icon_str, icon);
edje_object_signal_emit(item->base.view, "elm,state,icon,visible", "elm");
edje_object_message_signal_process(item->base.view);
}
else
edje_object_signal_emit(item->base.view, "elm,state,icon,hidden", "elm");
edje_object_message_signal_process(item->base.view);
_sizing_eval(item->base.widget);
}
@ -657,7 +662,7 @@ elm_menu_item_disabled_set(Elm_Menu_Item *item, Eina_Bool disabled)
if (disabled)
{
edje_object_signal_emit(item->base.view, "elm,state,disabled", "elm");
if (item->open) _submenu_hide(item);
if (item->submenu.open) _submenu_hide(item);
}
else
edje_object_signal_emit(item->base.view, "elm,state,enabled", "elm");
@ -712,36 +717,42 @@ elm_menu_item_separator_add(Evas_Object *obj, Elm_Menu_Item *parent)
}
else
{
if (!parent->bx) _item_submenu_obj_create(parent);
elm_box_pack_end(parent->bx, subitem->base.view);
parent->items = eina_list_append(parent->items, subitem);
if (!parent->submenu.bx) _item_submenu_obj_create(parent);
elm_box_pack_end(parent->submenu.bx, subitem->base.view);
parent->submenu.items = eina_list_append(parent->submenu.items, subitem);
}
_sizing_eval(obj);
return subitem;
}
/**
* Deletes an item from the menu.
* Get the icon object from a menu item
*
* @param item The item to delete
* @param it The menu item object
* @return The icon object or NULL if there's no icon
*
* @ingroup Menu
*/
EAPI const Evas_Object *
elm_menu_item_object_icon_get(Elm_Menu_Item *item)
{
if (!item) return NULL;
return (const Evas_Object *)item->icon;
}
/**
* Get the icon of a menu item
* Get the string representation from the icon of a menu item
*
* @param it The menu item object.
* @return The icon object of @p item or NULL
* @return The string representation of @p item's icon or NULL
*
* @ingroup Menu
*/
EAPI Evas_Object *
EAPI const char *
elm_menu_item_icon_get(Elm_Menu_Item *item)
{
if (!item) return NULL;
return item->icon;
return item->icon_str;
}
/**
@ -759,6 +770,13 @@ elm_menu_item_is_separator(Elm_Menu_Item *item)
return item->separator;
}
/**
* Deletes an item from the menu.
*
* @param item The item to delete.
*
* @ingroup Menu
*/
EAPI void
elm_menu_item_del(Elm_Menu_Item *item)
{
@ -767,14 +785,14 @@ elm_menu_item_del(Elm_Menu_Item *item)
if (!item) return;
elm_widget_item_pre_notify_del(item);
EINA_LIST_FREE(item->items, _item) elm_menu_item_del(_item);
EINA_LIST_FREE(item->submenu.items, _item) elm_menu_item_del(_item);
if (item->label) eina_stringshare_del(item->label);
if (item->icon) evas_object_del(item->icon);
if (item->hv) evas_object_del(item->hv);
if (item->location) evas_object_del(item->location);
if (item->submenu.hv) evas_object_del(item->submenu.hv);
if (item->submenu.location) evas_object_del(item->submenu.location);
if (item->parent)
item->parent->items = eina_list_remove(item->parent->items, item);
item->parent->submenu.items = eina_list_remove(item->parent->submenu.items, item);
else
{
Widget_Data *wd = elm_widget_data_get(item->base.widget);
@ -838,5 +856,5 @@ EAPI const Eina_List *
elm_menu_item_subitems_get(Elm_Menu_Item *item)
{
if (!item) return NULL;
return item->items;
return item->submenu.items;
}

View File

@ -358,14 +358,7 @@ _resize(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event
else
{
Elm_Menu_Item *item;
Evas_Object *icon = elm_icon_add(menu);
if (icon && !_item_icon_set(icon, "menu/", it->icon_str))
{
evas_object_del(icon);
icon = NULL;
}
item = elm_menu_item_add(menu, NULL, icon, it->label,
item = elm_menu_item_add(menu, NULL, it->icon_str, it->label,
it->func, it->base.data);
elm_menu_item_disabled_set(item, it->disabled);
}