efl_ui_focus_manager_root_focus: refactor _state_eval

Summary:
we have to check whether all of descendant are none_logical.

ref T6800

Test Plan:
1. elementary_test -to ctxpopup
2. Click 'Ctxpopup with user content'
3. Try focus ctxpopup content(button) using arrow key.
4. Check that the content is focused (you can move scroll bar)

Reviewers: bu5hm4n

Subscribers: cedric

Maniphest Tasks: T6800

Differential Revision: https://phab.enlightenment.org/D5856
This commit is contained in:
YeongJong Lee 2018-04-04 18:28:21 +02:00 committed by Marcel Hollerbach
parent 135ea9e894
commit c6ce04e48f
2 changed files with 37 additions and 25 deletions

View File

@ -13,7 +13,6 @@
typedef struct {
Efl_Ui_Focus_Object *root;
Eina_List *none_logicals;
Evas_Object *rect;
Eina_Bool rect_registered;
@ -31,30 +30,48 @@ _trap(Efl_Ui_Focus_Manager_Root_Focus_Data *pd, Efl_Ui_Focus_Object *obj)
static void
_state_eval(Eo *obj, Efl_Ui_Focus_Manager_Root_Focus_Data *pd)
{
if (pd->none_logicals && pd->rect_registered)
Efl_Ui_Focus_Object *root;
Eina_Bool none_logical = EINA_FALSE;
if (pd->rect_registered)
efl_ui_focus_manager_calc_unregister(obj, pd->rect);
root = efl_ui_focus_manager_root_get(obj);
none_logical = !!efl_ui_focus_manager_request_subchild(obj, root);
if (none_logical)
pd->rect_registered = EINA_FALSE;
else
{
efl_ui_focus_manager_calc_unregister(obj, pd->rect);
pd->rect_registered = EINA_FALSE;
}
else if (!pd->none_logicals && !pd->rect_registered)
{
efl_ui_focus_manager_calc_register(obj, pd->rect, pd->root, NULL);
pd->rect_registered = EINA_TRUE;
efl_ui_focus_manager_calc_register(obj, pd->rect, pd->root, NULL);
pd->rect_registered = EINA_TRUE;
}
}
EOLIAN static Eina_Bool
_efl_ui_focus_manager_root_focus_efl_ui_focus_manager_calc_register(Eo *obj, Efl_Ui_Focus_Manager_Root_Focus_Data *pd, Efl_Ui_Focus_Object *child, Efl_Ui_Focus_Object *parent, Efl_Ui_Focus_Manager *redirect)
{
Eina_Bool ret = EINA_FALSE;
if (efl_ui_focus_manager_calc_register(efl_super(obj, MY_CLASS), child, parent, redirect))
{
pd->none_logicals = eina_list_append(pd->none_logicals, child);
ret = EINA_TRUE;
if (child != pd->rect)
_state_eval(obj, pd);
return EINA_TRUE;
}
if (child != pd->rect)
_state_eval(obj, pd);
return ret;
return EINA_FALSE;
}
EOLIAN static Eina_Bool
_efl_ui_focus_manager_root_focus_efl_ui_focus_manager_calc_register_logical(Eo *obj, Efl_Ui_Focus_Manager_Root_Focus_Data *pd, Efl_Ui_Focus_Object *child, Efl_Ui_Focus_Object *parent, Efl_Ui_Focus_Manager *redirect)
{
if (efl_ui_focus_manager_calc_register_logical(efl_super(obj, MY_CLASS), child, parent, redirect))
{
if (redirect)
_state_eval(obj, pd);
return EINA_TRUE;
}
return EINA_FALSE;
}
EOLIAN static void
@ -62,8 +79,6 @@ _efl_ui_focus_manager_root_focus_efl_ui_focus_manager_calc_unregister(Eo *obj, E
{
efl_ui_focus_manager_calc_unregister(efl_super(obj, MY_CLASS), child);
pd->none_logicals = eina_list_remove(pd->none_logicals, child);
if (child != pd->rect)
_state_eval(obj, pd);
}
@ -105,14 +120,10 @@ _efl_ui_focus_manager_root_focus_efl_ui_focus_manager_logical_end(Eo *obj, Efl_U
EOLIAN static Eina_Iterator *
_efl_ui_focus_manager_root_focus_efl_ui_focus_manager_border_elements_get(Eo *obj, Efl_Ui_Focus_Manager_Root_Focus_Data *pd)
{
if (!!pd->none_logicals)
{
return efl_ui_focus_manager_border_elements_get(efl_super(obj, MY_CLASS));;
}
else
{
return eina_list_iterator_new(pd->iterator_list);
}
if (pd->rect_registered)
return eina_list_iterator_new(pd->iterator_list);
return efl_ui_focus_manager_border_elements_get(efl_super(obj, MY_CLASS));
}

View File

@ -1,6 +1,7 @@
class Efl.Ui.Focus.Manager.Root_Focus(Efl.Ui.Focus.Manager.Calc) {
[[ This class ensures that the root is at least focusable, if nothing else is focusable]]
implements {
Efl.Ui.Focus.Manager.Calc.register_logical;
Efl.Ui.Focus.Manager.Calc.register;
Efl.Ui.Focus.Manager.Calc.unregister;
Efl.Ui.Focus.Manager.manager_focus {set; get;}