forked from enlightenment/efl
efl_ui_focus_manager_root_focus: support a custom canvas object
This commit is contained in:
parent
fef2a12ef6
commit
05d4f0b256
|
@ -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"
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue