From: woohyun Date: Sat, 6 Aug 2011 07:39:31 +0000 (+0000) Subject: elementary : Partly rollback for about the feature "focus movement by X-Git-Tag: REL_F_I9500_20120323_1~17^2~2002 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6f3503e4ee7ebe389144098d2d87952402048457;p=framework%2Fuifw%2Felementary.git elementary : Partly rollback for about the feature "focus movement by arrow keys". There is a better way to support this feature, so implementing it now. git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/elementary@62168 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- diff --git a/src/lib/Elementary.h.in b/src/lib/Elementary.h.in index 272dbf2..b0e663c 100644 --- a/src/lib/Elementary.h.in +++ b/src/lib/Elementary.h.in @@ -320,11 +320,7 @@ extern "C" { typedef enum _Elm_Focus_Direction { ELM_FOCUS_PREVIOUS, - ELM_FOCUS_NEXT, - ELM_FOCUS_UP, - ELM_FOCUS_DOWN, - ELM_FOCUS_LEFT, - ELM_FOCUS_RIGHT + ELM_FOCUS_NEXT } Elm_Focus_Direction; typedef enum _Elm_Text_Format diff --git a/src/lib/elm_scroller.c b/src/lib/elm_scroller.c index b25faa7..a49f0e1 100644 --- a/src/lib/elm_scroller.c +++ b/src/lib/elm_scroller.c @@ -53,7 +53,6 @@ _event_hook(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_Type ty if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE; Evas_Event_Key_Down *ev = event_info; Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return EINA_FALSE; if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE; if (elm_widget_disabled_get(obj)) return EINA_FALSE; @@ -68,131 +67,27 @@ _event_hook(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_Type ty Evas_Coord v_h = 0; Evas_Coord page_x = 0; Evas_Coord page_y = 0; - Evas_Coord c_x = 0; - Evas_Coord c_y = 0; elm_smart_scroller_child_pos_get(wd->scr, &x, &y); elm_smart_scroller_step_size_get(wd->scr, &step_x, &step_y); elm_smart_scroller_page_size_get(wd->scr, &page_x, &page_y); elm_smart_scroller_child_viewport_size_get(wd->scr, &v_w, &v_h); - evas_object_geometry_get(wd->content, &c_x, &c_y, &max_x, &max_y); - - if ((!strcmp(ev->keyname, "Left")) || - (!strcmp(ev->keyname, "KP_Left")) || - (!strcmp(ev->keyname, "Right")) || - (!strcmp(ev->keyname, "KP_Right")) || - (!strcmp(ev->keyname, "Up")) || - (!strcmp(ev->keyname, "KP_Up")) || - (!strcmp(ev->keyname, "Down")) || - (!strcmp(ev->keyname, "KP_Down"))) - { - Evas_Object *current_focus = NULL; - Evas_Object *new_focus = NULL; - Eina_List *can_focus_list = NULL; - Evas_Coord f_x = 0; - Evas_Coord f_y = 0; - Evas_Coord f_w = 0; - Evas_Coord f_h = 0; - - current_focus = elm_widget_focused_object_get(obj); - evas_object_geometry_get(current_focus, &f_x, &f_y, &f_w, &f_h); - can_focus_list = elm_widget_can_focus_child_list_get(obj); - if ((current_focus == obj) || - (!ELM_RECTS_INTERSECT(x, y, v_w, v_h, - (f_x - c_x), (f_y - c_y), f_w, f_h))) - { - Evas_Object *cur; - Eina_List *l; - double weight = 0.0; - - EINA_LIST_FOREACH(can_focus_list, l, cur) - { - double cur_weight = 0.0; - evas_object_geometry_get(cur, &f_x, &f_y, &f_w, &f_h); - if (ELM_RECTS_INTERSECT(x, y, v_w, v_h, - (f_x - c_x), (f_y - c_y), f_w, f_h)) - { - if ((f_x - c_x) > x) - cur_weight += ((f_x - c_x) - x) * ((f_x - c_x) - x); - if ((f_y - c_y) > y) - cur_weight += ((f_y - c_y) - y) * ((f_y - c_y) - y); - if (cur_weight == 0.0) - { - elm_widget_focus_steal(cur); - return EINA_TRUE; - } - cur_weight = 1.0 / cur_weight; - if (cur_weight > weight) - { - new_focus = cur; - weight = cur_weight; - } - } - } - if (new_focus) - { - elm_widget_focus_steal(new_focus); - return EINA_TRUE; - } - } - else - { - Evas_Object *tmp = NULL; - Elm_Focus_Direction dir = ELM_FOCUS_PREVIOUS; - void *(*list_data_get) (const Eina_List *list); - list_data_get = eina_list_data_get; - - if ((!strcmp(ev->keyname, "Left")) || (!strcmp(ev->keyname, "KP_Left"))) - dir = ELM_FOCUS_LEFT; - else if ((!strcmp(ev->keyname, "Right")) || (!strcmp(ev->keyname, "KP_Right"))) - dir = ELM_FOCUS_RIGHT; - else if ((!strcmp(ev->keyname, "Up")) || (!strcmp(ev->keyname, "KP_Up"))) - dir = ELM_FOCUS_UP; - else if ((!strcmp(ev->keyname, "Down")) || (!strcmp(ev->keyname, "KP_Down"))) - dir = ELM_FOCUS_DOWN; - - if (elm_widget_focus_list_next_get(obj, can_focus_list, list_data_get, dir, &tmp)) - new_focus = tmp; - - if (new_focus) - { - Evas_Coord l_x = 0; - Evas_Coord l_y = 0; - Evas_Coord l_w = 0; - Evas_Coord l_h = 0; - - evas_object_geometry_get(new_focus, &f_x, &f_y, &f_w, &f_h); - l_x = f_x - c_x - step_x; - l_y = f_y - c_y - step_y; - l_w = f_w + (step_x * 2); - l_h = f_h + (step_y * 2); - if (ELM_RECTS_INTERSECT(x, y, v_w, v_h, l_x, l_y, l_w, l_h)) - { - elm_widget_focus_steal(new_focus); - return EINA_TRUE; - } - } - } - } + elm_scroller_child_size_get(obj, &max_x, &max_y); if ((!strcmp(ev->keyname, "Left")) || (!strcmp(ev->keyname, "KP_Left"))) { - if (x <= 0) return EINA_FALSE; x -= step_x; } else if ((!strcmp(ev->keyname, "Right")) || (!strcmp(ev->keyname, "KP_Right"))) { - if (x >= (max_x - v_w)) return EINA_FALSE; x += step_x; } else if ((!strcmp(ev->keyname, "Up")) || (!strcmp(ev->keyname, "KP_Up"))) { - if (y == 0) return EINA_FALSE; y -= step_y; } else if ((!strcmp(ev->keyname, "Down")) || (!strcmp(ev->keyname, "KP_Down"))) { - if (y >= (max_y - v_h)) return EINA_FALSE; y += step_y; } else if ((!strcmp(ev->keyname, "Home")) || (!strcmp(ev->keyname, "KP_Home"))) diff --git a/src/lib/elm_widget.c b/src/lib/elm_widget.c index a87dc35..b1212a9 100644 --- a/src/lib/elm_widget.c +++ b/src/lib/elm_widget.c @@ -158,10 +158,6 @@ static void _if_focused_revert(Evas_Object *obj, static Evas_Object *_newest_focus_order_get(Evas_Object *obj, unsigned int *newest_focus_order, Eina_Bool can_focus_only); -static Eina_Bool _focus_list_direction_nearest_get(Evas_Object *obj, - Eina_List *list, - Elm_Focus_Direction dir, - Evas_Object **nearest); /* local subsystem globals */ static Evas_Smart *_e_smart = NULL; @@ -403,96 +399,6 @@ _elm_widget_focus_region_show(const Evas_Object *obj) } } -static Eina_Bool -_focus_list_direction_nearest_get(Evas_Object *obj, - Eina_List *list, - Elm_Focus_Direction dir, - Evas_Object **nearest) -{ - Evas_Object *cur, *next = NULL; - Eina_List *l; - double weight = 0.0; - Evas_Coord x, y, w, h, cx, cy; - - if (!nearest) return EINA_FALSE; - *nearest = NULL; - - evas_object_geometry_get(obj, &x, &y, &w, &h); - cx = x + (w / 2); - cy = y + (h / 2); - - EINA_LIST_FOREACH(list, l, cur) - { - if (obj == cur) continue; - Evas_Coord cur_x, cur_y, cur_w, cur_h; - int w_gap = 0, h_gap = 0; - double cur_weight = 0.0; - - evas_object_geometry_get(cur, &cur_x, &cur_y, &cur_w, &cur_h); - - if (dir == ELM_FOCUS_LEFT) - { - if (x < (cur_x + cur_w)) continue; - w_gap = x - (cur_x + cur_w); - if ((cy >= cur_y) && (cy <= (cur_y + cur_h))) - h_gap = 0; - else if (cy > (cur_y + cur_h)) - h_gap = cy - (cur_y + cur_h); - else if (cy < (cur_y)) - h_gap = cur_y - cy; - } - else if (dir == ELM_FOCUS_RIGHT) - { - if ((x + w) > cur_x) continue; - w_gap = cur_x - (x + w); - if ((cy >= cur_y) && (cy <= (cur_y + cur_h))) - h_gap = 0; - else if (cy > (cur_y + cur_h)) - h_gap = cy - (cur_y + cur_h); - else if (cy < (cur_y)) - h_gap = cur_y - cy; - } - else if (dir == ELM_FOCUS_UP) - { - if (y < (cur_y + cur_h)) continue; - h_gap = y - (cur_y + cur_h); - if ((cx >= cur_x) && (cx <= (cur_x + cur_w))) - w_gap = 0; - else if (cx < cur_x) - w_gap = cur_x - cx; - else if (cx > (cur_x + cur_w)) - w_gap = cur_x + cur_w - cx; - } - else if (dir == ELM_FOCUS_DOWN) - { - if ((y + h) > cur_y) continue; - h_gap = cur_y - (y + h); - if ((cx >= cur_x) && (cx <= (cur_x + cur_w))) w_gap = 0; - else if (cx < cur_x) - w_gap = cur_x - cx; - else if (cx > (cur_x + cur_w)) - w_gap = cur_x + cur_w - cx; - } - cur_weight = (w_gap * w_gap) + (h_gap * h_gap); - - if (cur_weight == 0.0) - { - *nearest = cur; - return EINA_TRUE; - } - cur_weight = 1.0 / cur_weight; - if (cur_weight > weight) - { - weight = cur_weight; - next = cur; - } - } - if (!next) return EINA_FALSE; - *nearest = next; - return EINA_TRUE; -} - - /** * @defgroup Widget Widget * @@ -1752,110 +1658,64 @@ elm_widget_focus_list_next_get(const Evas_Object *obj, list_next = eina_list_prev; } else if (dir == ELM_FOCUS_NEXT) - { - list_next = eina_list_next; - } - else if ((dir == ELM_FOCUS_LEFT) || (dir == ELM_FOCUS_RIGHT) || - (dir == ELM_FOCUS_UP) || (dir == ELM_FOCUS_DOWN)) - { - list_next = eina_list_next; - } + list_next = eina_list_next; else return EINA_FALSE; - if ((dir == ELM_FOCUS_PREVIOUS) || (dir == ELM_FOCUS_NEXT)) - { - const Eina_List *l = items; - - /* Recovery last focused sub item */ - if (elm_widget_focus_get(obj)) - for (; l; l = list_next(l)) - { - Evas_Object *cur = list_data_get(l); - if (elm_widget_focus_get(cur)) break; - } + const Eina_List *l = items; - const Eina_List *start = l; - Evas_Object *to_focus = NULL; - - /* Interate sub items */ - /* Go to end of list */ - for (; l; l = list_next(l)) - { - Evas_Object *tmp = NULL; - Evas_Object *cur = list_data_get(l); + /* Recovery last focused sub item */ + if (elm_widget_focus_get(obj)) + for (; l; l = list_next(l)) + { + Evas_Object *cur = list_data_get(l); + if (elm_widget_focus_get(cur)) break; + } - if (elm_widget_parent_get(cur) != obj) - continue; + const Eina_List *start = l; + Evas_Object *to_focus = NULL; - /* Try Focus cycle in subitem */ - if (elm_widget_focus_next_get(cur, dir, &tmp)) - { - *next = tmp; - return EINA_TRUE; - } - else if ((tmp) && (!to_focus)) - to_focus = tmp; - } + /* Interate sub items */ + /* Go to end of list */ + for (; l; l = list_next(l)) + { + Evas_Object *tmp = NULL; + Evas_Object *cur = list_data_get(l); - l = items; + if (elm_widget_parent_get(cur) != obj) + continue; - /* Get First possible */ - for (; l != start; l = list_next(l)) + /* Try Focus cycle in subitem */ + if (elm_widget_focus_next_get(cur, dir, &tmp)) { - Evas_Object *tmp = NULL; - Evas_Object *cur = list_data_get(l); - - if (elm_widget_parent_get(cur) != obj) - continue; - - /* Try Focus cycle in subitem */ - elm_widget_focus_next_get(cur, dir, &tmp); - if (tmp) - { - *next = tmp; - return EINA_FALSE; - } + *next = tmp; + return EINA_TRUE; } - - *next = to_focus; - return EINA_FALSE; + else if ((tmp) && (!to_focus)) + to_focus = tmp; } - else if ((dir == ELM_FOCUS_LEFT) || (dir == ELM_FOCUS_RIGHT) || - (dir == ELM_FOCUS_UP) || (dir == ELM_FOCUS_DOWN)) + + l = items; + + /* Get First possible */ + for (; l != start; l = list_next(l)) { - Eina_List *can_focus_list; Evas_Object *tmp = NULL; - Evas_Object *cur; + Evas_Object *cur = list_data_get(l); - can_focus_list = elm_widget_can_focus_child_list_get(obj); - if (can_focus_list) + if (elm_widget_parent_get(cur) != obj) + continue; + + /* Try Focus cycle in subitem */ + elm_widget_focus_next_get(cur, dir, &tmp); + if (tmp) { - Eina_List *l; - EINA_LIST_FOREACH(can_focus_list, l, cur) - { - if (elm_widget_focus_get(cur)) - { - if (_focus_list_direction_nearest_get(cur, can_focus_list, dir, &tmp)) - { - *next = tmp; - return EINA_TRUE; - } - else - { - *next = cur; - return EINA_FALSE; - } - } - } - if (elm_widget_focus_get(obj)) - { - *next = list_data_get(can_focus_list); - return EINA_FALSE; - } + *next = tmp; + return EINA_FALSE; } } + *next = to_focus; return EINA_FALSE; } diff --git a/src/lib/elm_win.c b/src/lib/elm_win.c index b471ac0..45349e0 100644 --- a/src/lib/elm_win.c +++ b/src/lib/elm_win.c @@ -400,30 +400,22 @@ _elm_win_event_cb(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_T else if ((!strcmp(ev->keyname, "Left")) || (!strcmp(ev->keyname, "KP_Left"))) { - elm_widget_focus_cycle(obj, ELM_FOCUS_LEFT); - ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; - return EINA_TRUE; + //TODO : woohyun jung } else if ((!strcmp(ev->keyname, "Right")) || (!strcmp(ev->keyname, "KP_Right"))) { - elm_widget_focus_cycle(obj, ELM_FOCUS_RIGHT); - ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; - return EINA_TRUE; + //TODO : woohyun jung } else if ((!strcmp(ev->keyname, "Up")) || (!strcmp(ev->keyname, "KP_Up"))) { - elm_widget_focus_cycle(obj, ELM_FOCUS_UP); - ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; - return EINA_TRUE; + //TODO : woohyun jung } else if ((!strcmp(ev->keyname, "Down")) || (!strcmp(ev->keyname, "KP_Down"))) { - elm_widget_focus_cycle(obj, ELM_FOCUS_DOWN); - ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; - return EINA_TRUE; + //TODO : woohyun jung } }