diff --git a/legacy/elementary/src/bin/test_menu.c b/legacy/elementary/src/bin/test_menu.c index 9d5ee71033..544ad09b7c 100644 --- a/legacy/elementary/src/bin/test_menu.c +++ b/legacy/elementary/src/bin/test_menu.c @@ -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); diff --git a/legacy/elementary/src/bin/test_toolbar.c b/legacy/elementary/src/bin/test_toolbar.c index 6906410fdc..de87b8f9fd 100644 --- a/legacy/elementary/src/bin/test_toolbar.c +++ b/legacy/elementary/src/bin/test_toolbar.c @@ -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); diff --git a/legacy/elementary/src/lib/Elementary.h.in b/legacy/elementary/src/lib/Elementary.h.in index 50cf74a4e2..47a633c536 100644 --- a/legacy/elementary/src/lib/Elementary.h.in +++ b/legacy/elementary/src/lib/Elementary.h.in @@ -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. */ diff --git a/legacy/elementary/src/lib/elm_menu.c b/legacy/elementary/src/lib/elm_menu.c index 1d5abc5e06..6c3c58387c 100644 --- a/legacy/elementary/src/lib/elm_menu.c +++ b/legacy/elementary/src/lib/elm_menu.c @@ -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; } diff --git a/legacy/elementary/src/lib/elm_toolbar.c b/legacy/elementary/src/lib/elm_toolbar.c index 0c16f38111..be68445625 100644 --- a/legacy/elementary/src/lib/elm_toolbar.c +++ b/legacy/elementary/src/lib/elm_toolbar.c @@ -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); }