From cfe2ab206e7368406d05c4cfe28b060f486aeca1 Mon Sep 17 00:00:00 2001 From: WooHyun Jung Date: Mon, 11 Mar 2013 16:38:45 +0900 Subject: [PATCH] elementary/naviframe : Fixed a bug that naviframe's focus_next didn't work after changing evenry item to elm_layout. --- legacy/elementary/ChangeLog | 4 + legacy/elementary/NEWS | 1 + legacy/elementary/src/lib/elc_naviframe.c | 82 +++++++------------ .../elementary/src/lib/elm_widget_naviframe.h | 2 +- 4 files changed, 37 insertions(+), 52 deletions(-) diff --git a/legacy/elementary/ChangeLog b/legacy/elementary/ChangeLog index 9b8d810b08..a6e9c3d24c 100644 --- a/legacy/elementary/ChangeLog +++ b/legacy/elementary/ChangeLog @@ -1136,3 +1136,7 @@ 2013-03-08 ChunEon Park (Hermet) * Remove the back button callback if the button is unset on the naviframe. + +2013-03-11 WooHyun Jung + + * Fixed a bug that naviframe's focus_next didn't work after changing evenry item to elm_layout. diff --git a/legacy/elementary/NEWS b/legacy/elementary/NEWS index b52e5e3904..65dfc2ec0c 100644 --- a/legacy/elementary/NEWS +++ b/legacy/elementary/NEWS @@ -179,6 +179,7 @@ Fixes: * After elm_win is created, if there is no manual focus setting, only elm_win should get focus when focus state is changed. * Fix the toolbar cannot be unselected when it's mode is ELM_OBJECT_SELECT_MODE_ALWAYS. * Remove the back button callback if the back button is unset on the naviframe. + * Fixed a bug that naviframe's focus_next didn't work after changing evenry item to elm_layout. Removals: diff --git a/legacy/elementary/src/lib/elc_naviframe.c b/legacy/elementary/src/lib/elc_naviframe.c index 8d24aba374..8d73b6c986 100644 --- a/legacy/elementary/src/lib/elc_naviframe.c +++ b/legacy/elementary/src/lib/elc_naviframe.c @@ -456,9 +456,8 @@ _item_del_pre_hook(Elm_Object_Item *it) if (nit->content && !sd->on_deletion) { - nit->content_unfocusable = - elm_widget_tree_unfocusable_get(nit->content); - elm_widget_tree_unfocusable_set(nit->content, EINA_TRUE); + nit->unfocusable = elm_widget_tree_unfocusable_get(VIEW(nit)); + elm_widget_tree_unfocusable_set(VIEW(nit), EINA_TRUE); } if (sd->stack->last->prev) @@ -1014,7 +1013,7 @@ _on_item_push_finished(void *data, evas_object_hide(VIEW(it)); if (it->content) - elm_widget_tree_unfocusable_set(it->content, it->content_unfocusable); + elm_widget_tree_unfocusable_set(VIEW(it), it->unfocusable); if (sd->freeze_events) evas_object_freeze_events_set(VIEW(it), EINA_FALSE); @@ -1033,7 +1032,7 @@ _on_item_pop_finished(void *data, ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd); if (sd->preserve && it->content) - elm_widget_tree_unfocusable_set(it->content, it->content_unfocusable); + elm_widget_tree_unfocusable_set(VIEW(it), it->unfocusable); sd->popping = eina_list_remove(sd->popping, it); elm_widget_item_del(data); @@ -1049,12 +1048,20 @@ _on_item_show_finished(void *data, const char *source __UNUSED__) { Elm_Naviframe_Item *it = data; + unsigned int order = 0; + Evas_Object *newest; ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd); elm_object_signal_emit(VIEW(it), "elm,state,visible", "elm"); - elm_widget_tree_unfocusable_set(it->content, it->content_unfocusable); + elm_widget_tree_unfocusable_set(VIEW(it), it->unfocusable); + + newest = elm_widget_newest_focus_order_get(VIEW(it), &order, EINA_TRUE); + if (newest) + elm_object_focus_set(newest, EINA_TRUE); + else + elm_object_focus_set(VIEW(it), EINA_TRUE); if (sd->freeze_events) evas_object_freeze_events_set(VIEW(it), EINA_FALSE); @@ -1196,7 +1203,6 @@ _elm_naviframe_smart_focus_next(Eo *obj, void *_pd EINA_UNUSED, va_list *list) Eina_List *l = NULL; Elm_Naviframe_Item *top_it; - Elm_Naviframe_Content_Item_Pair *content_pair = NULL; void *(*list_data_get)(const Eina_List *list); Elm_Focus_Direction dir = va_arg(*list, Elm_Focus_Direction); @@ -1208,16 +1214,10 @@ _elm_naviframe_smart_focus_next(Eo *obj, void *_pd EINA_UNUSED, va_list *list) top_it = (Elm_Naviframe_Item *)elm_naviframe_top_item_get(obj); if (!top_it) return; - //In case of the title area is invisible. - if (!top_it->title_visible) - { - int_ret = elm_widget_focus_next_get(top_it->content, dir, next); - if (ret) *ret = int_ret; - return; - } - list_data_get = eina_list_data_get; + l = eina_list_append(l, VIEW(top_it)); + /* access */ if (_elm_config->access_mode) { @@ -1225,24 +1225,6 @@ _elm_naviframe_smart_focus_next(Eo *obj, void *_pd EINA_UNUSED, va_list *list) if (ao) l = eina_list_append(l, ao); } - /* icon would be able to have an widget. ex: segment control */ - if ((top_it->title_icon) && - (elm_widget_can_focus_get(top_it->title_icon) || - elm_widget_child_can_focus_get(top_it->title_icon))) - l = eina_list_append(l, top_it->title_icon); - - if (top_it->title_prev_btn) - l = eina_list_append(l, top_it->title_prev_btn); - if (top_it->title_next_btn) - l = eina_list_append(l, top_it->title_next_btn); - if (top_it->content) - l = eina_list_append(l, top_it->content); - EINA_INLIST_FOREACH(top_it->content_list, content_pair) - { - if (content_pair->content) - l = eina_list_append(l, content_pair->content); - } - int_ret = elm_widget_focus_list_next_get(obj, l, list_data_get, dir, next); if (ret) *ret = int_ret; eina_list_free(l); @@ -1431,6 +1413,8 @@ _item_push(Eo *obj, void *_pd, va_list *list) evas_object_show(VIEW(it)); elm_widget_resize_object_set(obj, VIEW(it)); + if (prev_it) + elm_widget_sub_object_add(obj, VIEW(prev_it)); if (prev_it) { @@ -1445,15 +1429,13 @@ _item_push(Eo *obj, void *_pd, va_list *list) edje_object_message_signal_process(elm_layout_edje_get(VIEW(prev_it))); edje_object_message_signal_process(elm_layout_edje_get(VIEW(it))); - if (prev_it->content) - { - prev_it->content_unfocusable = - elm_widget_tree_unfocusable_get(prev_it->content); - elm_widget_tree_unfocusable_set(prev_it->content, EINA_TRUE); - } + prev_it->unfocusable = elm_widget_tree_unfocusable_get(VIEW(prev_it)); + elm_widget_tree_unfocusable_set(VIEW(prev_it), EINA_TRUE); it->animator = ecore_animator_add(_push_transition_cb, it); } + else + elm_object_focus_set(VIEW(it), EINA_TRUE); sd->stack = eina_inlist_append(sd->stack, EINA_INLIST_GET(it)); evas_object_raise(VIEW(it)); @@ -1561,8 +1543,10 @@ _item_insert_after(Eo *obj, void *_pd, va_list *list) if (top_inserted) { elm_widget_resize_object_set(obj, VIEW(it)); + elm_widget_sub_object_add(obj, VIEW(after)); evas_object_show(VIEW(it)); evas_object_hide(VIEW(after)); + elm_object_focus_set(VIEW(it), EINA_TRUE); } /* access */ @@ -1603,11 +1587,8 @@ _item_pop(Eo *obj, void *_pd, va_list *list) evas_object_data_set(VIEW(it), "out_of_list", (void *)1); - if (it->content) - { - it->content_unfocusable = elm_widget_tree_unfocusable_get(it->content); - elm_widget_tree_unfocusable_set(it->content, EINA_TRUE); - } + it->unfocusable = elm_widget_tree_unfocusable_get(VIEW(it)); + elm_widget_tree_unfocusable_set(VIEW(it), EINA_TRUE); if (sd->stack->last->prev) prev_it = EINA_INLIST_CONTAINER_GET @@ -1688,6 +1669,7 @@ elm_naviframe_item_pop_to(Elm_Object_Item *it) EAPI void elm_naviframe_item_promote(Elm_Object_Item *it) { + Elm_Object_Item * prev_top; Elm_Naviframe_Item *nit; Elm_Naviframe_Item *prev_it; @@ -1696,23 +1678,21 @@ elm_naviframe_item_promote(Elm_Object_Item *it) nit = (Elm_Naviframe_Item *)it; ELM_NAVIFRAME_DATA_GET(WIDGET(nit), sd); - if (it == elm_naviframe_top_item_get(nit->base.widget)) return; + prev_top = elm_naviframe_top_item_get(nit->base.widget); + if (it == prev_top) return; /* remember, last is 1st on the naviframe, push it to last pos. */ sd->stack = eina_inlist_demote(sd->stack, EINA_INLIST_GET(nit)); elm_widget_resize_object_set(WIDGET(it), VIEW(nit)); + elm_widget_sub_object_add(WIDGET(it), VIEW(prev_top)); /* this was the previous top one */ prev_it = EINA_INLIST_CONTAINER_GET (sd->stack->last->prev, Elm_Naviframe_Item); - if (prev_it->content) - { - prev_it->content_unfocusable = - elm_widget_tree_unfocusable_get(prev_it->content); - elm_widget_tree_unfocusable_set(prev_it->content, EINA_TRUE); - } + prev_it->unfocusable = elm_widget_tree_unfocusable_get(VIEW(prev_it)); + elm_widget_tree_unfocusable_set(VIEW(prev_it), EINA_TRUE); if (sd->freeze_events) { diff --git a/legacy/elementary/src/lib/elm_widget_naviframe.h b/legacy/elementary/src/lib/elm_widget_naviframe.h index 576315d8ed..3d8f274fa8 100644 --- a/legacy/elementary/src/lib/elm_widget_naviframe.h +++ b/legacy/elementary/src/lib/elm_widget_naviframe.h @@ -55,7 +55,7 @@ struct _Elm_Naviframe_Item Evas_Coord minh; Eina_Bool title_visible : 1; - Eina_Bool content_unfocusable : 1; + Eina_Bool unfocusable : 1; }; typedef struct _Elm_Naviframe_Content_Item_Pair Elm_Naviframe_Content_Item_Pair;