focus: update object definition
Summary: This introduces a new focus system and the migration to this system. Test Plan: run elementary_test Reviewers: cedric Differential Revision: https://phab.enlightenment.org/D4511
This commit is contained in:
parent
716ec352d1
commit
b056857093
|
@ -54,17 +54,70 @@ static const Evas_Smart_Cb_Description _smart_callbacks[] = {
|
|||
};
|
||||
|
||||
static Eina_Bool _key_action_select(Evas_Object *obj, const char *params);
|
||||
static Eina_Bool _key_action_move(Evas_Object *obj, const char *params);
|
||||
static void _sizing_eval(Evas_Object *obj);
|
||||
|
||||
static const Elm_Action key_actions[] = {
|
||||
{"select", _key_action_select},
|
||||
{"move", _key_action_move},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
static void _item_select(Elm_Toolbar_Item_Data *it);
|
||||
|
||||
static void
|
||||
_item_focus_eval(Elm_Toolbar_Item_Data *pd)
|
||||
{
|
||||
Eina_Bool want = EINA_TRUE;
|
||||
Efl_Ui_Focus_Object *widget;
|
||||
Efl_Ui_Focus_Manager *manager;
|
||||
|
||||
if (elm_wdg_item_disabled_get(pd->base->eo_obj))
|
||||
want = EINA_FALSE;
|
||||
|
||||
if (!evas_object_visible_get(VIEW(pd)))
|
||||
want = EINA_FALSE;
|
||||
|
||||
if (!!pd->registered == !!want) return;
|
||||
|
||||
//grab manager from widget
|
||||
widget = WIDGET(pd);
|
||||
manager = efl_ui_focus_user_manager_get(widget);
|
||||
|
||||
if (want)
|
||||
{
|
||||
efl_ui_focus_manager_register(manager, EO_OBJ(pd), widget, NULL);
|
||||
pd->registered = manager;
|
||||
}
|
||||
else
|
||||
{
|
||||
efl_ui_focus_manager_unregister(manager, EO_OBJ(pd));
|
||||
pd->registered = NULL;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
_item_focus_eval_all(Elm_Toolbar *obj, Elm_Toolbar_Data *pd)
|
||||
{
|
||||
Elm_Toolbar_Item_Data *it;
|
||||
Elm_Widget_Smart_Data *wpd;
|
||||
Eina_List *order = NULL;
|
||||
|
||||
wpd = efl_data_scope_get(obj, ELM_WIDGET_CLASS);
|
||||
EINA_INLIST_FOREACH(pd->items, it)
|
||||
{
|
||||
_item_focus_eval(it);
|
||||
order = eina_list_append(order, EO_OBJ(it));
|
||||
}
|
||||
|
||||
if (pd->more_item)
|
||||
{
|
||||
_item_focus_eval(pd->more_item);
|
||||
order = eina_list_append(order, EO_OBJ(pd->more_item));
|
||||
}
|
||||
|
||||
efl_ui_focus_manager_update_order(wpd->focus.manager, obj, order);
|
||||
}
|
||||
|
||||
static int
|
||||
_toolbar_item_prio_compare_cb(const void *i1,
|
||||
const void *i2)
|
||||
|
@ -594,6 +647,8 @@ _resize_job(void *data)
|
|||
eina_list_free(list);
|
||||
|
||||
_mirrored_set(obj, elm_widget_mirrored_get(obj));
|
||||
|
||||
_item_focus_eval_all(obj, sd);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -781,47 +836,6 @@ _elm_toolbar_elm_widget_on_focus(Eo *obj, Elm_Toolbar_Data *sd, Elm_Object_Item
|
|||
return EINA_TRUE;
|
||||
}
|
||||
|
||||
static Elm_Toolbar_Item_Data *
|
||||
_focus_next_item_get(Evas_Object *obj, Eina_Bool reverse)
|
||||
{
|
||||
ELM_TOOLBAR_DATA_GET(obj, sd);
|
||||
Eina_List *list = NULL, *children_list;
|
||||
Elm_Toolbar_Item_Data *it = NULL;
|
||||
Evas_Object *it_obj = NULL;
|
||||
|
||||
children_list = evas_object_box_children_get(sd->bx);
|
||||
if (reverse)
|
||||
children_list = eina_list_reverse(children_list);
|
||||
list = children_list;
|
||||
if (sd->focused_item)
|
||||
{
|
||||
ELM_TOOLBAR_ITEM_DATA_GET(sd->focused_item, focus_it);
|
||||
list = eina_list_data_find_list(list, VIEW(focus_it));
|
||||
if (list) list = eina_list_next(list);
|
||||
}
|
||||
it_obj = eina_list_data_get(list);
|
||||
if (it_obj) it = evas_object_data_get(it_obj, "item");
|
||||
else it = NULL;
|
||||
|
||||
while (it &&
|
||||
(it->separator ||
|
||||
elm_object_item_disabled_get(EO_OBJ(it))))
|
||||
{
|
||||
if (list) list = eina_list_next(list);
|
||||
if (!list)
|
||||
{
|
||||
it = NULL;
|
||||
break;
|
||||
}
|
||||
it_obj = eina_list_data_get(list);
|
||||
if (it_obj) it = evas_object_data_get(it_obj, "item");
|
||||
else it = NULL;
|
||||
}
|
||||
eina_list_free(children_list);
|
||||
|
||||
return it;
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
_elm_toolbar_item_elm_widget_item_focus_set(Eo *eo_it, Elm_Toolbar_Item_Data *it, Eina_Bool focused)
|
||||
{
|
||||
|
@ -871,28 +885,6 @@ _elm_toolbar_item_elm_widget_item_focus_get(Eo *eo_it, Elm_Toolbar_Item_Data *it
|
|||
return EINA_FALSE;
|
||||
}
|
||||
|
||||
static Eina_Bool
|
||||
_item_focused_next( Evas_Object *obj,
|
||||
Eina_Bool reverse,
|
||||
Elm_Focus_Direction dir)
|
||||
{
|
||||
ELM_TOOLBAR_DATA_GET(obj, sd);
|
||||
Elm_Toolbar_Item_Data *next_focused_item;
|
||||
|
||||
next_focused_item = _focus_next_item_get(obj, reverse);
|
||||
if (!next_focused_item)
|
||||
return EINA_FALSE;
|
||||
|
||||
if ((sd->orientation == EFL_ORIENT_HORIZONTAL && (dir == ELM_FOCUS_LEFT || dir == ELM_FOCUS_RIGHT))
|
||||
|| (sd->orientation == EFL_ORIENT_VERTICAL && (dir == ELM_FOCUS_UP || dir == ELM_FOCUS_DOWN)))
|
||||
{
|
||||
elm_object_item_focus_set(EO_OBJ(next_focused_item), EINA_TRUE);
|
||||
return EINA_TRUE;
|
||||
}
|
||||
_elm_widget_focus_highlight_start(obj);
|
||||
return EINA_FALSE;
|
||||
}
|
||||
|
||||
static Eina_Bool
|
||||
_key_action_select(Evas_Object *obj, const char *params EINA_UNUSED)
|
||||
{
|
||||
|
@ -907,38 +899,6 @@ _key_action_select(Evas_Object *obj, const char *params EINA_UNUSED)
|
|||
return EINA_TRUE;
|
||||
}
|
||||
|
||||
static Eina_Bool
|
||||
_key_action_move(Evas_Object *obj, const char *params)
|
||||
{
|
||||
const char *dir = params;
|
||||
|
||||
_elm_widget_focus_auto_show(obj);
|
||||
if (!strcmp(dir, "left"))
|
||||
{
|
||||
if (!_item_focused_next(obj, EINA_TRUE, ELM_FOCUS_LEFT))
|
||||
return EINA_FALSE;
|
||||
}
|
||||
else if (!strcmp(dir, "right"))
|
||||
{
|
||||
if (!_item_focused_next(obj, EINA_FALSE, ELM_FOCUS_RIGHT))
|
||||
return EINA_FALSE;
|
||||
}
|
||||
else if (!strcmp(dir, "up"))
|
||||
{
|
||||
if (!_item_focused_next(obj, EINA_TRUE, ELM_FOCUS_UP))
|
||||
return EINA_FALSE;
|
||||
}
|
||||
else if (!strcmp(dir, "down"))
|
||||
{
|
||||
if (!_item_focused_next(obj, EINA_FALSE, ELM_FOCUS_DOWN))
|
||||
return EINA_FALSE;
|
||||
}
|
||||
else return EINA_FALSE;
|
||||
|
||||
return EINA_TRUE;
|
||||
|
||||
}
|
||||
|
||||
EOLIAN static Eina_Bool
|
||||
_elm_toolbar_elm_widget_widget_event(Eo *obj, Elm_Toolbar_Data *sd, Evas_Object *src, Evas_Callback_Type type, void *event_info)
|
||||
{
|
||||
|
@ -997,6 +957,13 @@ _resize_cb(void *data,
|
|||
_resizing_eval(data);
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
_elm_toolbar_item_elm_widget_item_disabled_set(Eo *eo_id, Elm_Toolbar_Item_Data *sd, Eina_Bool disabled)
|
||||
{
|
||||
elm_wdg_item_disabled_set(efl_super(eo_id, ELM_TOOLBAR_ITEM_CLASS), disabled);
|
||||
_item_focus_eval(sd);
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
_elm_toolbar_item_elm_widget_item_disable(Eo *eo_toolbar, Elm_Toolbar_Item_Data *toolbar_it)
|
||||
{
|
||||
|
@ -2407,6 +2374,12 @@ _elm_toolbar_item_efl_object_destructor(Eo *eo_item, Elm_Toolbar_Item_Data *item
|
|||
}
|
||||
}
|
||||
|
||||
if (item->registered)
|
||||
{
|
||||
efl_ui_focus_manager_unregister(item->registered, eo_item);
|
||||
item->registered = NULL;
|
||||
}
|
||||
|
||||
_item_del(item);
|
||||
|
||||
if (item != sd->more_item)
|
||||
|
@ -2450,6 +2423,12 @@ _access_widget_item_register(Elm_Toolbar_Item_Data *it)
|
|||
_elm_access_activate_callback_set(ai, _access_activate_cb, NULL);
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
_elm_toolbar_item_efl_ui_focus_object_geometry_get(Eo *obj EINA_UNUSED, Elm_Toolbar_Item_Data *pd, Eina_Rectangle *rect)
|
||||
{
|
||||
evas_object_geometry_get(VIEW(pd), &rect->x, &rect->y, &rect->w, &rect->h);
|
||||
}
|
||||
|
||||
EOLIAN static Eo *
|
||||
_elm_toolbar_item_efl_object_constructor(Eo *eo_it, Elm_Toolbar_Item_Data *it)
|
||||
{
|
||||
|
@ -2486,6 +2465,7 @@ _item_new(Evas_Object *obj,
|
|||
WIDGET_ITEM_DATA_SET(EO_OBJ(it), data);
|
||||
|
||||
VIEW(it) = elm_layout_add(obj);
|
||||
elm_widget_tree_unfocusable_set(VIEW(it), EINA_TRUE);
|
||||
evas_object_data_set(VIEW(it), "item", it);
|
||||
elm_interface_atspi_accessible_type_set(VIEW(it), ELM_ATSPI_TYPE_DISABLED);
|
||||
|
||||
|
@ -3070,6 +3050,13 @@ _elm_toolbar_coordinates_adjust(Elm_Toolbar_Item_Data *it,
|
|||
}
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
_elm_toolbar_item_efl_ui_focus_object_focus_set(Eo *obj, Elm_Toolbar_Item_Data *pd EINA_UNUSED, Eina_Bool focus)
|
||||
{
|
||||
efl_ui_focus_object_focus_set(efl_super(obj, ELM_TOOLBAR_ITEM_CLASS), focus);
|
||||
elm_wdg_item_focus_set(obj, focus);
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
_elm_toolbar_elm_widget_focus_highlight_geometry_get(const Eo *obj, Elm_Toolbar_Data *sd, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
|
||||
{
|
||||
|
@ -3093,6 +3080,13 @@ elm_toolbar_add(Evas_Object *parent)
|
|||
return obj;
|
||||
}
|
||||
|
||||
EOLIAN static Eina_Bool
|
||||
_elm_toolbar_elm_widget_focus_register(Eo *obj, Elm_Toolbar_Data *pd EINA_UNUSED, Efl_Ui_Focus_Manager *manager, Efl_Ui_Focus_Object *logical, Eina_Bool full EINA_UNUSED)
|
||||
{
|
||||
efl_ui_focus_manager_register_logical(manager, obj, logical, NULL);
|
||||
return EINA_FALSE;
|
||||
}
|
||||
|
||||
EOLIAN static Eo *
|
||||
_elm_toolbar_efl_object_constructor(Eo *obj, Elm_Toolbar_Data *_pd EINA_UNUSED)
|
||||
{
|
||||
|
@ -4043,10 +4037,6 @@ _elm_toolbar_elm_interface_atspi_widget_action_elm_actions_get(Eo *obj EINA_UNUS
|
|||
{
|
||||
static Elm_Atspi_Action atspi_actions[] = {
|
||||
{ "select", "select", NULL, _key_action_select},
|
||||
{ "move,left", "move", "left", _key_action_move},
|
||||
{ "move,right", "move", "right", _key_action_move},
|
||||
{ "move,up", "move", "up", _key_action_move},
|
||||
{ "move,down", "move", "down", _key_action_move},
|
||||
{ NULL, NULL, NULL, NULL }
|
||||
};
|
||||
return &atspi_actions[0];
|
||||
|
|
|
@ -332,6 +332,7 @@ class Elm.Toolbar (Elm.Widget, Elm.Interface_Scrollable, Efl.Orientation,
|
|||
Elm.Widget.focus_highlight_geometry_get;
|
||||
Elm.Widget.focused_item { get; }
|
||||
Efl.Orientation.orientation { get; set; }
|
||||
Elm.Widget.focus_register;
|
||||
Elm.Interface.Atspi_Widget_Action.elm_actions { get; }
|
||||
Elm.Interface.Atspi_Accessible.children { get; }
|
||||
Elm.Interface.Atspi_Accessible.state_set { get; }
|
||||
|
|
|
@ -23,7 +23,7 @@ struct Elm.Toolbar.Item.State
|
|||
data: const(void_ptr); [[Item data]]
|
||||
}
|
||||
|
||||
class Elm.Toolbar.Item(Elm.Widget.Item, Efl.Ui.Item)
|
||||
class Elm.Toolbar.Item(Elm.Widget.Item, Efl.Ui.Item, Efl.Ui.Focus.Object)
|
||||
{
|
||||
[[Elementary toolbar item class]]
|
||||
legacy_prefix: elm_toolbar_item;
|
||||
|
@ -266,11 +266,14 @@ class Elm.Toolbar.Item(Elm.Widget.Item, Efl.Ui.Item)
|
|||
Efl.Object.constructor;
|
||||
Efl.Object.destructor;
|
||||
Elm.Widget.Item.disable;
|
||||
Elm.Widget.Item.disabled { set; }
|
||||
Elm.Widget.Item.focus { get; set; }
|
||||
Elm.Widget.Item.signal_emit;
|
||||
Elm.Widget.Item.part_text { get; set; }
|
||||
Elm.Widget.Item.part_content { get; set; }
|
||||
Elm.Widget.Item.part_content_unset;
|
||||
Efl.Ui.Focus.Object.geometry_get;
|
||||
Efl.Ui.Focus.Object.focus { set; }
|
||||
Elm.Interface.Atspi_Accessible.name { get; }
|
||||
Elm.Interface.Atspi_Accessible.state_set { get; }
|
||||
Efl.Ui.Item.selected { get; set; }
|
||||
|
|
|
@ -83,6 +83,7 @@ struct _Elm_Toolbar_Item_Data
|
|||
Eina_List *states;
|
||||
Eina_List *current_state;
|
||||
|
||||
Efl_Ui_Focus_Manager *registered;
|
||||
Eina_Bool separator : 1;
|
||||
Eina_Bool selected : 1;
|
||||
Eina_Bool menu : 1;
|
||||
|
|
Loading…
Reference in New Issue