summaryrefslogtreecommitdiff
path: root/src/util
diff options
context:
space:
mode:
authorJehun Lim <jehun.lim@samsung.com>2015-09-01 19:07:55 +0900
committerJehun Lim <jehun.lim@samsung.com>2015-09-02 17:38:22 +0900
commit2593f71d1089f11c8c4c437f177654a762d54cd9 (patch)
tree166c90c1b8f9d3c56d5dbb2fa37a45534750dd13 /src/util
parent55b4f7546852f21f5ca7e74baa5b92edd0144502 (diff)
downloadair_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.c195
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);
}