forked from enlightenment/efl
efl_ui_focus_manager_sub: make it a mixin
This just brings the functionality, the manager that is used as sub can still be decided and be brought in via inheritance or compositition
This commit is contained in:
parent
f53ea559a1
commit
b846545072
|
@ -5,7 +5,7 @@
|
||||||
#include <Elementary.h>
|
#include <Elementary.h>
|
||||||
#include "elm_priv.h"
|
#include "elm_priv.h"
|
||||||
|
|
||||||
#define MY_CLASS EFL_UI_FOCUS_MANAGER_SUB_CLASS
|
#define MY_CLASS EFL_UI_FOCUS_MANAGER_SUB_MIXIN
|
||||||
#define MY_DATA(o, p) Efl_Ui_Focus_Manager_Sub_Data *p = efl_data_scope_get(o, MY_CLASS);
|
#define MY_DATA(o, p) Efl_Ui_Focus_Manager_Sub_Data *p = efl_data_scope_get(o, MY_CLASS);
|
||||||
typedef struct {
|
typedef struct {
|
||||||
Efl_Ui_Focus_Manager *manager;//the manager where current_border is currently registered
|
Efl_Ui_Focus_Manager *manager;//the manager where current_border is currently registered
|
||||||
|
@ -34,10 +34,8 @@ _focus_changed(void *data, const Efl_Event *event)
|
||||||
{
|
{
|
||||||
Efl_Ui_Focus_Manager_Sub *m = data;
|
Efl_Ui_Focus_Manager_Sub *m = data;
|
||||||
Efl_Ui_Focus_Manager *manager;
|
Efl_Ui_Focus_Manager *manager;
|
||||||
Elm_Widget *elem;
|
|
||||||
|
|
||||||
elem = efl_parent_get(m);
|
manager = efl_ui_focus_user_manager_get(m);
|
||||||
manager = efl_ui_focus_user_manager_get(elem);
|
|
||||||
|
|
||||||
//only do this when we are getting focus
|
//only do this when we are getting focus
|
||||||
if (!event->info) return;
|
if (!event->info) return;
|
||||||
|
@ -69,11 +67,9 @@ _border_flush(Eo *obj, Efl_Ui_Focus_Manager_Sub_Data *pd)
|
||||||
Eina_List *selection, *tmp;
|
Eina_List *selection, *tmp;
|
||||||
Efl_Ui_Focus_Object *node, *logical;
|
Efl_Ui_Focus_Object *node, *logical;
|
||||||
Efl_Ui_Focus_Manager *manager;
|
Efl_Ui_Focus_Manager *manager;
|
||||||
Efl_Ui_Focus_Manager *elem;
|
|
||||||
|
|
||||||
elem = efl_parent_get(obj);
|
manager = efl_ui_focus_user_manager_get(obj);
|
||||||
manager = efl_ui_focus_user_manager_get(elem);
|
logical = obj;
|
||||||
logical = elem;
|
|
||||||
borders = efl_ui_focus_manager_border_elements_get(obj);
|
borders = efl_ui_focus_manager_border_elements_get(obj);
|
||||||
|
|
||||||
selection = NULL;
|
selection = NULL;
|
||||||
|
@ -89,7 +85,7 @@ _border_flush(Eo *obj, Efl_Ui_Focus_Manager_Sub_Data *pd)
|
||||||
|
|
||||||
EINA_LIST_FREE(tmp, node)
|
EINA_LIST_FREE(tmp, node)
|
||||||
{
|
{
|
||||||
if (node == elem) continue;
|
if (node == obj) continue;
|
||||||
_unregister(obj, manager, node);
|
_unregister(obj, manager, node);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -99,7 +95,7 @@ _border_flush(Eo *obj, Efl_Ui_Focus_Manager_Sub_Data *pd)
|
||||||
|
|
||||||
EINA_LIST_FREE(tmp, node)
|
EINA_LIST_FREE(tmp, node)
|
||||||
{
|
{
|
||||||
if (node == elem) continue;
|
if (node == obj) continue;
|
||||||
_register(obj, manager, node, logical);
|
_register(obj, manager, node, logical);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,14 +108,11 @@ _border_unregister(Eo *obj, Efl_Ui_Focus_Manager_Sub_Data *pd)
|
||||||
{
|
{
|
||||||
Efl_Ui_Focus_Object *node;
|
Efl_Ui_Focus_Object *node;
|
||||||
Efl_Ui_Focus_Manager *manager;
|
Efl_Ui_Focus_Manager *manager;
|
||||||
Efl_Ui_Focus_Manager *elem;
|
|
||||||
|
|
||||||
elem = efl_parent_get(obj);
|
manager = efl_ui_focus_user_manager_get(obj);
|
||||||
|
|
||||||
manager = efl_ui_focus_user_manager_get(elem);
|
|
||||||
EINA_LIST_FREE(pd->current_border, node)
|
EINA_LIST_FREE(pd->current_border, node)
|
||||||
{
|
{
|
||||||
if (node == elem) continue;
|
if (node == obj) continue;
|
||||||
_unregister(obj, manager, node);
|
_unregister(obj, manager, node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -178,14 +171,13 @@ static void
|
||||||
_flush_manager(Eo *obj, Efl_Ui_Focus_Manager_Sub_Data *pd)
|
_flush_manager(Eo *obj, Efl_Ui_Focus_Manager_Sub_Data *pd)
|
||||||
{
|
{
|
||||||
Efl_Ui_Focus_Manager *manager;
|
Efl_Ui_Focus_Manager *manager;
|
||||||
Efl_Ui_Focus_Object *logical, *real_object;
|
Efl_Ui_Focus_Object *logical;
|
||||||
Efl_Ui_Focus_User *b;
|
Efl_Ui_Focus_User *b;
|
||||||
Eina_List *n;
|
Eina_List *n;
|
||||||
|
|
||||||
real_object = efl_parent_get(obj);
|
|
||||||
|
|
||||||
logical = efl_ui_focus_user_parent_get(real_object);
|
logical = efl_ui_focus_user_parent_get(obj);
|
||||||
manager = efl_ui_focus_user_manager_get(real_object);
|
manager = efl_ui_focus_user_manager_get(obj);
|
||||||
|
|
||||||
//unregister from the old
|
//unregister from the old
|
||||||
efl_event_callback_array_del(pd->manager, parent_manager(), obj);
|
efl_event_callback_array_del(pd->manager, parent_manager(), obj);
|
||||||
|
@ -193,7 +185,7 @@ _flush_manager(Eo *obj, Efl_Ui_Focus_Manager_Sub_Data *pd)
|
||||||
|
|
||||||
EINA_LIST_FOREACH(pd->current_border , n, b)
|
EINA_LIST_FOREACH(pd->current_border , n, b)
|
||||||
{
|
{
|
||||||
if (b == real_object) continue;
|
if (b == obj) continue;
|
||||||
|
|
||||||
_unregister(obj, manager, b);
|
_unregister(obj, manager, b);
|
||||||
_register(obj, manager, b, logical);
|
_register(obj, manager, b, logical);
|
||||||
|
@ -216,28 +208,13 @@ EFL_CALLBACKS_ARRAY_DEFINE(self_manager,
|
||||||
{EFL_UI_FOCUS_USER_EVENT_MANAGER_CHANGED, _manager_change}
|
{EFL_UI_FOCUS_USER_EVENT_MANAGER_CHANGED, _manager_change}
|
||||||
);
|
);
|
||||||
|
|
||||||
EOLIAN static void
|
|
||||||
_efl_ui_focus_manager_sub_efl_object_parent_set(Eo *obj, Efl_Ui_Focus_Manager_Sub_Data *pd EINA_UNUSED, Efl_Object *parent)
|
|
||||||
{
|
|
||||||
Eo *old_parent, *new_parent;
|
|
||||||
|
|
||||||
old_parent = efl_parent_get(obj);
|
|
||||||
|
|
||||||
_efl_ui_focus_manager_redirect_events_del(obj, old_parent);
|
|
||||||
efl_event_callback_array_del(old_parent, self_manager(), obj);
|
|
||||||
|
|
||||||
efl_parent_set(efl_super(obj, MY_CLASS), parent);
|
|
||||||
|
|
||||||
new_parent = efl_parent_get(obj);
|
|
||||||
_efl_ui_focus_manager_redirect_events_add(obj, new_parent);
|
|
||||||
efl_event_callback_array_add(new_parent, self_manager(), obj);
|
|
||||||
|
|
||||||
_flush_manager(obj, pd);
|
|
||||||
}
|
|
||||||
|
|
||||||
EOLIAN static Efl_Object*
|
EOLIAN static Efl_Object*
|
||||||
_efl_ui_focus_manager_sub_efl_object_constructor(Eo *obj, Efl_Ui_Focus_Manager_Sub_Data *pd EINA_UNUSED)
|
_efl_ui_focus_manager_sub_efl_object_constructor(Eo *obj, Efl_Ui_Focus_Manager_Sub_Data *pd EINA_UNUSED)
|
||||||
{
|
{
|
||||||
|
efl_event_callback_array_add(obj, self_manager(), obj);
|
||||||
|
|
||||||
|
_flush_manager(obj, pd);
|
||||||
|
|
||||||
return efl_constructor(efl_super(obj, MY_CLASS));
|
return efl_constructor(efl_super(obj, MY_CLASS));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
class Efl.Ui.Focus.Manager.Sub (Efl.Ui.Focus.Manager.Calc, Efl.Object)
|
mixin Efl.Ui.Focus.Manager.Sub (Efl.Ui.Focus.Manager, Efl.Object)
|
||||||
{
|
{
|
||||||
[[A class that automatically registeres its border elements in the parent manager
|
[[A class that automatically registeres its border elements in the parent manager
|
||||||
|
|
||||||
|
@ -13,17 +13,10 @@ class Efl.Ui.Focus.Manager.Sub (Efl.Ui.Focus.Manager.Calc, Efl.Object)
|
||||||
You can filter the border elements by overriding the property
|
You can filter the border elements by overriding the property
|
||||||
@Efl.Ui.Focus.Manager.border_elements.
|
@Efl.Ui.Focus.Manager.border_elements.
|
||||||
|
|
||||||
This class is only working as composite object to a @Efl.Ui.Focus.User
|
|
||||||
and @Efl.Ui.Focus.Object.
|
|
||||||
|
|
||||||
The object itself redirects the manager's events to the object where this
|
|
||||||
object is attached.
|
|
||||||
|
|
||||||
@since 1.20
|
@since 1.20
|
||||||
]]
|
]]
|
||||||
implements {
|
implements {
|
||||||
Efl.Object.constructor;
|
Efl.Object.constructor;
|
||||||
Efl.Object.destructor;
|
Efl.Object.destructor;
|
||||||
Efl.Object.parent { set; }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4682,7 +4682,7 @@ _elm_interface_scrollable_elm_widget_focus_manager_factory(Eo *obj EINA_UNUSED,
|
||||||
{
|
{
|
||||||
Efl_Ui_Focus_Manager *manager;
|
Efl_Ui_Focus_Manager *manager;
|
||||||
|
|
||||||
manager = efl_add(EFL_UI_FOCUS_MANAGER_SUB_CLASS, obj,
|
manager = efl_add(EFL_UI_FOCUS_MANAGER_CALC_CLASS, obj,
|
||||||
efl_ui_focus_manager_root_set(efl_added, root)
|
efl_ui_focus_manager_root_set(efl_added, root)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@ enum Elm.Scroller.Single_Direction
|
||||||
last [[Sentinel value to indicate last enum field during iteration]]
|
last [[Sentinel value to indicate last enum field during iteration]]
|
||||||
}
|
}
|
||||||
|
|
||||||
mixin Elm.Interface_Scrollable(Efl.Ui.Scrollable, Efl.Ui.Focus.Manager, Elm.Widget)
|
mixin Elm.Interface_Scrollable(Efl.Ui.Scrollable, Efl.Ui.Focus.Manager.Sub, Elm.Widget)
|
||||||
{
|
{
|
||||||
[[Elm scrollable mixin]]
|
[[Elm scrollable mixin]]
|
||||||
eo_prefix: elm_interface_scrollable;
|
eo_prefix: elm_interface_scrollable;
|
||||||
|
|
|
@ -93,11 +93,14 @@ _setup(Efl_Ui_Focus_Manager **m, Efl_Ui_Focus_Manager_Sub **sub, Efl_Ui_Focus_Ob
|
||||||
efl_key_data_set(focus_main, "__user_manager", manager);
|
efl_key_data_set(focus_main, "__user_manager", manager);
|
||||||
efl_key_data_set(focus_main, "__user_parent", root_manager);
|
efl_key_data_set(focus_main, "__user_parent", root_manager);
|
||||||
|
|
||||||
Efl_Ui_Focus_Manager_Sub *subm = efl_add(EFL_UI_FOCUS_MANAGER_SUB_CLASS, focus_main,
|
Efl_Ui_Focus_Manager_Calc *subm = efl_add(EFL_UI_FOCUS_MANAGER_CALC_CLASS, focus_main,
|
||||||
efl_ui_focus_manager_root_set(efl_added, root)
|
efl_ui_focus_manager_root_set(efl_added, root)
|
||||||
);
|
);
|
||||||
|
|
||||||
efl_composite_attach(focus_main, subm);
|
efl_composite_attach(focus_main, subm);
|
||||||
|
|
||||||
|
efl_event_callback_call(focus_main, EFL_UI_FOCUS_USER_EVENT_MANAGER_CHANGED, NULL);
|
||||||
|
|
||||||
efl_ui_focus_manager_calc_register_logical(manager, focus_main, root_manager, subm);
|
efl_ui_focus_manager_calc_register_logical(manager, focus_main, root_manager, subm);
|
||||||
|
|
||||||
*sub = focus_main;
|
*sub = focus_main;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
class Focus.Test.Sub.Main(Efl.Object, Efl.Ui.Focus.User, Efl.Ui.Focus.Object, Efl.Ui.Focus.Manager) {
|
class Focus.Test.Sub.Main(Efl.Object, Efl.Ui.Focus.User, Efl.Ui.Focus.Object, Efl.Ui.Focus.Manager.Sub) {
|
||||||
implements {
|
implements {
|
||||||
Efl.Ui.Focus.User.manager { get; }
|
Efl.Ui.Focus.User.manager { get; }
|
||||||
Efl.Ui.Focus.User.parent { get; }
|
Efl.Ui.Focus.User.parent { get; }
|
||||||
|
|
Loading…
Reference in New Issue