From 397a58137ef8c369f9704791b4e59520202da71a Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Thu, 1 Oct 2020 17:59:26 +0100 Subject: [PATCH] e menus - keep parent menu items activated when browsing child items --- src/bin/e_menu.c | 65 ++++++++++++++++++++++++++++++++---------------- src/bin/e_menu.h | 1 + 2 files changed, 45 insertions(+), 21 deletions(-) diff --git a/src/bin/e_menu.c b/src/bin/e_menu.c index c205ff8a5..60dc12a27 100644 --- a/src/bin/e_menu.c +++ b/src/bin/e_menu.c @@ -456,6 +456,34 @@ e_menu_activate(E_Menu *m, E_Zone *zone, int x, int y, int w, int h, int dir) if (pmi) e_menu_item_active_set(pmi, 0); } +static void +_e_menu_item_unhilight(E_Menu_Item *mi) +{ + if (!mi->hilighted) return; + mi->hilighted = 0; + if (mi->bg_object) + edje_object_signal_emit(mi->bg_object, "e,state,unselected", "e"); + if (mi->icon_bg_object) + edje_object_signal_emit(mi->icon_bg_object, "e,state,unselected", "e"); + if (isedje(mi->label_object)) + edje_object_signal_emit(mi->label_object, "e,state,unselected", "e"); + if (isedje(mi->submenu_object)) + edje_object_signal_emit(mi->submenu_object, "e,state,unselected", "e"); + if (isedje(mi->toggle_object)) + edje_object_signal_emit(mi->toggle_object, "e,state,unselected", "e"); + if (mi->icon_key) + { + if (mi->icon_object) + { + if (isedje(mi->icon_object)) + edje_object_signal_emit(mi->icon_object, "e,state,unselected", "e"); + else + e_icon_selected_set(mi->icon_object, EINA_FALSE); + } + } + edje_object_signal_emit(mi->menu->bg_object, "e,state,unselected", "e"); +} + E_API void e_menu_deactivate(E_Menu *m) { @@ -475,6 +503,8 @@ e_menu_deactivate(E_Menu *m) m->active = 0; if (m->post_deactivate_cb.func) m->post_deactivate_cb.func(m->post_deactivate_cb.data, m); + if (m->parent_item) + _e_menu_item_unhilight(m->parent_item); } E_API int @@ -1030,6 +1060,7 @@ e_menu_item_active_set(E_Menu_Item *mi, int active) _e_menu_submenu_deactivate(_e_prev_active_menu_item); } mi->active = 1; + mi->hilighted = 1; _e_active_menu_item = mi; if (mi->bg_object) edje_object_signal_emit(mi->bg_object, "e,state,selected", "e"); @@ -1060,27 +1091,8 @@ e_menu_item_active_set(E_Menu_Item *mi, int active) mi->active = 0; _e_prev_active_menu_item = mi; _e_active_menu_item = NULL; - if (mi->bg_object) - edje_object_signal_emit(mi->bg_object, "e,state,unselected", "e"); - if (mi->icon_bg_object) - edje_object_signal_emit(mi->icon_bg_object, "e,state,unselected", "e"); - if (isedje(mi->label_object)) - edje_object_signal_emit(mi->label_object, "e,state,unselected", "e"); - if (isedje(mi->submenu_object)) - edje_object_signal_emit(mi->submenu_object, "e,state,unselected", "e"); - if (isedje(mi->toggle_object)) - edje_object_signal_emit(mi->toggle_object, "e,state,unselected", "e"); - if (mi->icon_key) - { - if (mi->icon_object) - { - if (isedje(mi->icon_object)) - edje_object_signal_emit(mi->icon_object, "e,state,unselected", "e"); - else - e_icon_selected_set(mi->icon_object, EINA_FALSE); - } - } - edje_object_signal_emit(mi->menu->bg_object, "e,state,unselected", "e"); + if (!((mi->submenu) && (mi->submenu->active))) + _e_menu_item_unhilight(mi); } _e_menu_list_free_unref(tmp); } @@ -2355,6 +2367,17 @@ _e_menu_activate_previous(void) { if (mi->menu->parent_item) { + Eina_List *l; + E_Menu_Item *mi2; + + EINA_LIST_FOREACH(mi->menu->items, l, mi2) + { + if (!mi2->disable) + { + e_menu_item_active_set(mi2, 0); + _e_menu_item_unhilight(mi2); + } + } mi = mi->menu->parent_item; e_menu_item_active_set(mi, 1); _e_menu_item_ensure_onscreen(mi); diff --git a/src/bin/e_menu.h b/src/bin/e_menu.h index 8d6664fcc..514c721f0 100644 --- a/src/bin/e_menu.h +++ b/src/bin/e_menu.h @@ -141,6 +141,7 @@ struct _E_Menu_Item Eina_Bool changed E_BITFIELD; Eina_Bool active E_BITFIELD; Eina_Bool disable E_BITFIELD; + Eina_Bool hilighted E_BITFIELD; }; struct _E_Menu_Category_Callback