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:
Marcel Hollerbach 2017-06-08 23:52:37 +02:00
parent 65e8bf7f9f
commit af858d1d93
12 changed files with 94 additions and 22 deletions

View File

@ -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);

View File

@ -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; }

View File

@ -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);

View File

@ -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; }

View File

@ -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);

View File

@ -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]]

View File

@ -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);

View File

@ -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; }

View File

@ -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);

View File

@ -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; }

View File

@ -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 \

View File

@ -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;