elementary/scroller: fix to skip focus for unfocusable scroller

Summary:
There is a issue about passing the focus to unfocusable scroller.
To prevent the issue, check the status of focusable object and child object
before passing the focus.

Test Plan:
{F38439}

I changed the test file.
The problem occured as below.

1. click button
2. show popup
3. click cancel button in popup
4. lost the focus

Reviewers: Hermet, raster, cedric

Reviewed By: cedric

Subscribers: minkyu, sju27, cedric, jpeg

Differential Revision: https://phab.enlightenment.org/D4056

Signed-off-by: Cedric BAIL <cedric@osg.samsung.com>
This commit is contained in:
soohye 2016-06-22 16:55:07 -07:00 committed by Cedric BAIL
parent 71c1481e57
commit 7908431178
3 changed files with 106 additions and 0 deletions

View File

@ -165,6 +165,7 @@ void test_scroller(void *data, Evas_Object *obj, void *event_info);
void test_scroller2(void *data, Evas_Object *obj, void *event_info);
void test_scroller3(void *data, Evas_Object *obj, void *event_info);
void test_scroller4(void *data, Evas_Object *obj, void *event_info);
void test_scroller5(void *data, Evas_Object *obj, void *event_info);
void test_spinner(void *data, Evas_Object *obj, void *event_info);
void test_index(void *data, Evas_Object *obj, void *event_info);
void test_index2(void *data, Evas_Object *obj, void *event_info);
@ -803,6 +804,7 @@ add_tests:
ADD_TEST(NULL, "Scroller", "Scroller 2", test_scroller2);
ADD_TEST(NULL, "Scroller", "Scroller 3", test_scroller3);
ADD_TEST(NULL, "Scroller", "Page Scroller", test_scroller4);
ADD_TEST(NULL, "Scroller", "Scroller on Popup", test_scroller5);
//------------------------------//
// FIXME: add frame test

View File

@ -728,3 +728,103 @@ test_scroller4(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event
evas_object_resize(win, 400, 550);
evas_object_show(win);
}
static void
_popup_btn_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
evas_object_del(data);
}
static void
_block_clicked_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
{
evas_object_del(obj);
}
static void
_btn_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
Evas_Object *win = data;
Evas_Object *popup, *scr, *lbl, *btn, *rect, *tbl;
popup = elm_popup_add(win);
elm_object_part_text_set(popup, "title,text", "Scroller on Popup");
evas_object_smart_callback_add(popup, "block,clicked",
_block_clicked_cb, NULL);
tbl = elm_table_add(popup);
elm_object_content_set(popup, tbl);
evas_object_show(tbl);
rect = evas_object_rectangle_add(evas_object_evas_get(popup));
evas_object_size_hint_min_set(rect, 200, 50);
elm_table_pack(tbl, rect, 0, 0, 1, 1);
scr = elm_scroller_add(popup);
elm_object_focus_allow_set(scr, EINA_FALSE);
evas_object_size_hint_weight_set(scr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(scr, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_show(scr);
lbl = elm_label_add(scr);
elm_object_text_set(lbl,
"Do you want close the popup?<br>"
"Please select cancel button<br><br>"
"Do you wnat close the popup?<br>"
"Please select cancel button");
evas_object_size_hint_weight_set(lbl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(lbl, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_object_content_set(scr, lbl);
evas_object_show(lbl);
elm_table_pack(tbl, scr, 0, 0, 1, 1);
btn = elm_button_add(popup);
elm_object_text_set(btn, "Cancel");
elm_object_part_content_set(popup, "button1", btn);
evas_object_smart_callback_add(btn, "clicked", _popup_btn_clicked_cb, popup);
evas_object_show(btn);
evas_object_show(popup);
elm_object_focus_set(btn, EINA_TRUE);
}
static void
_focused_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
printf("focused");
}
void
test_scroller5(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
Evas_Object *win, *bx, *btn;
win = elm_win_util_standard_add("Scroller on Popup", "Scroller on Popup");
elm_win_autodel_set(win, EINA_TRUE);
elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
bx = elm_box_add(win);
evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_win_resize_object_add(win, bx);
evas_object_show(bx);
btn = elm_button_add(bx);
elm_object_text_set(btn, "Button 1");
evas_object_smart_callback_add(btn, "clicked", _btn_clicked_cb, win);
evas_object_smart_callback_add(btn, "focused", _focused_cb, NULL);
elm_box_pack_end(bx, btn);
evas_object_show(btn);
btn = elm_button_add(bx);
elm_object_text_set(btn, "Button 2");
evas_object_smart_callback_add(btn, "clicked", _btn_clicked_cb, win);
evas_object_smart_callback_add(btn, "focused", _focused_cb, NULL);
elm_box_pack_end(bx, btn);
evas_object_show(btn);
elm_object_focus_set(btn, EINA_TRUE);
evas_object_resize(win, 400, 550);
evas_object_show(win);
}

View File

@ -450,6 +450,10 @@ _elm_scroller_elm_widget_focus_next(Eo *obj EINA_UNUSED, Elm_Scroller_Data *sd,
return ret;
}
if (!(elm_widget_can_focus_get(obj)) &&
!(elm_widget_can_focus_get(cur)))
return EINA_FALSE;
/* Return */
*next = (Evas_Object *)obj;