widget: update child_can_focus flag on focusability change

Summary:
Previously child_can_focus flag could be only updated when
child is deleted from object's subobject list. This patch
additionally updates child_can_focus flag when focusability
is changed with elm_widget_focus_can_set function.

Patch solves child_can_focus issue in similar situations:

elm_icon_add(layout);
elm_object_content_set(layout, icon);
elm_widget_child_can_focus_get(layout); // returns EINA_TRUE

icon = elm_icon_add(win);
elm_object_content_set(layout, icon);
elm_widget_child_can_focus_get(layout); // returns EINA_FALSE

@fix

Reviewers: cedric, stefan_schmidt

Subscribers: seoz

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

Signed-off-by: Cedric BAIL <cedric@osg.samsung.com>
This commit is contained in:
Lukasz Stanislawski 2015-10-30 07:22:05 +01:00 committed by Cedric BAIL
parent d7b2b4facc
commit 56400822f0
2 changed files with 23 additions and 2 deletions

View File

@ -1380,8 +1380,6 @@ elm_object_focus_allow_set(Evas_Object *obj,
{
EINA_SAFETY_ON_NULL_RETURN(obj);
elm_widget_can_focus_set(obj, enable);
/*FIXME: According to the elm_object_focus_allow_get(), child_can_focus field
of the parent should be updated. Otherwise, the checking of it's child focus allow states should not be in elm_object_focus_allow_get() */
}
EAPI Eina_Bool

View File

@ -1401,6 +1401,29 @@ _elm_widget_can_focus_set(Eo *obj, Elm_Widget_Smart_Data *sd, Eina_Bool can_focu
}
else
{
// update child_can_focus of parents */
Evas_Object *parent = elm_widget_parent_get(obj);
while (parent)
{
const Eina_List *l;
Evas_Object *subobj;
ELM_WIDGET_DATA_GET(parent, sdp);
sdp->child_can_focus = EINA_FALSE;
EINA_LIST_FOREACH(sdp->subobjs, l, subobj)
{
if (_is_focusable(subobj))
{
sdp->child_can_focus = EINA_TRUE;
break;
}
}
/* break again, child_can_focus went back to
* original value */
if (sdp->child_can_focus) break;
parent = sdp->parent_obj;
}
eo_do(obj, eo_event_callback_array_del(focus_callbacks(), NULL));
}
}