From: Radek Kintop Date: Tue, 8 Mar 2016 10:14:16 +0000 (+0100) Subject: Tab menu items 'selected' state implementation X-Git-Tag: accepted/tizen/tv/20160314.113326~13^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F15%2F61515%2F1;p=profile%2Ftv%2Fapps%2Fnative%2Fair_settings.git Tab menu items 'selected' state implementation Change-Id: I59bb1baaef06832984b2081b2c9640adbc0acf3b Signed-off-by: Radek Kintop --- diff --git a/include/common/listmgr.h b/include/common/listmgr.h index 8d85437..8bb6c4c 100644 --- a/include/common/listmgr.h +++ b/include/common/listmgr.h @@ -38,10 +38,10 @@ bool listmgr_update_list(struct listmgr *listmgr, const char *list_id); void listmgr_set_list_next_focus(struct listmgr *listmgr, const char *list_id, Evas_Object *obj_to_focus, Elm_Focus_Direction dir); -void listmgr_add_realized_cb(struct listmgr *listmgr, const char *list_id, +void listmgr_add_inner_grid_cb(struct listmgr *listmgr, const char *list_id, input_handler *handler, void *data); -void listmgr_remove_realized_cb(struct listmgr *listmgr, const char *list_id, +void listmgr_remove_inner_grid_cb(struct listmgr *listmgr, const char *list_id, input_handler *handler); #endif /* __AIR_SETTINGS_LISTMGR_H__ */ diff --git a/include/common/menumgr.h b/include/common/menumgr.h index 15e287e..d30bded 100644 --- a/include/common/menumgr.h +++ b/include/common/menumgr.h @@ -31,6 +31,7 @@ struct menumgr_info { char *(*status)(void *data, int id); float (*progress_value)(void); void (*selected)(void *data, int id); + void (*focused)(void *data, int id); void (*selected_menu)(void *data, int id); }; diff --git a/include/common/viewmgr.h b/include/common/viewmgr.h index f0172d4..f52b83a 100644 --- a/include/common/viewmgr.h +++ b/include/common/viewmgr.h @@ -42,6 +42,7 @@ typedef struct _view_class { enum update_type { UPDATE_FOCUS = 0, + UPDATE_SUB_ITEM_SELECTED, UPDATE_TITLE, UPDATE_CONTENT, UPDATE_ENABLE, diff --git a/include/define.h b/include/define.h index c54c513..940a171 100644 --- a/include/define.h +++ b/include/define.h @@ -155,6 +155,7 @@ #define SIG_ENABLED "elm,state,enabled" #define SIG_DISABLED "elm,state,disabled" #define SIG_SELECTED "selected" +#define SIG_UNSELECTED "unselected" #define SIG_NOTAVAILABLE "state,notavailable" #define SIG_ITEM_SELECTED "sig.item.selected" #define SIG_FAV_ADD "elm,state,favorite,add" diff --git a/res/widget/button.edc b/res/widget/button.edc index 28e746c..9135aea 100644 --- a/res/widget/button.edc +++ b/res/widget/button.edc @@ -21,7 +21,8 @@ group { name, "elm/button/base/style.menu.button"; data.item, "focus_highlight" "on"; script { - public cur_state; + public focused; + public selected; } parts { part { @@ -149,7 +150,7 @@ group { signal, SIG_FOCUSED; source, SRC_ELM; script { - set_int(cur_state, STATE_NORMAL); + set_int(focused, true); run_program(PROGRAM:"focused,anim"); } } @@ -160,14 +161,15 @@ group { source, SRC_ELM; script { new state; - state = get_int(cur_state); - if (state == STATE_SELECTED) { + state = get_int(selected); + if (state) { set_state(PART:"part.bg", "selected", 0.0); set_state(PART:"elm.text", "selected", 0.0); set_state(PART:"part.bottom.line", "selected", 0.0); } else { run_program(PROGRAM:"unfocused,anim"); } + set_int(focused, false); } } @@ -190,13 +192,32 @@ group { } program { - name, SIG_SELECTED; - signal, "selected"; + name, "selected"; + signal, SIG_SELECTED; script { - set_int(cur_state, STATE_SELECTED); set_state(PART:"part.bg", "selected", 0.0); set_state(PART:"elm.text", "selected", 0.0); set_state(PART:"part.bottom.line", "selected", 0.0); + set_int(selected, true); + } + } + + program { + name, "unselected"; + signal, SIG_UNSELECTED; + script { + new state; + state = get_int(focused); + if (state) { + set_state(PART:"part.bg", "focused", 0.0); + set_state(PART:"elm.text", "focused", 0.0); + set_state(PART:"part.bottom.line", "focused", 0.0); + } else { + set_state(PART:"part.bg", "default", 0.0); + set_state(PART:"elm.text", "default", 0.0); + set_state(PART:"part.bottom.line", "default", 0.0); + } + set_int(selected, false); } } } diff --git a/src/common/listmgr.c b/src/common/listmgr.c index c86885c..dfbad75 100644 --- a/src/common/listmgr.c +++ b/src/common/listmgr.c @@ -198,7 +198,7 @@ static bool _add_grid(struct list_info *linfo, Evas_Object *parent, return true; } -void listmgr_add_realized_cb(struct listmgr *listmgr, const char *list_id, +void listmgr_add_inner_grid_cb(struct listmgr *listmgr, const char *list_id, input_handler *handler, void *data) { struct list_info *linfo; @@ -219,7 +219,7 @@ void listmgr_add_realized_cb(struct listmgr *listmgr, const char *list_id, _DBG("realized callback added"); } -void listmgr_remove_realized_cb(struct listmgr *listmgr, const char *list_id, +void listmgr_remove_inner_grid_cb(struct listmgr *listmgr, const char *list_id, input_handler *handler) { struct list_info *linfo; diff --git a/src/common/menumgr.c b/src/common/menumgr.c index 019298f..c858a99 100644 --- a/src/common/menumgr.c +++ b/src/common/menumgr.c @@ -42,6 +42,7 @@ static void _mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) { SETTING_TRACE_BEGIN; + if (!obj) { _ERR("Invalid argument."); return; @@ -100,10 +101,23 @@ static void _clicked_cb(int id, void *data, Evas_Object *obj) } } +static void _focused(int id, void *data, Evas_Object *obj, + Elm_Object_Item *item) +{ + struct menumgr *m = (struct menumgr *)data; + + if (!obj || !m) + return; + + if (m->info[id] && m->info[id]->focused) + m->info[id]->focused(m->data, id); +} + static input_handler _handler = { .mouse_move = _mouse_move_cb, .key_down = _key_down_cb, .clicked = _clicked_cb, + .focused = _focused }; void menumgr_update(struct menumgr *m) diff --git a/src/layout/layout_channel.c b/src/layout/layout_channel.c index 4ea2660..c452845 100644 --- a/src/layout/layout_channel.c +++ b/src/layout/layout_channel.c @@ -64,6 +64,7 @@ static void _mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj, Evas_E static void _popup_clicked_cb(int id, void *data, Evas_Object *obj); static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev); static void _mouse_down_cb(int id, void *data, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Down *ev); +static void _focused(int id, void *data, Evas_Object *obj, Elm_Object_Item *item); static void _stop_popup_show(struct _priv *priv); static void _stop_popup_create(struct _priv *priv); @@ -72,13 +73,14 @@ static layout_class _lclass = { .create = _create, .show = _show, .hide = _hide, - .destroy = _destroy, + .destroy = _destroy }; static input_handler _input_handler = { .mouse_move = _mouse_move_cb, .key_down = _key_down_cb, .mouse_down = _mouse_down_cb, + .focused = _focused }; static input_handler _popup_input_handler = { @@ -377,6 +379,11 @@ static void _mouse_down_cb(int id, void *data, Evas *e, Evas_Object *obj, Evas_E _button_selected(priv); } +static void _focused(int id, void *data, Evas_Object *obj, Elm_Object_Item *item) +{ + viewmgr_update_view(VIEW_BASE, UPDATE_SUB_ITEM_SELECTED, (void *)LAYOUT_CHANNEL); +} + static bool _create(layoutmgr *lmgr, void *data) { struct _priv *priv = NULL; diff --git a/src/layout/layout_network.c b/src/layout/layout_network.c index 708812d..9ff4718 100644 --- a/src/layout/layout_network.c +++ b/src/layout/layout_network.c @@ -434,19 +434,27 @@ static void _grid_realized_cb(int id, void *data, Evas_Object *obj, } } +static void _focused(int id, void *data, Evas_Object *obj, Elm_Object_Item *item) +{ + viewmgr_update_view(VIEW_BASE, UPDATE_SUB_ITEM_SELECTED, (void *)LAYOUT_NETWORK); +} + static input_handler _network_type_input_handler = { .mouse_move = _mouse_move_cb, .mouse_down = _network_type_mouse_down_cb, .key_down = _network_type_key_down_cb, + .focused = _focused }; static input_handler _action_input_handler = { .mouse_move = _mouse_move_cb, .key_down = _action_key_down_cb, + .focused = _focused }; static input_handler _grid_input_handler = { .realized = _grid_realized_cb, + .focused = _focused }; static void _draw_no_contents_message(struct _priv *priv) @@ -956,7 +964,7 @@ static bool _create(layoutmgr *lmgr, void *data) layoutmgr_set_layout_data(lmgr, LAYOUT_ID_NETWORK, priv); - listmgr_add_realized_cb(priv->listmgr, LIST_WIRELESS, + listmgr_add_inner_grid_cb(priv->listmgr, LIST_WIRELESS, &_grid_input_handler, NULL); return true; @@ -1022,7 +1030,7 @@ static void _destroy(void *layout_data) datamgr_destroy(priv->wirelessmgr); if (priv->listmgr) { - listmgr_remove_realized_cb(priv->listmgr, LIST_WIRELESS, + listmgr_remove_inner_grid_cb(priv->listmgr, LIST_WIRELESS, &_grid_input_handler); listmgr_destroy(priv->listmgr); } diff --git a/src/layout/layout_picture.c b/src/layout/layout_picture.c index e4c8a8a..5f7b0d3 100644 --- a/src/layout/layout_picture.c +++ b/src/layout/layout_picture.c @@ -57,6 +57,7 @@ static char *_get_color(void *data, int id); static char *_get_tint(void *data, int id); static char *_get_screen_adj(void *data, int id); static void _selected(void *data, int id); +static void _focused(void *data, int id); static void _selected_menu(void *data, int id); /* Class functions: */ @@ -76,6 +77,7 @@ static struct menumgr_info menu_info[] = { .progress_value = NULL, .progress_evas = NULL, .selected = _selected, + .focused = _focused, .selected_menu = _selected_menu }, { @@ -87,6 +89,7 @@ static struct menumgr_info menu_info[] = { .progress_value = settings_picture_get_contrast_relative, .progress_evas = NULL, .selected = _selected, + .focused = _focused, .selected_menu = _selected_menu }, { @@ -98,6 +101,7 @@ static struct menumgr_info menu_info[] = { .progress_value = settings_picture_get_brightness_relative, .progress_evas = NULL, .selected = _selected, + .focused = _focused, .selected_menu = _selected_menu }, { @@ -109,6 +113,7 @@ static struct menumgr_info menu_info[] = { .progress_value = settings_picture_get_sharpness_relative, .progress_evas = NULL, .selected = _selected, + .focused = _focused, .selected_menu = _selected_menu }, { @@ -120,6 +125,7 @@ static struct menumgr_info menu_info[] = { .progress_value = settings_picture_get_color_relative, .progress_evas = NULL, .selected = _selected, + .focused = _focused, .selected_menu = _selected_menu }, { @@ -131,6 +137,7 @@ static struct menumgr_info menu_info[] = { .progress_value = settings_picture_get_tint_relative, .progress_evas = NULL, .selected = _selected, + .focused = _focused, .selected_menu = _selected_menu }, { @@ -142,6 +149,7 @@ static struct menumgr_info menu_info[] = { .progress_value = NULL, .progress_evas = NULL, .selected = _selected, + .focused = _focused, .selected_menu = _selected_menu }, }; @@ -265,6 +273,11 @@ static void _selected(void *data, int id) } } +static void _focused(void *data, int id) +{ + viewmgr_update_view(VIEW_BASE, UPDATE_SUB_ITEM_SELECTED, (void *)LAYOUT_PICTURE); +} + static void _selected_menu(void *data, int id) { switch (id) diff --git a/src/layout/layout_sound.c b/src/layout/layout_sound.c index 3e99aa4..a3b9e90 100644 --- a/src/layout/layout_sound.c +++ b/src/layout/layout_sound.c @@ -28,6 +28,7 @@ #include "common/listmgr.h" #include "common/datamgr.h" #include "grid/grid_sound.h" +#include "common/viewmgr.h" #define SOUND_MODES_COUNT 3 @@ -73,7 +74,6 @@ struct _priv { int speakers_count; }; - static bool _select_item(Elm_Object_Item *it, struct _priv *priv, Elm_Object_Item *prev_it, const char *list_id); static void _sound_mode_selected_cb(Elm_Object_Item *it, void *data); @@ -86,6 +86,8 @@ static void _show(void *layout_data); static void _hide(void *layout_data); static void _destroy(void *layout_data); +static void _grid_focused(int id, void *data, Evas_Object *obj, Elm_Object_Item *item); + static layout_class _lclass = { .layout_id = LAYOUT_ID_SOUND, .create = _create, @@ -94,12 +96,15 @@ static layout_class _lclass = { .destroy = _destroy, }; +static input_handler grid_handler = { + .focused = _grid_focused +}; + layout_class *layout_sound_get_lclass(void) { return &_lclass; } - static bool _create(layoutmgr *lmgr, void *data) { struct _priv *priv = NULL; @@ -158,6 +163,8 @@ static bool _create(layoutmgr *lmgr, void *data) return false; } + listmgr_add_inner_grid_cb(priv->list_mgr, LIST_SOUND_MODES_ID, &grid_handler, NULL); + if (!listmgr_add_list(priv->list_mgr, LIST_SPEAKERS_ID, get_sound_grid_class(), _speaker_selected_cb, priv)) { _ERR("Add location list failed."); @@ -167,6 +174,8 @@ static bool _create(layoutmgr *lmgr, void *data) return false; } + listmgr_add_inner_grid_cb(priv->list_mgr, LIST_SPEAKERS_ID, &grid_handler, NULL); + if(data) { listmgr_set_list_next_focus(priv->list_mgr, LIST_SOUND_MODES_ID, (Evas_Object *)data, ELM_FOCUS_UP); @@ -224,6 +233,9 @@ static void _destroy(void *layout_data) return; } + listmgr_remove_inner_grid_cb(priv->list_mgr, LIST_SOUND_MODES_ID, &grid_handler); + listmgr_remove_inner_grid_cb(priv->list_mgr, LIST_SPEAKERS_ID, &grid_handler); + evas_object_del(priv->ly); listmgr_destroy(priv->list_mgr); @@ -233,6 +245,11 @@ static void _destroy(void *layout_data) free(priv); } +static void _grid_focused(int id, void *data, Evas_Object *obj, Elm_Object_Item *item) +{ + viewmgr_update_view(VIEW_BASE, UPDATE_SUB_ITEM_SELECTED, (void *)LAYOUT_SOUND); +} + static bool _select_item(Elm_Object_Item *it, struct _priv *priv, Elm_Object_Item *prev_it, const char *list_id) { diff --git a/src/layout/layout_system.c b/src/layout/layout_system.c index 7b1c34d..f8d6343 100644 --- a/src/layout/layout_system.c +++ b/src/layout/layout_system.c @@ -65,6 +65,7 @@ static char *_get_subtitle(void *data, int id); static char *_get_location(void *data, int id); static void _selected(void *data, int id); +static void _focused(void *data, int id); static void _selected_menu(void *data, int id); static void _location_selected(void *data, int id); @@ -77,6 +78,7 @@ static struct menumgr_info menu_info[] = { .favorite = EINA_TRUE, .status = _get_clock_mode, .selected = _selected, + .focused = _focused, .selected_menu = _selected_menu }, { @@ -86,6 +88,7 @@ static struct menumgr_info menu_info[] = { .disabled = EINA_FALSE, .status = _get_sleep_timer, .selected = _selected, + .focused = _focused, .selected_menu = _selected_menu }, { @@ -95,6 +98,7 @@ static struct menumgr_info menu_info[] = { .disabled = EINA_FALSE, .status = _get_wakeup_timer, .selected = _selected, + .focused = _focused, .selected_menu = _selected_menu }, { @@ -103,6 +107,7 @@ static struct menumgr_info menu_info[] = { .style = STYLE_NORMAL_BTN, .disabled = EINA_FALSE, .selected = _selected, + .focused = _focused, .selected_menu = _selected_menu }, { @@ -112,6 +117,7 @@ static struct menumgr_info menu_info[] = { .disabled = EINA_FALSE, .status = _get_language, .selected = _selected, + .focused = _focused, .selected_menu = _selected_menu }, { @@ -121,6 +127,7 @@ static struct menumgr_info menu_info[] = { .disabled = EINA_FALSE, .status = _get_subtitle, .selected = _selected, + .focused = _focused, .selected_menu = _selected_menu }, { @@ -130,6 +137,7 @@ static struct menumgr_info menu_info[] = { .disabled = EINA_FALSE, .status = _get_location, .selected = _location_selected, + .focused = _focused, .selected_menu = _selected_menu }, { @@ -138,6 +146,7 @@ static struct menumgr_info menu_info[] = { .style = STYLE_NORMAL_BTN, .disabled = EINA_FALSE, .selected = _selected, + .focused = _focused, .selected_menu = _selected_menu }, }; @@ -243,6 +252,11 @@ static void _selected(void *data, int id) } } +static void _focused(void *data, int id) +{ + viewmgr_update_view(VIEW_BASE, UPDATE_SUB_ITEM_SELECTED, (void *)LAYOUT_SYSTEM); +} + static void _selected_menu(void *data, int id) { switch (id) diff --git a/src/view/system/view_location.c b/src/view/system/view_location.c index ce2130b..80a2590 100644 --- a/src/view/system/view_location.c +++ b/src/view/system/view_location.c @@ -363,7 +363,7 @@ static Evas_Object *_create(Evas_Object *win, void *data) return NULL; } - listmgr_add_realized_cb(priv->list_mgr, LOCATION_LIST_ID, + listmgr_add_inner_grid_cb(priv->list_mgr, LOCATION_LIST_ID, &_grid_input_handler, NULL); _fill_list_data(priv); @@ -418,7 +418,7 @@ static void _destroy(void *data) datamgr_destroy(priv->country_data_mgr); - listmgr_remove_realized_cb(priv->list_mgr, LOCATION_LIST_ID, + listmgr_remove_inner_grid_cb(priv->list_mgr, LOCATION_LIST_ID, &_grid_input_handler); listmgr_destroy(priv->list_mgr); diff --git a/src/view/view_base.c b/src/view/view_base.c index 9d9dd40..b2102d8 100644 --- a/src/view/view_base.c +++ b/src/view/view_base.c @@ -131,7 +131,8 @@ static void _menu_focused_cb(int id, void *data, Evas_Object *obj, Elm_Object_Item *it) { struct _priv *priv; - int i; + int i = -1; + int j = 0; if (!data || !obj) { _ERR("Invalid argument."); @@ -140,9 +141,10 @@ static void _menu_focused_cb(int id, void *data, Evas_Object *obj, priv = data; - for (i = 0; i < LAYOUT_MAX; i++) { - if (priv->menu[i] == obj) - break; + for (j = 0; j < LAYOUT_MAX; j++) { + elm_layout_signal_emit(priv->menu[j], SIG_UNSELECTED, ""); + if (priv->menu[j] == obj) + i = j; } if (i == priv->cur_menu) { @@ -342,6 +344,11 @@ static void _update(void *view_data, int update_type, void *data) case UPDATE_FOCUS: elm_object_focus_set(priv->menu[priv->cur_menu], EINA_TRUE); break; + case UPDATE_SUB_ITEM_SELECTED: + for (i = 0; i < LAYOUT_MAX; i++) + elm_layout_signal_emit(priv->menu[i], SIG_UNSELECTED, ""); + elm_layout_signal_emit(priv->menu[priv->cur_menu], SIG_SELECTED, ""); + break; case UPDATE_TITLE: elm_object_part_text_set(priv->base, PART_TOP_TITLE, _(STR_SETTINGS)); // tabbar buttons