efl_ui_focus_manager_root_focus: support a custom canvas object

This commit is contained in:
Marcel Hollerbach 2018-05-09 21:10:47 +02:00
parent fef2a12ef6
commit 05d4f0b256
2 changed files with 72 additions and 16 deletions

View File

@ -13,7 +13,7 @@
#define MY_CLASS EFL_UI_FOCUS_MANAGER_ROOT_FOCUS_CLASS
typedef struct {
Efl_Ui_Focus_Object *root;
Efl_Ui_Focus_Object *replacement_object;
Evas_Object *rect;
Eina_Bool rect_registered;
@ -24,7 +24,7 @@ typedef struct {
static Efl_Ui_Focus_Object*
_trap(Efl_Ui_Focus_Manager_Root_Focus_Data *pd, Efl_Ui_Focus_Object *obj)
{
if (pd->rect == obj) return pd->root;
if (pd->rect == obj) return pd->replacement_object;
return obj;
}
@ -51,10 +51,10 @@ _state_eval(Eo *obj, Efl_Ui_Focus_Manager_Root_Focus_Data *pd)
}
else
{
efl_ui_focus_manager_calc_register(obj, pd->rect, pd->root, NULL);
efl_ui_focus_manager_calc_register(obj, pd->rect, pd->replacement_object, NULL);
pd->rect_registered = EINA_TRUE;
efl_ui_focus_composition_adapter_focus_manager_parent_set(pd->rect, pd->root);
efl_ui_focus_composition_adapter_focus_manager_parent_set(pd->rect, pd->replacement_object);
efl_ui_focus_composition_adapter_focus_manager_object_set(pd->rect, obj);
if (focused)
@ -153,24 +153,66 @@ _efl_ui_focus_manager_root_focus_efl_ui_focus_manager_move(Eo *obj, Efl_Ui_Focus
return _trap(pd, efl_ui_focus_manager_move(efl_super(obj, MY_CLASS), direction));
}
EOLIAN static Efl_Canvas_Object*
_efl_ui_focus_manager_root_focus_canvas_object_get(const Eo *obj EINA_UNUSED, Efl_Ui_Focus_Manager_Root_Focus_Data *pd)
{
return pd->replacement_object;
}
EOLIAN static void
_efl_ui_focus_manager_root_focus_canvas_object_set(Eo *obj, Efl_Ui_Focus_Manager_Root_Focus_Data *pd, Efl_Canvas_Object *canvas_object)
{
//if canvas object is NULL trigger it as root
if (!canvas_object)
canvas_object = efl_ui_focus_manager_root_get(obj);
if (canvas_object == pd->replacement_object) return;
if (pd->replacement_object)
{
pd->iterator_list = eina_list_remove(pd->iterator_list, pd->replacement_object);
pd->replacement_object = NULL;
}
pd->replacement_object = canvas_object;
if (pd->replacement_object)
{
efl_ui_focus_composition_adapter_canvas_object_set(pd->rect, pd->replacement_object);
pd->iterator_list = eina_list_append(pd->iterator_list, pd->replacement_object);
}
}
EOLIAN static Efl_Object*
_efl_ui_focus_manager_root_focus_efl_object_constructor(Eo *obj, Efl_Ui_Focus_Manager_Root_Focus_Data *pd)
{
pd->rect = efl_add_ref(EFL_UI_FOCUS_COMPOSITION_ADAPTER_CLASS, NULL);
EINA_SAFETY_ON_NULL_RETURN_VAL(pd->rect, NULL);
return efl_constructor(efl_super(obj, MY_CLASS));
}
EOLIAN static void
_efl_ui_focus_manager_root_focus_efl_object_destructor(Eo *obj, Efl_Ui_Focus_Manager_Root_Focus_Data *pd)
{
efl_unref(pd->rect);
pd->rect = NULL;
efl_destructor(efl_super(obj, MY_CLASS));
}
EOLIAN static Efl_Object*
_efl_ui_focus_manager_root_focus_efl_object_finalize(Eo *obj, Efl_Ui_Focus_Manager_Root_Focus_Data *pd)
{
Efl_Object *ret;
ret = efl_finalize(efl_super(obj, MY_CLASS));
pd->root = efl_ui_focus_manager_root_get(obj);
pd->rect = efl_add(EFL_UI_FOCUS_COMPOSITION_ADAPTER_CLASS, pd->root);
efl_ui_focus_composition_adapter_canvas_object_set(pd->rect, pd->root);
EINA_SAFETY_ON_NULL_RETURN_VAL(pd->rect, NULL);
pd->iterator_list = eina_list_append(pd->iterator_list, pd->root);
//set it to NULL so the root manager is passed to the manager
if (!pd->replacement_object)
efl_ui_focus_manager_root_focus_canvas_object_set(obj, NULL);
_state_eval(obj, pd);
return ret;
return efl_finalize(efl_super(obj, MY_CLASS));
}
#include "efl_ui_focus_manager_root_focus.eo.c"

View File

@ -1,5 +1,17 @@
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]]
methods {
@property canvas_object {
[[
The default replacement object for the case that there is no focusable object inside the manager is the root object.
However, you can change this by setting this value to something else.
$null is triggered as the same value as Efl.Ui.Focus.Manager.root.get
]]
values {
canvas_object : Efl.Canvas.Object; [[Canvas object]]
}
}
}
implements {
Efl.Ui.Focus.Manager_Calc.register_logical;
Efl.Ui.Focus.Manager_Calc.register;
@ -10,6 +22,8 @@ class Efl.Ui.Focus.Manager_Root_Focus(Efl.Ui.Focus.Manager_Calc) {
Efl.Ui.Focus.Manager.border_elements {get;}
Efl.Ui.Focus.Manager.request_move;
Efl.Ui.Focus.Manager.move;
Efl.Object.constructor;
Efl.Object.destructor;
Efl.Object.finalize;
}
}