diff options
author | Jehun Lim <jehun.lim@samsung.com> | 2015-09-01 19:07:55 +0900 |
---|---|---|
committer | Jehun Lim <jehun.lim@samsung.com> | 2015-09-02 17:38:22 +0900 |
commit | 2593f71d1089f11c8c4c437f177654a762d54cd9 (patch) | |
tree | 166c90c1b8f9d3c56d5dbb2fa37a45534750dd13 /src/util | |
parent | 55b4f7546852f21f5ca7e74baa5b92edd0144502 (diff) | |
download | air_mediahub-2593f71d1089f11c8c4c437f177654a762d54cd9.tar.gz air_mediahub-2593f71d1089f11c8c4c437f177654a762d54cd9.tar.bz2 air_mediahub-2593f71d1089f11c8c4c437f177654a762d54cd9.zip |
listmgr: add focus policy for view button in base view
Change-Id: I9a04de166c414964b17c606a8a6350b0df1035a7
Signed-off-by: Jehun Lim <jehun.lim@samsung.com>
Diffstat (limited to 'src/util')
-rw-r--r-- | src/util/listmgr.c | 195 |
1 files changed, 145 insertions, 50 deletions
diff --git a/src/util/listmgr.c b/src/util/listmgr.c index f62d21e..2f0cda0 100644 --- a/src/util/listmgr.c +++ b/src/util/listmgr.c @@ -54,6 +54,59 @@ struct listmgr { Eina_Bool focus_state; }; +static void _index_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *ei) +{ + Evas_Object *grid; + Elm_Object_Item *it; + Evas_Event_Key_Down *ev; + struct listmgr *lmgr; + + if (!data || !obj || !ei) + return; + + lmgr = data; + ev = ei; + + if (!strcmp(ev->keyname, KEY_BACK) || + !strcmp(ev->keyname, KEY_BACK_REMOTE)) { + elm_object_focus_next(obj, ELM_FOCUS_UP); + } else if (!strcmp(ev->keyname, KEY_DOWN)) { + if (lmgr->play_info == lmgr->focused) + return; + + grid = elm_object_part_content_get(lmgr->focused, + PART_ITEM_CONTENT); + it = elm_gengrid_first_item_get(grid); + if (it) + elm_object_item_focus_set(it, EINA_TRUE); + } +} + +static void _view_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *ei) +{ + Evas_Object *play_info; + Evas_Event_Key_Down *ev; + struct listmgr *lmgr; + + if (!data || !ei) + return; + + lmgr = data; + ev = ei; + + if (!evas_object_visible_get(lmgr->base)) + return; + + if (!strcmp(ev->keyname, KEY_UP)) { + if (lmgr->focused == lmgr->play_info) { + play_info = elm_object_part_content_get(lmgr->focused, + PART_ITEM_CONTENT); + elm_object_focus_set(play_info, EINA_TRUE); + } else + elm_object_item_focus_set(lmgr->focused_it, EINA_TRUE); + } +} + static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { @@ -66,25 +119,6 @@ static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, lmgr = data; switch (id) { - case LISTMGR_INDEX: - if (!strcmp(ev->keyname, KEY_BACK) || - !strcmp(ev->keyname, KEY_BACK_REMOTE)) { - elm_object_focus_next(obj, ELM_FOCUS_UP); - } else if (!strcmp(ev->keyname, KEY_DOWN)) { - Evas_Object *grid; - Elm_Object_Item *it; - - if (lmgr->play_info == lmgr->focused) - break; - - grid = elm_object_part_content_get(lmgr->focused, - PART_ITEM_CONTENT); - it = elm_gengrid_first_item_get(grid); - if (it) - elm_object_item_focus_set(it, EINA_TRUE); - } - - break; case LISTMGR_PLAY_INFO: case LISTMGR_GRID: if (!strcmp(ev->keyname, KEY_BACK) || @@ -251,7 +285,7 @@ static input_handler _grid_handler = { .key_down = _key_down_cb, .mouse_move = _mouse_move_cb, .focused = _focused_cb, - .selected = _grid_selected_cb, + .selected = _grid_selected_cb }; static input_handler _handler = { @@ -261,6 +295,12 @@ static input_handler _handler = { .focused = _focused_cb }; +static input_handler _idx_handler = { + .mouse_move = _mouse_move_cb, + .clicked = _clicked_cb, + .focused = _focused_cb +}; + static Evas_Object *_get_box_first_item(Evas_Object *box) { Eina_List *list; @@ -310,7 +350,7 @@ static bool _draw_play_info(struct listmgr *lmgr) index = elm_object_part_content_get(ly, PART_ITEM_TITLE); - inputmgr_add_callback(index, LISTMGR_INDEX, &_handler, lmgr); + inputmgr_add_callback(index, LISTMGR_INDEX, &_idx_handler, lmgr); elm_object_focus_next_object_set(index, lmgr->data->menu_btn, ELM_FOCUS_UP); @@ -327,51 +367,51 @@ static bool _draw_play_info(struct listmgr *lmgr) return true; } -static Evas_Object *_draw_list_item(struct listmgr *lmgr, struct group_info *gi) +static Evas_Object *_add_list_item_button(struct listmgr *lmgr, + Evas_Object *base, struct group_info *gi) { - Evas_Object *ly, *btn, *grid; - struct listmgr_data *data; - int width; + Evas_Object *btn; char buf[128]; - data = lmgr->data; - - ly = elm_layout_add(lmgr->box); - if (!ly) { - _ERR("failed to create layout object"); - return NULL; - } - - elm_layout_file_set(ly, EDJEFILE, GRP_LIST_ITEM); + snprintf(buf, sizeof(buf), " %s ", gi->name); - btn = elm_button_add(ly); + btn = util_add_button(base, STYLE_BTN_INDEX, buf); if (!btn) { - _ERR("failed to create button object"); - evas_object_del(ly); + _ERR("failed to add button object"); return NULL; } - elm_object_style_set(btn, STYLE_BTN_INDEX); - - snprintf(buf, sizeof(buf), " %s ", gi->name); - elm_object_text_set(btn, buf); - elm_object_focus_next_object_set(btn, lmgr->data->menu_btn, ELM_FOCUS_UP); + elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_DOWN); + + inputmgr_add_callback(btn, LISTMGR_INDEX, &_idx_handler, lmgr); + evas_object_event_callback_priority_add(btn, EVAS_CALLBACK_KEY_DOWN, + EVAS_CALLBACK_PRIORITY_AFTER, + _index_key_down_cb, lmgr); + + return btn; +} - inputmgr_add_callback(btn, LISTMGR_INDEX, &_handler, lmgr); +static Evas_Object *_add_list_item_grid(struct listmgr *lmgr, + Evas_Object *base, struct group_info *gi) +{ + Evas_Object *grid; + struct listmgr_data *data; + int width; - grid = util_add_gengrid(ly, data->grid_item_x, + data = lmgr->data; + + grid = util_add_gengrid(base, data->grid_item_x, data->grid_item_y, EINA_TRUE); if (!grid) { - _ERR("failed to create gengrid object"); - evas_object_del(ly); + _ERR("failed to add gengrid object"); return NULL; } if (!gridmgr_add_grid(lmgr->gmgr, gi->name, grid, data->gops->gclass)) { _ERR("failed to add grid"); - evas_object_del(ly); + evas_object_del(grid); return NULL; } @@ -381,10 +421,41 @@ static Evas_Object *_draw_list_item(struct listmgr *lmgr, struct group_info *gi) evas_object_size_hint_min_set(grid, width, data->grid_num_item * data->grid_item_y); - elm_object_focus_next_object_set(grid, btn, ELM_FOCUS_UP); + elm_object_focus_next_object_set(grid, data->view_btn, ELM_FOCUS_DOWN); inputmgr_add_callback(grid, LISTMGR_GRID, &_grid_handler, lmgr); + return grid; +} + +static Evas_Object *_draw_list_item(struct listmgr *lmgr, struct group_info *gi) +{ + Evas_Object *ly, *btn, *grid; + + ly = elm_layout_add(lmgr->box); + if (!ly) { + _ERR("failed to create layout object"); + return NULL; + } + + elm_layout_file_set(ly, EDJEFILE, GRP_LIST_ITEM); + + btn = _add_list_item_button(lmgr, ly, gi); + if (!btn) { + _ERR("failed to add button"); + evas_object_del(ly); + return NULL; + } + + grid = _add_list_item_grid(lmgr, ly, gi); + if (!grid) { + _ERR("failed to add grid"); + evas_object_del(ly); + return NULL; + } + + elm_object_focus_next_object_set(grid, btn, ELM_FOCUS_UP); + elm_object_part_content_set(ly, PART_ITEM_TITLE, btn); elm_object_part_content_set(ly, PART_ITEM_CONTENT, grid); @@ -509,6 +580,28 @@ void _update_grid_realized_items(struct listmgr *lmgr, Eina_List *list) elm_gengrid_item_update(it); } +static void _set_callback_view_btn(struct listmgr *lmgr) +{ + struct listmgr_data *data; + + data = lmgr->data; + + /* NOTE: focus problem handling + * When UP key is pressed on view button, + * focus is set to content object in key_down callback function. + * After grid object gets focus, UP key down event is handled again + * and focus is moved to index button. + * To fix this problem, we delay executing key_down callback function + * for view button by setting event priority value. + */ + elm_object_focus_next_object_set(data->view_btn, data->view_btn, + ELM_FOCUS_UP); + evas_object_event_callback_priority_add(data->view_btn, + EVAS_CALLBACK_KEY_DOWN, + EVAS_CALLBACK_PRIORITY_AFTER, _view_key_down_cb, + lmgr); +} + bool listmgr_update_content_item(struct listmgr *lmgr) { Eina_List *box_item, *grid_realized; @@ -670,6 +763,8 @@ bool listmgr_draw_list_area(struct listmgr *lmgr) elm_object_focus_allow_set(scr, EINA_FALSE); + _set_callback_view_btn(lmgr); + return true; } @@ -721,7 +816,7 @@ void listmgr_destroy(struct listmgr *lmgr) content = elm_object_part_content_get(lmgr->play_info, PART_ITEM_CONTENT); - inputmgr_remove_callback(btn, &_handler); + inputmgr_remove_callback(btn, &_idx_handler); inputmgr_remove_callback(content, &_handler); elm_object_signal_callback_del(content, SIG_ITEM_SELECTED, @@ -736,7 +831,7 @@ void listmgr_destroy(struct listmgr *lmgr) btn = elm_object_part_content_get(ly, PART_ITEM_TITLE); grid = elm_object_part_content_get(ly, PART_ITEM_CONTENT); - inputmgr_remove_callback(btn, &_handler); + inputmgr_remove_callback(btn, &_idx_handler); inputmgr_remove_callback(grid, &_grid_handler); } |