forked from enlightenment/efl
elm_widget: add factory method to the widget
with this function you can trap the creation of the mangers, and change the behaviour as you need it. For example returning a custom manager.
This commit is contained in:
parent
65e8bf7f9f
commit
af858d1d93
|
@ -5276,15 +5276,25 @@ _efl_ui_win_efl_canvas_object_legacy_ctor(Eo *obj, Efl_Ui_Win_Data *sd)
|
|||
efl_canvas_object_legacy_ctor(efl_super(obj, MY_CLASS));
|
||||
}
|
||||
|
||||
EOLIAN static Efl_Ui_Focus_Manager*
|
||||
_efl_ui_win_elm_widget_focus_manager_factory(Eo *obj EINA_UNUSED, Efl_Ui_Win_Data *pd EINA_UNUSED, Efl_Ui_Focus_Object *root)
|
||||
{
|
||||
Efl_Ui_Focus_Manager *manager;
|
||||
|
||||
manager = efl_add(EFL_UI_FOCUS_MANAGER_CLASS, NULL,
|
||||
efl_ui_focus_manager_root_set(efl_added, root)
|
||||
);
|
||||
|
||||
return manager;
|
||||
}
|
||||
|
||||
EOLIAN static Eo *
|
||||
_efl_ui_win_efl_object_constructor(Eo *obj, Efl_Ui_Win_Data *pd)
|
||||
{
|
||||
/* Do nothing. */
|
||||
/* XXX: We are calling the constructor chain from the finalizer. It's
|
||||
* really bad and hacky. Needs fixing. */
|
||||
pd->manager = efl_add(EFL_UI_FOCUS_MANAGER_CLASS, obj,
|
||||
efl_ui_focus_manager_root_set(efl_added, obj)
|
||||
);
|
||||
pd->manager = elm_obj_widget_focus_manager_factory(obj, obj);
|
||||
|
||||
efl_composite_attach(obj, pd->manager);
|
||||
|
||||
|
|
|
@ -937,6 +937,7 @@ class Efl.Ui.Win (Elm.Widget, Efl.Canvas, Elm.Interface.Atspi.Window,
|
|||
Elm.Widget.theme_apply;
|
||||
Elm.Widget.on_focus;
|
||||
Elm.Widget.widget_event;
|
||||
Elm.Widget.focus_manager_factory;
|
||||
Elm.Interface.Atspi_Accessible.parent { get; }
|
||||
Elm.Interface.Atspi_Accessible.state_set { get; }
|
||||
Elm.Interface.Atspi_Accessible.name { get; }
|
||||
|
|
|
@ -687,6 +687,18 @@ elm_hover_add(Evas_Object *parent)
|
|||
return obj;
|
||||
}
|
||||
|
||||
EOLIAN static Efl_Ui_Focus_Manager*
|
||||
_elm_hover_elm_widget_focus_manager_factory(Eo *obj EINA_UNUSED, Elm_Hover_Data *pd EINA_UNUSED, Efl_Ui_Focus_Object *root)
|
||||
{
|
||||
Efl_Ui_Focus_Manager *manager;
|
||||
|
||||
manager = efl_add(EFL_UI_FOCUS_MANAGER_CLASS, NULL,
|
||||
efl_ui_focus_manager_root_set(efl_added, root)
|
||||
);
|
||||
|
||||
return manager;
|
||||
}
|
||||
|
||||
EOLIAN static Eo *
|
||||
_elm_hover_efl_object_constructor(Eo *obj, Elm_Hover_Data *pd)
|
||||
{
|
||||
|
@ -695,9 +707,7 @@ _elm_hover_efl_object_constructor(Eo *obj, Elm_Hover_Data *pd)
|
|||
evas_object_smart_callbacks_descriptions_set(obj, _smart_callbacks);
|
||||
elm_interface_atspi_accessible_role_set(obj, ELM_ATSPI_ROLE_POPUP_MENU);
|
||||
|
||||
pd->manager = efl_add(EFL_UI_FOCUS_MANAGER_CLASS, NULL,
|
||||
efl_ui_focus_manager_root_set(efl_added, obj)
|
||||
);
|
||||
pd->manager = elm_obj_widget_focus_manager_factory(obj, obj);
|
||||
|
||||
efl_composite_attach(obj, pd->manager);
|
||||
|
||||
|
|
|
@ -70,6 +70,7 @@ class Elm.Hover (Elm.Layout, Efl.Ui.Clickable, Elm.Interface.Atspi_Widget_Action
|
|||
Elm.Widget.focus_direction_manager_is;
|
||||
Elm.Widget.focus_next_manager_is;
|
||||
Elm.Widget.sub_object_del;
|
||||
Elm.Widget.focus_manager_factory;
|
||||
Elm.Layout.sizing_eval;
|
||||
Elm.Layout.content_aliases { get; }
|
||||
Elm.Interface.Atspi_Widget_Action.elm_actions { get; }
|
||||
|
|
|
@ -4654,11 +4654,22 @@ _focused_element(void *data, const Efl_Event *event)
|
|||
elm_interface_scrollable_region_bring_in(obj, geom.x, geom.y, geom.w, geom.h);
|
||||
}
|
||||
|
||||
EOLIAN static Efl_Ui_Focus_Manager*
|
||||
_elm_interface_scrollable_elm_widget_focus_manager_factory(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *pd EINA_UNUSED, Efl_Ui_Focus_Object *root)
|
||||
{
|
||||
Efl_Ui_Focus_Manager *manager;
|
||||
|
||||
manager = efl_add(EFL_UI_FOCUS_MANAGER_SUB_CLASS, obj,
|
||||
efl_ui_focus_manager_root_set(efl_added, root)
|
||||
);
|
||||
|
||||
return manager;
|
||||
}
|
||||
|
||||
EOLIAN static Efl_Object*
|
||||
_elm_interface_scrollable_efl_object_constructor(Eo *obj, Elm_Scrollable_Smart_Interface_Data *pd EINA_UNUSED)
|
||||
{
|
||||
pd->manager = efl_add(EFL_UI_FOCUS_MANAGER_SUB_CLASS, obj,
|
||||
efl_ui_focus_manager_root_set(efl_added, obj));
|
||||
pd->manager = elm_obj_widget_focus_manager_factory(obj, obj);
|
||||
|
||||
efl_composite_attach(obj, pd->manager);
|
||||
|
||||
|
|
|
@ -42,7 +42,7 @@ enum Elm.Scroller.Movement_Block
|
|||
}
|
||||
|
||||
|
||||
mixin Elm.Interface_Scrollable(Efl.Ui.Scrollable, Efl.Canvas.Group, Efl.Ui.Focus.Manager)
|
||||
mixin Elm.Interface_Scrollable(Efl.Ui.Scrollable, Efl.Canvas.Group, Efl.Ui.Focus.Manager, Elm.Widget)
|
||||
{
|
||||
[[Elm scrollable mixin]]
|
||||
eo_prefix: elm_interface_scrollable;
|
||||
|
@ -682,6 +682,7 @@ mixin Elm.Interface_Scrollable(Efl.Ui.Scrollable, Efl.Canvas.Group, Efl.Ui.Focus
|
|||
Efl.Object.constructor;
|
||||
Efl.Ui.Focus.Manager.border_elements { get; }
|
||||
Efl.Ui.Focus.Manager.focus;
|
||||
Elm.Widget.focus_manager_factory;
|
||||
}
|
||||
events {
|
||||
changed; [[Called when content changed]]
|
||||
|
|
|
@ -108,6 +108,20 @@ elm_win_inwin_add(Evas_Object *parent)
|
|||
return obj;
|
||||
}
|
||||
|
||||
|
||||
EOLIAN static Efl_Ui_Focus_Manager*
|
||||
_elm_inwin_elm_widget_focus_manager_factory(Eo *obj EINA_UNUSED, Elm_Inwin_Data *pd EINA_UNUSED, Efl_Ui_Focus_Object *root)
|
||||
{
|
||||
Efl_Ui_Focus_Manager *manager;
|
||||
|
||||
manager = efl_add(EFL_UI_FOCUS_MANAGER_ROOT_FOCUS_CLASS, NULL,
|
||||
efl_ui_focus_manager_root_set(efl_added, root)
|
||||
);
|
||||
|
||||
return manager;
|
||||
}
|
||||
|
||||
|
||||
EOLIAN static Eo *
|
||||
_elm_inwin_efl_object_constructor(Eo *obj, Elm_Inwin_Data *pd EINA_UNUSED)
|
||||
{
|
||||
|
@ -125,9 +139,7 @@ _elm_inwin_efl_object_constructor(Eo *obj, Elm_Inwin_Data *pd EINA_UNUSED)
|
|||
efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY);
|
||||
elm_interface_atspi_accessible_role_set(obj, ELM_ATSPI_ROLE_GLASS_PANE);
|
||||
|
||||
pd->manager = efl_add(EFL_UI_FOCUS_MANAGER_ROOT_FOCUS_CLASS, NULL,
|
||||
efl_ui_focus_manager_root_set(efl_added, obj)
|
||||
);
|
||||
pd->manager = elm_obj_widget_focus_manager_factory(obj, obj);
|
||||
|
||||
efl_composite_attach(obj, pd->manager);
|
||||
|
||||
|
|
|
@ -24,6 +24,7 @@ class Elm.Inwin (Elm.Layout, Efl.Ui.Focus.Manager)
|
|||
Elm.Widget.widget_parent { set; }
|
||||
Elm.Widget.focus_next_manager_is;
|
||||
Elm.Widget.focus_next;
|
||||
Elm.Widget.focus_manager_factory;
|
||||
Elm.Layout.content_aliases { get; }
|
||||
Elm.Layout.sizing_eval;
|
||||
Efl.Gfx.visible { set; }
|
||||
|
|
|
@ -801,21 +801,27 @@ elm_menu_add(Evas_Object *parent)
|
|||
return efl_add(MY_CLASS, parent);
|
||||
}
|
||||
|
||||
EOLIAN static Efl_Ui_Focus_Manager*
|
||||
_elm_menu_elm_widget_focus_manager_factory(Eo *obj EINA_UNUSED, Elm_Menu_Data *pd EINA_UNUSED, Efl_Ui_Focus_Object *root)
|
||||
{
|
||||
Efl_Ui_Focus_Manager *manager;
|
||||
|
||||
manager = efl_add(EFL_UI_FOCUS_MANAGER_CLASS, NULL,
|
||||
efl_ui_focus_manager_root_set(efl_added, root)
|
||||
);
|
||||
|
||||
return manager;
|
||||
}
|
||||
|
||||
EOLIAN static Eo *
|
||||
_elm_menu_efl_object_constructor(Eo *obj, Elm_Menu_Data *sd)
|
||||
{
|
||||
Eo *parent = NULL;
|
||||
Efl_Ui_Focus_Manager *manager;
|
||||
|
||||
{
|
||||
Efl_Ui_Focus_Manager *manager;
|
||||
|
||||
manager = efl_add(EFL_UI_FOCUS_MANAGER_CLASS, NULL,
|
||||
efl_ui_focus_manager_root_set(efl_added, obj)
|
||||
);
|
||||
|
||||
efl_composite_attach(obj, manager);
|
||||
_efl_ui_focus_manager_redirect_events_add(manager, obj);
|
||||
}
|
||||
manager = elm_obj_widget_focus_manager_factory(obj, obj);
|
||||
efl_composite_attach(obj, manager);
|
||||
_efl_ui_focus_manager_redirect_events_add(manager, obj);
|
||||
|
||||
obj = efl_constructor(efl_super(obj, MY_CLASS));
|
||||
efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY);
|
||||
|
|
|
@ -54,6 +54,7 @@ class Elm.Menu (Elm.Widget, Efl.Ui.Clickable, Efl.Ui.Menu,
|
|||
Elm.Widget.widget_parent { get; set; }
|
||||
Elm.Widget.theme_apply;
|
||||
Elm.Widget.translate;
|
||||
Elm.Widget.focus_manager_factory;
|
||||
Elm.Interface.Atspi_Accessible.children { get; }
|
||||
Elm.Interface.Atspi.Selection.selected_children_count { get; }
|
||||
Elm.Interface.Atspi.Selection.selected_child { get; }
|
||||
|
|
|
@ -6504,6 +6504,14 @@ _elm_widget_efl_ui_focus_object_focus_set(Eo *obj, Elm_Widget_Smart_Data *pd, Ei
|
|||
efl_ui_focus_object_focus_set(efl_super(obj, MY_CLASS), focus);
|
||||
}
|
||||
|
||||
EOLIAN static Efl_Ui_Focus_Manager*
|
||||
_elm_widget_focus_manager_factory(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *pd EINA_UNUSED, Efl_Ui_Focus_Object *root EINA_UNUSED)
|
||||
{
|
||||
ERR("No manager presented");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/* Internal EO APIs and hidden overrides */
|
||||
|
||||
#define ELM_WIDGET_EXTRA_OPS \
|
||||
|
|
|
@ -799,6 +799,16 @@ abstract Elm.Widget (Efl.Canvas.Group, Elm.Interface.Atspi_Accessible, Elm.Inter
|
|||
}
|
||||
return : bool; [[return if it registered fully or not]]
|
||||
}
|
||||
focus_manager_factory {
|
||||
[[If the widget needs a manager, this function is called
|
||||
|
||||
It can be used and overriden to inject your own manager or set custom options on the manager
|
||||
]]
|
||||
params {
|
||||
root : Efl.Ui.Focus.Object; [[the logical root to use in the manager.]]
|
||||
}
|
||||
return : Efl.Ui.Focus.Manager;
|
||||
}
|
||||
}
|
||||
implements {
|
||||
class.constructor;
|
||||
|
|
Loading…
Reference in New Issue