diff options
author | YeongJong Lee <yj34.lee@samsung.com> | 2018-04-24 17:30:51 +0900 |
---|---|---|
committer | WooHyun Jung <wh0705.jung@samsung.com> | 2018-04-24 17:30:51 +0900 |
commit | 86e1ac2baefa9be2e58d5ae5f63b1007ba702d8a (patch) | |
tree | 3e471e9b376d95a02e140ae04a069d40b95fb046 | |
parent | b1f4250871e4eec8bf4c57085ea7200713d2f2b2 (diff) | |
download | efl-86e1ac2baefa9be2e58d5ae5f63b1007ba702d8a.tar.gz |
focus_legacy: recover legacy focus
Summary:
elm_grid: recover legacy focus
efl_ui_frame: recover legacy focus
efl_ui_widget: legacy focus don't use EFL_UI_FOCUS_OBEJCT_EVENT_FOCUS_CHANGED
efl_ui_progressbar: recover legacy focus
elm_spinner: recover legacy focus
efl_ui_slider: recover legacy focus
elm_notify: recover legacy focus
elm_hoversel: recover legacy focus
elm_hover: recover legacy focus
elm_ctxpopup: recover legacy focus
efl_ui_panes: recover legacy focus
elm_conform: recover legacy focus
elm_genlist: fix build warning
elm_list: recover legacy focus
elm_label: recover legacy focus
elm_index: recover legacy focus
Reviewers: woohyun
Subscribers: cedric
Differential Revision: https://phab.enlightenment.org/D5984
28 files changed, 690 insertions, 46 deletions
diff --git a/src/lib/elementary/efl_ui_frame.c b/src/lib/elementary/efl_ui_frame.c index 2b9a1fe00b..f6f8bcd2a6 100644 --- a/src/lib/elementary/efl_ui_frame.c +++ b/src/lib/elementary/efl_ui_frame.c @@ -40,6 +40,51 @@ _sizing_eval(Evas_Object *obj, evas_object_size_hint_max_set(obj, -1, -1); } +EOLIAN static Eina_Bool +_efl_ui_frame_efl_ui_widget_focus_next_manager_is(Eo *obj EINA_UNUSED, Efl_Ui_Frame_Data *_pd EINA_UNUSED) +{ + return EINA_TRUE; +} + +EOLIAN static Eina_Bool +_efl_ui_frame_efl_ui_widget_focus_next(Eo *obj EINA_UNUSED, Efl_Ui_Frame_Data *_pd EINA_UNUSED, Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item) +{ + Evas_Object *content; + + content = elm_layout_content_get(obj, NULL); + + if (!content) return EINA_FALSE; + + else + { + /* attempt to follow focus cycle into sub-object */ + return efl_ui_widget_focus_next_get(content, dir, next, next_item); + } +} + +EOLIAN static Eina_Bool +_efl_ui_frame_efl_ui_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, Efl_Ui_Frame_Data *_pd EINA_UNUSED) +{ + return EINA_TRUE; +} + +EOLIAN static Eina_Bool +_efl_ui_frame_efl_ui_widget_focus_direction(Eo *obj EINA_UNUSED, Efl_Ui_Frame_Data *_pd EINA_UNUSED, const Evas_Object *base, double degree, Evas_Object **direction, Elm_Object_Item **direction_item, double *weight) +{ + Evas_Object *content; + + content = elm_layout_content_get(obj, NULL); + + if (!content) return EINA_FALSE; + + else + { + /* Try to cycle focus on content */ + return efl_ui_widget_focus_direction_get + (content, base, degree, direction, direction_item, weight); + } +} + static void _recalc(void *data, const Efl_Event *event EINA_UNUSED) { diff --git a/src/lib/elementary/efl_ui_frame.eo b/src/lib/elementary/efl_ui_frame.eo index f05017f709..2831a351b6 100644 --- a/src/lib/elementary/efl_ui_frame.eo +++ b/src/lib/elementary/efl_ui_frame.eo @@ -56,6 +56,10 @@ class Efl.Ui.Frame (Efl.Ui.Layout, Efl.Ui.Clickable, Efl.Text, Efl.Text.Markup, implements { Efl.Object.constructor; Efl.Canvas.Group.group_calculate; + Efl.Ui.Widget.focus_direction; + Efl.Ui.Widget.focus_next_manager_is; + Efl.Ui.Widget.focus_next; + Efl.Ui.Widget.focus_direction_manager_is; Efl.Text.text { get; set; } Efl.Text.Markup.markup { get; set; } Efl.Ui.Translatable.translatable_text { get; set; } diff --git a/src/lib/elementary/efl_ui_panes.c b/src/lib/elementary/efl_ui_panes.c index 1888cf1dc4..d936a0432e 100644 --- a/src/lib/elementary/efl_ui_panes.c +++ b/src/lib/elementary/efl_ui_panes.c @@ -548,6 +548,65 @@ _efl_ui_panes_fixed_get(const Eo *obj EINA_UNUSED, Efl_Ui_Panes_Data *sd) return sd->fixed; } +EOLIAN static Eina_Bool +_efl_ui_panes_efl_ui_widget_focus_next(Eo *obj, Efl_Ui_Panes_Data *sd, Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item) +{ + double w, h; + unsigned char i; + Evas_Object *to_focus; + Evas_Object *chain[2]; + Evas_Object *left, *right; + Elm_Object_Item *to_focus_item; + + ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE); + + edje_object_part_drag_value_get + (wd->resize_obj, "elm.bar", &w, &h); + + left = elm_layout_content_get(obj, "left"); + right = elm_layout_content_get(obj, "right"); + + if (((sd->dir == EFL_UI_DIR_HORIZONTAL) && (EINA_DBL_EQ(h, 0.0))) || + ((sd->dir == EFL_UI_DIR_VERTICAL) && (EINA_DBL_EQ(w, 0.0)))) + { + return efl_ui_widget_focus_next_get(right, dir, next, next_item); + } + + /* Direction */ + if (dir == ELM_FOCUS_PREVIOUS) + { + chain[0] = right; + chain[1] = left; + } + else if (dir == ELM_FOCUS_NEXT) + { + chain[0] = left; + chain[1] = right; + } + else return EINA_FALSE; + + i = elm_widget_focus_get(chain[1]); + + if (efl_ui_widget_focus_next_get(chain[i], dir, next, next_item)) return EINA_TRUE; + + i = !i; + + if (efl_ui_widget_focus_next_get(chain[i], dir, &to_focus, &to_focus_item)) + { + *next = to_focus; + *next_item = to_focus_item; + return !!i; + } + + return EINA_FALSE; +} + +EOLIAN static Eina_Bool +_efl_ui_panes_efl_ui_widget_focus_next_manager_is(Eo *obj EINA_UNUSED, Efl_Ui_Panes_Data *_pd EINA_UNUSED) +{ + return EINA_TRUE; +} + /* Efl.Part begin */ static Eina_Bool diff --git a/src/lib/elementary/efl_ui_panes.eo b/src/lib/elementary/efl_ui_panes.eo index 41e8021cbd..2e24b41860 100644 --- a/src/lib/elementary/efl_ui_panes.eo +++ b/src/lib/elementary/efl_ui_panes.eo @@ -51,6 +51,8 @@ class Efl.Ui.Panes (Efl.Ui.Layout, Efl.Ui.Direction, implements { Efl.Object.constructor; Efl.Ui.Widget.theme_apply; + Efl.Ui.Widget.focus_next_manager_is; + Efl.Ui.Widget.focus_next; Efl.Ui.Direction.direction { get; set; [[Only supports $vertical and $horizontal. Default is $vertical.]] } Efl.Part.part; } diff --git a/src/lib/elementary/efl_ui_progressbar.c b/src/lib/elementary/efl_ui_progressbar.c index 1637958d99..33af1939c1 100644 --- a/src/lib/elementary/efl_ui_progressbar.c +++ b/src/lib/elementary/efl_ui_progressbar.c @@ -606,6 +606,18 @@ _efl_ui_progressbar_efl_ui_range_range_min_max_get(const Eo *obj EINA_UNUSED, Ef if (max) *max = sd->val_max; } +EOLIAN static Eina_Bool +_efl_ui_progressbar_efl_ui_widget_focus_next_manager_is(Eo *obj EINA_UNUSED, Efl_Ui_Progressbar_Data *_pd EINA_UNUSED) +{ + return EINA_FALSE; +} + +EOLIAN static Eina_Bool +_efl_ui_progressbar_efl_ui_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, Efl_Ui_Progressbar_Data *_pd EINA_UNUSED) +{ + return EINA_FALSE; +} + /* Efl.Part begin */ EOLIAN static Eo * diff --git a/src/lib/elementary/efl_ui_progressbar.eo b/src/lib/elementary/efl_ui_progressbar.eo index b2f033c5f1..2576acf96c 100644 --- a/src/lib/elementary/efl_ui_progressbar.eo +++ b/src/lib/elementary/efl_ui_progressbar.eo @@ -51,6 +51,8 @@ class Efl.Ui.Progressbar (Efl.Ui.Layout, Efl.Ui.Range, Efl.Ui.Format, implements { Efl.Object.constructor; Efl.Ui.Widget.theme_apply; + Efl.Ui.Widget.focus_next_manager_is; + Efl.Ui.Widget.focus_direction_manager_is; Efl.Ui.Range.range_value { get; set; } Efl.Ui.Range.range_min_max {get; set; } Efl.Ui.Direction.direction { get; set; } diff --git a/src/lib/elementary/efl_ui_slider.c b/src/lib/elementary/efl_ui_slider.c index 48c447bee4..f60d456430 100644 --- a/src/lib/elementary/efl_ui_slider.c +++ b/src/lib/elementary/efl_ui_slider.c @@ -308,7 +308,13 @@ _drag_start(void *data, const char *emission EINA_UNUSED, const char *source EINA_UNUSED) { - if (!efl_ui_focus_object_focus_get(data)) + Eina_Bool focused; + + if (elm_widget_is_legacy(data)) + focused = elm_widget_focus_get(data); + else + focused = efl_ui_focus_object_focus_get(data); + if (!focused) elm_object_focus_set(data, EINA_TRUE); _slider_update(data, EINA_TRUE); efl_event_callback_legacy_call(data, EFL_UI_SLIDER_EVENT_SLIDER_DRAG_START, NULL); @@ -405,12 +411,19 @@ _popup_hide(void *data, const char *source EINA_UNUSED) { EFL_UI_SLIDER_DATA_GET(data, sd); + Eina_Bool focused; if (!sd->popup_visible || !sd->popup) return; if (sd->indicator_visible_mode == ELM_SLIDER_INDICATOR_VISIBLE_MODE_ALWAYS) return; + + if (elm_widget_is_legacy(data)) + focused = elm_widget_focus_get(data); + else + focused = efl_ui_focus_object_focus_get(data); + if ((sd->indicator_visible_mode == ELM_SLIDER_INDICATOR_VISIBLE_MODE_ON_FOCUS) && - efl_ui_focus_object_focus_get(data)) + focused) return; edje_object_signal_emit(sd->popup, "popup,hide", "elm"); // XXX: for compat @@ -430,9 +443,15 @@ _popup_hide_done(void *data, const char *source EINA_UNUSED) { EFL_UI_SLIDER_DATA_GET(data, sd); + Eina_Bool focused; + + if (elm_widget_is_legacy(data)) + focused = elm_widget_focus_get(data); + else + focused = efl_ui_focus_object_focus_get(data); if (sd->popup) { - if (!((efl_ui_focus_object_focus_get(data)) && + if (!(focused && (sd->indicator_visible_mode == ELM_SLIDER_INDICATOR_VISIBLE_MODE_ON_FOCUS))) { evas_object_hide(sd->popup); @@ -441,7 +460,7 @@ _popup_hide_done(void *data, } if (sd->popup2) { - if (!((efl_ui_focus_object_focus_get(data)) && + if (!(focused && (sd->indicator_visible_mode == ELM_SLIDER_INDICATOR_VISIBLE_MODE_ON_FOCUS))) { evas_object_hide(sd->popup2); @@ -910,6 +929,7 @@ _spacer_down_cb(void *data, void *event_info) { EFL_UI_SLIDER_DATA_GET(data, sd); + Eina_Bool focused; Evas_Event_Mouse_Down *ev = event_info; Evas_Coord x, y, w, h; @@ -935,7 +955,12 @@ _spacer_down_cb(void *data, _move_knob_on_mouse(data, button_x, button_y); - if (!efl_ui_focus_object_focus_get(data)) + if (elm_widget_is_legacy(data)) + focused = elm_widget_focus_get(data); + else + focused = efl_ui_focus_object_focus_get(data); + + if (!focused) elm_object_focus_set(data, EINA_TRUE); _slider_update(data, EINA_TRUE); efl_event_callback_legacy_call(data, EFL_UI_SLIDER_EVENT_SLIDER_DRAG_START, NULL); @@ -1291,15 +1316,31 @@ _efl_ui_slider_efl_ui_range_range_step_set(Eo *obj EINA_UNUSED, Efl_Ui_Slider_Da } EOLIAN static Eina_Bool +_efl_ui_slider_efl_ui_widget_focus_next_manager_is(Eo *obj EINA_UNUSED, Efl_Ui_Slider_Data *_pd EINA_UNUSED) +{ + return EINA_FALSE; +} + +EOLIAN static Eina_Bool +_efl_ui_slider_efl_ui_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, Efl_Ui_Slider_Data *_pd EINA_UNUSED) +{ + return EINA_FALSE; +} + +EOLIAN static Eina_Bool _efl_ui_slider_efl_ui_focus_object_on_focus_update(Eo *obj, Efl_Ui_Slider_Data *sd EINA_UNUSED) { - Eina_Bool int_ret = EINA_FALSE; + Eina_Bool int_ret = EINA_FALSE, focused; int_ret = efl_ui_focus_object_on_focus_update(efl_super(obj, MY_CLASS)); + if (elm_widget_is_legacy(obj)) + focused = elm_widget_focus_get(obj); + else + focused = efl_ui_focus_object_focus_get(obj); - if ((sd->indicator_visible_mode == ELM_SLIDER_INDICATOR_VISIBLE_MODE_ON_FOCUS) && efl_ui_focus_object_focus_get(obj)) + if ((sd->indicator_visible_mode == ELM_SLIDER_INDICATOR_VISIBLE_MODE_ON_FOCUS) && focused) _popup_show(obj, NULL, NULL, NULL); - else if (!efl_ui_focus_object_focus_get(obj)) + else if (!focused) _popup_hide(obj, NULL, NULL, NULL); return int_ret; diff --git a/src/lib/elementary/efl_ui_slider.eo b/src/lib/elementary/efl_ui_slider.eo index e9a994590e..ce76335213 100644 --- a/src/lib/elementary/efl_ui_slider.eo +++ b/src/lib/elementary/efl_ui_slider.eo @@ -16,6 +16,8 @@ class Efl.Ui.Slider (Efl.Ui.Layout, Efl.Ui.Range, Efl.Ui.Direction, Efl.Canvas.Group.group_calculate; Efl.Ui.Widget.theme_apply; Efl.Ui.Widget.on_access_activate; + Efl.Ui.Widget.focus_next_manager_is; + Efl.Ui.Widget.focus_direction_manager_is; Efl.Ui.Focus.Object.on_focus_update; Efl.Ui.Widget.widget_event; Efl.Ui.Range.range_value { get; set; } diff --git a/src/lib/elementary/efl_ui_widget.c b/src/lib/elementary/efl_ui_widget.c index 9a2e347ccd..d2334d4f01 100644 --- a/src/lib/elementary/efl_ui_widget.c +++ b/src/lib/elementary/efl_ui_widget.c @@ -6450,13 +6450,7 @@ elm_widget_tree_dot_dump(const Evas_Object *top, static void _focus_event_changed(void *data EINA_UNUSED, const Efl_Event *event) { - Eina_Bool focused; - - if (elm_widget_is_legacy(event->object)) - focused = elm_widget_focus_get(event->object); - else - focused = efl_ui_focus_object_focus_get(event->object); - if (focused) + if (efl_ui_focus_object_focus_get(event->object)) evas_object_smart_callback_call(event->object, "focused", NULL); else evas_object_smart_callback_call(event->object, "unfocused", NULL); diff --git a/src/lib/elementary/elc_ctxpopup.c b/src/lib/elementary/elc_ctxpopup.c index 2f6d499eb3..04108b8c86 100644 --- a/src/lib/elementary/elc_ctxpopup.c +++ b/src/lib/elementary/elc_ctxpopup.c @@ -41,9 +41,11 @@ static const Evas_Smart_Cb_Description _smart_callbacks[] = { }; #undef ELM_PRIV_CTXPOPUP_SIGNALS +static Eina_Bool _key_action_move(Evas_Object *obj, const char *params); static Eina_Bool _key_action_escape(Evas_Object *obj, const char *params); static const Elm_Action key_actions[] = { + {"move", _key_action_move}, {"escape", _key_action_escape}, {NULL, NULL} }; @@ -62,6 +64,82 @@ _elm_ctxpopup_efl_ui_translatable_translation_update(Eo *obj, Elm_Ctxpopup_Data efl_ui_translatable_translation_update(efl_super(obj, MY_CLASS)); } + +EOLIAN static Eina_Bool +_elm_ctxpopup_efl_ui_widget_focus_next_manager_is(Eo *obj EINA_UNUSED, Elm_Ctxpopup_Data *_pd EINA_UNUSED) +{ + return EINA_TRUE; +} + +EOLIAN static Eina_Bool +_elm_ctxpopup_efl_ui_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, Elm_Ctxpopup_Data *_pd EINA_UNUSED) +{ + return EINA_TRUE; +} + +EOLIAN static Eina_Bool +_elm_ctxpopup_efl_ui_widget_focus_next(Eo *obj EINA_UNUSED, Elm_Ctxpopup_Data *sd, Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item) +{ + if (!sd) + return EINA_FALSE; + + if (!efl_ui_widget_focus_next_get(sd->box, dir, next, next_item)) + { + efl_ui_widget_focused_object_clear(sd->box); + efl_ui_widget_focus_next_get(sd->box, dir, next, next_item); + } + + return EINA_TRUE; +} + +EOLIAN static Eina_Bool +_elm_ctxpopup_efl_ui_widget_focus_direction(Eo *obj EINA_UNUSED, Elm_Ctxpopup_Data *sd, const Evas_Object *base, double degree, Evas_Object **direction, Elm_Object_Item **direction_item, double *weight) +{ + Eina_Bool int_ret; + + Eina_List *l = NULL; + void *(*list_data_get)(const Eina_List *list); + + if (!sd) + return EINA_FALSE; + + list_data_get = eina_list_data_get; + + l = eina_list_append(l, sd->box); + + int_ret = efl_ui_widget_focus_list_direction_get + (obj, base, l, list_data_get, degree, direction, direction_item, weight); + eina_list_free(l); + + return int_ret; +} + +static Eina_Bool +_key_action_move(Evas_Object *obj, const char *params) +{ + ELM_CTXPOPUP_DATA_GET(obj, sd); + const char *dir = params; + + if (!sd->box) return EINA_FALSE; + + _elm_widget_focus_auto_show(obj); + if (!strcmp(dir, "previous")) + efl_ui_widget_focus_cycle(sd->box, ELM_FOCUS_PREVIOUS); + else if (!strcmp(dir, "next")) + efl_ui_widget_focus_cycle(sd->box, ELM_FOCUS_NEXT); + else if (!strcmp(dir, "left")) + efl_ui_widget_focus_cycle(sd->box, ELM_FOCUS_LEFT); + else if (!strcmp(dir, "right")) + efl_ui_widget_focus_cycle(sd->box, ELM_FOCUS_RIGHT); + else if (!strcmp(dir, "up")) + efl_ui_widget_focus_cycle(sd->box, ELM_FOCUS_UP); + else if (!strcmp(dir, "down")) + efl_ui_widget_focus_cycle(sd->box, ELM_FOCUS_DOWN); + else return EINA_FALSE; + + return EINA_TRUE; +} + static Eina_Bool _key_action_escape(Evas_Object *obj, const char *params EINA_UNUSED) { diff --git a/src/lib/elementary/elc_hoversel.c b/src/lib/elementary/elc_hoversel.c index d0121c05c9..cc34e03c48 100644 --- a/src/lib/elementary/elc_hoversel.c +++ b/src/lib/elementary/elc_hoversel.c @@ -198,6 +198,23 @@ _item_focus_changed(void *data EINA_UNUSED, const Efl_Event *event EINA_UNUSED) } static void +_item_focused_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Elm_Hoversel_Item_Data *it = data; + + efl_event_callback_legacy_call(WIDGET(it), ELM_HOVERSEL_EVENT_ITEM_FOCUSED, EO_OBJ(it)); +} + +static void +_item_unfocused_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) + +{ + Elm_Hoversel_Item_Data *it = data; + + efl_event_callback_legacy_call(WIDGET(it), ELM_HOVERSEL_EVENT_ITEM_UNFOCUSED, EO_OBJ(it)); +} + +static void _create_scroller(Evas_Object *obj, Elm_Hoversel_Data *sd) { //table @@ -595,6 +612,9 @@ EOLIAN static Eina_Bool _elm_hoversel_item_elm_widget_item_item_focus_get(const Eo *eo_it EINA_UNUSED, Elm_Hoversel_Item_Data *it) { + if (elm_widget_is_legacy(VIEW(it))) + return elm_widget_focus_get(VIEW(it)); + return efl_ui_focus_object_focus_get(VIEW(it)); } @@ -876,7 +896,14 @@ _elm_hoversel_item_add(Eo *obj, Elm_Hoversel_Data *sd, const char *label, const evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); efl_event_callback_add(bt, EFL_UI_EVENT_CLICKED, _on_item_clicked, item); - efl_event_callback_add(bt, EFL_UI_FOCUS_OBJECT_EVENT_FOCUS_CHANGED, _item_focus_changed, item); + + if (elm_widget_is_legacy(bt)) + { + evas_object_smart_callback_add(bt, "focused", _item_focused_cb, item); + evas_object_smart_callback_add(bt, "unfocused", _item_unfocused_cb, item); + } + else + efl_event_callback_add(bt, EFL_UI_FOCUS_OBJECT_EVENT_FOCUS_CHANGED, _item_focus_changed, item); sd->items = eina_list_append(sd->items, eo_item); diff --git a/src/lib/elementary/elm_conform.c b/src/lib/elementary/elm_conform.c index 5d0d53037b..2d33d2d236 100644 --- a/src/lib/elementary/elm_conform.c +++ b/src/lib/elementary/elm_conform.c @@ -664,7 +664,10 @@ _show_region_job(void *data) ELM_CONFORMANT_DATA_GET(data, sd); - focus_obj = elm_object_focused_object_get(data); + if (elm_widget_is_legacy(data)) + focus_obj = efl_ui_widget_focused_object_get(data); + else + focus_obj = elm_object_focused_object_get(data); if (focus_obj) { Eina_Rect r = elm_widget_focus_region_get(focus_obj); @@ -714,7 +717,10 @@ _autoscroll_objects_update(void *data) ELM_CONFORMANT_DATA_GET(data, sd); - sub = elm_object_focused_object_get(data); + if (elm_widget_is_legacy(data)) + sub = efl_ui_widget_focused_object_get(data); + else + sub = elm_object_focused_object_get(data); //Look up for top most scroller in the focus object hierarchy //inside Conformant. diff --git a/src/lib/elementary/elm_ctxpopup.eo b/src/lib/elementary/elm_ctxpopup.eo index 019e0926aa..a52cc66c45 100644 --- a/src/lib/elementary/elm_ctxpopup.eo +++ b/src/lib/elementary/elm_ctxpopup.eo @@ -235,6 +235,10 @@ class Elm.Ctxpopup (Efl.Ui.Layout, Efl.Ui.Focus.Layer, Efl.Access.Widget.Action, Efl.Ui.Widget.on_disabled_update; Efl.Ui.Widget.widget_sub_object_add; Efl.Ui.Translatable.translation_update; + Efl.Ui.Widget.focus_direction; + Efl.Ui.Widget.focus_direction_manager_is; + Efl.Ui.Widget.focus_next_manager_is; + Efl.Ui.Widget.focus_next; Efl.Ui.Widget.theme_apply; Efl.Ui.Widget.widget_event; Efl.Ui.Widget.focused_item { get; } diff --git a/src/lib/elementary/elm_genlist.eo b/src/lib/elementary/elm_genlist.eo index e3013cb703..7428dd38f0 100644 --- a/src/lib/elementary/elm_genlist.eo +++ b/src/lib/elementary/elm_genlist.eo @@ -559,6 +559,7 @@ class Elm.Genlist (Efl.Ui.Layout, Efl.Ui.Focus.Composition, Elm.Interface_Scroll Efl.Access.Selection.access_selection_clear; Efl.Ui.Focus.Composition.prepare; Efl.Ui.Widget.focus_state_apply; + Efl.Ui.Focus.Manager.setup_on_first_touch; } events { item,focused; [[Called when genlist item got focus]] diff --git a/src/lib/elementary/elm_grid.c b/src/lib/elementary/elm_grid.c index f2fa303e00..5aaa86eacb 100644 --- a/src/lib/elementary/elm_grid.c +++ b/src/lib/elementary/elm_grid.c @@ -14,6 +14,87 @@ #define MY_CLASS_NAME "Elm_Grid" #define MY_CLASS_NAME_LEGACY "elm_grid" +EOLIAN static Eina_Bool +_elm_grid_efl_ui_widget_focus_next_manager_is(Eo *obj EINA_UNUSED, void *_pd EINA_UNUSED) +{ + return EINA_TRUE; +} + +EOLIAN static Eina_Bool +_elm_grid_efl_ui_widget_focus_next(Eo *obj, void *_pd EINA_UNUSED, Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item) +{ + const Eina_List *items; + Eina_List *(*list_free)(Eina_List *list); + void *(*list_data_get)(const Eina_List *list); + + Eina_Bool int_ret; + + ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE); + + /* Focus chain */ + /* TODO: Change this to use other chain */ + if ((items = efl_ui_widget_focus_custom_chain_get(obj))) + { + list_data_get = eina_list_data_get; + list_free = NULL; + } + else + { + items = evas_object_grid_children_get(wd->resize_obj); + list_data_get = eina_list_data_get; + list_free = eina_list_free; + + if (!items) return EINA_FALSE; + } + + int_ret = efl_ui_widget_focus_list_next_get(obj, items, list_data_get, dir, next, next_item); + + if (list_free) list_free((Eina_List *)items); + + return int_ret; +} + +EOLIAN static Eina_Bool +_elm_grid_efl_ui_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, void *_pd EINA_UNUSED) +{ + return EINA_TRUE; +} + +EOLIAN static Eina_Bool +_elm_grid_efl_ui_widget_focus_direction(Eo *obj, void *_pd EINA_UNUSED, const Evas_Object *base, double degree, Evas_Object **direction, Elm_Object_Item **direction_item, double *weight) +{ + const Eina_List *items; + Eina_List *(*list_free)(Eina_List *list); + void *(*list_data_get)(const Eina_List *list); + + Eina_Bool int_ret; + + ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE); + + /* Focus chain */ + /* TODO: Change this to use other chain */ + if ((items = efl_ui_widget_focus_custom_chain_get(obj))) + { + list_data_get = eina_list_data_get; + list_free = NULL; + } + else + { + items = evas_object_grid_children_get(wd->resize_obj); + list_data_get = eina_list_data_get; + list_free = eina_list_free; + + if (!items) return EINA_FALSE; + } + + int_ret = efl_ui_widget_focus_list_direction_get(obj, base, items, list_data_get, + degree, direction, direction_item, weight); + + if (list_free) list_free((Eina_List *)items); + + return int_ret; +} + static void _elm_grid_efl_ui_focus_composition_prepare(Eo *obj, void *pd EINA_UNUSED) { diff --git a/src/lib/elementary/elm_grid.eo b/src/lib/elementary/elm_grid.eo index ebf5bb2929..6726486a1f 100644 --- a/src/lib/elementary/elm_grid.eo +++ b/src/lib/elementary/elm_grid.eo @@ -59,5 +59,9 @@ class Elm.Grid (Efl.Ui.Widget, Efl.Ui.Focus.Composition, Efl.Ui.Legacy) Efl.Object.constructor; Efl.Ui.Widget.theme_apply; Efl.Ui.Focus.Composition.prepare; + Efl.Ui.Widget.focus_direction; + Efl.Ui.Widget.focus_next_manager_is; + Efl.Ui.Widget.focus_next; + Efl.Ui.Widget.focus_direction_manager_is; } } diff --git a/src/lib/elementary/elm_hover.c b/src/lib/elementary/elm_hover.c index 69938c1180..42c6fa20af 100644 --- a/src/lib/elementary/elm_hover.c +++ b/src/lib/elementary/elm_hover.c @@ -829,6 +829,18 @@ _elm_hover_dismiss(Eo *obj, Elm_Hover_Data *_pd EINA_UNUSED) elm_layout_signal_emit(obj, "elm,action,dismiss", "elm"); } +EOLIAN static Eina_Bool +_elm_hover_efl_ui_widget_focus_next_manager_is(Eo *obj EINA_UNUSED, Elm_Hover_Data *_pd EINA_UNUSED) +{ + return EINA_TRUE; +} + +EOLIAN static Eina_Bool +_elm_hover_efl_ui_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, Elm_Hover_Data *_pd EINA_UNUSED) +{ + return EINA_TRUE; +} + EOLIAN static void _elm_hover_class_constructor(Efl_Class *klass) { diff --git a/src/lib/elementary/elm_hover.eo b/src/lib/elementary/elm_hover.eo index cc67a7dde3..b73e46908d 100644 --- a/src/lib/elementary/elm_hover.eo +++ b/src/lib/elementary/elm_hover.eo @@ -69,6 +69,8 @@ class Elm.Hover (Efl.Ui.Layout, Efl.Ui.Focus.Layer, Efl.Ui.Clickable, Efl.Ui.Widget.widget_sub_object_add; Efl.Ui.Widget.widget_parent { get; set; } Efl.Ui.Widget.widget_sub_object_del; + Efl.Ui.Widget.focus_direction_manager_is; + Efl.Ui.Widget.focus_next_manager_is; Efl.Access.Widget.Action.elm_actions { get; } Efl.Access.state_set { get; } Efl.Part.part; diff --git a/src/lib/elementary/elm_index.c b/src/lib/elementary/elm_index.c index 6233af307e..787859d9e5 100644 --- a/src/lib/elementary/elm_index.c +++ b/src/lib/elementary/elm_index.c @@ -1134,6 +1134,55 @@ _elm_index_efl_canvas_group_group_del(Eo *obj, Elm_Index_Data *sd) static Eina_Bool _elm_index_smart_focus_next_enable = EINA_FALSE; +EOLIAN static Eina_Bool +_elm_index_efl_ui_widget_focus_next_manager_is(Eo *obj EINA_UNUSED, Elm_Index_Data *_pd EINA_UNUSED) +{ + return _elm_index_smart_focus_next_enable; +} + +EOLIAN static Eina_Bool +_elm_index_efl_ui_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, Elm_Index_Data *_pd EINA_UNUSED) +{ + return EINA_FALSE; +} + +EOLIAN static Eina_Bool +_elm_index_efl_ui_widget_focus_next(Eo *obj, Elm_Index_Data *sd, Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item) +{ + Eina_Bool int_ret = EINA_FALSE; + + Eina_List *items = NULL; + Eina_List *l = NULL; + Elm_Object_Item *eo_item; + Evas_Object *ao; + Evas_Object *po; + + if (!sd->autohide_disabled) + elm_layout_signal_emit((Evas_Object *)obj, "elm,state,active", "elm"); + + po = (Evas_Object *)edje_object_part_object_get + (elm_layout_edje_get(obj), "access"); + ao = evas_object_data_get(po, "_part_access_obj"); + items = eina_list_append(items, ao); + + EINA_LIST_FOREACH(sd->items, l, eo_item) + { + ELM_INDEX_ITEM_DATA_GET(eo_item, it); + if (it->level != 0) continue; + items = eina_list_append(items, it->base->access_obj); + } + + int_ret = efl_ui_widget_focus_list_next_get + (obj, items, eina_list_data_get, dir, next, next_item); + eina_list_free(items); + + // to hide index item, if there is nothing to focus on autohide disable mode + if ((!sd->autohide_disabled) && (!int_ret)) + elm_layout_signal_emit((Evas_Object *)obj, "elm,state,inactive", "elm"); + + return int_ret; +} + static void _access_obj_process(Evas_Object *obj, Eina_Bool is_access) { diff --git a/src/lib/elementary/elm_index.eo b/src/lib/elementary/elm_index.eo index 042b3d25c2..0f9560f8bf 100644 --- a/src/lib/elementary/elm_index.eo +++ b/src/lib/elementary/elm_index.eo @@ -198,6 +198,9 @@ class Elm.Index (Efl.Ui.Layout, Efl.Ui.Direction, class.constructor; Efl.Object.constructor; Efl.Ui.Widget.theme_apply; + Efl.Ui.Widget.focus_next_manager_is; + Efl.Ui.Widget.focus_direction_manager_is; + Efl.Ui.Widget.focus_next; Efl.Ui.Widget.on_access_update; Efl.Ui.Direction.direction { get; set; [[Only supports $vertical and $horizontal. Default is $vertical.]] } Efl.Access.access_children { get; } diff --git a/src/lib/elementary/elm_label.c b/src/lib/elementary/elm_label.c index ab360cdfcf..bd1cd7fcd6 100644 --- a/src/lib/elementary/elm_label.c +++ b/src/lib/elementary/elm_label.c @@ -615,6 +615,18 @@ _elm_label_slide_duration_get(const Eo *obj EINA_UNUSED, Elm_Label_Data *sd) return sd->slide_duration; } +EOLIAN static Eina_Bool +_elm_label_efl_ui_widget_focus_next_manager_is(Eo *obj EINA_UNUSED, Elm_Label_Data *_pd EINA_UNUSED) +{ + return EINA_FALSE; +} + +EOLIAN static Eina_Bool +_elm_label_efl_ui_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, Elm_Label_Data *_pd EINA_UNUSED) +{ + return EINA_FALSE; +} + EOLIAN static void _elm_label_class_constructor(Efl_Class *klass) { diff --git a/src/lib/elementary/elm_label.eo b/src/lib/elementary/elm_label.eo index 73b1298b71..34db373060 100644 --- a/src/lib/elementary/elm_label.eo +++ b/src/lib/elementary/elm_label.eo @@ -124,6 +124,8 @@ class Elm.Label (Efl.Ui.Layout, Efl.Ui.Legacy) implements { class.constructor; Efl.Object.constructor; + Efl.Ui.Widget.focus_next_manager_is; + Efl.Ui.Widget.focus_direction_manager_is; Efl.Ui.Widget.theme_apply; Efl.Part.part; } diff --git a/src/lib/elementary/elm_list.c b/src/lib/elementary/elm_list.c index 1c9ee23d17..147c34af46 100644 --- a/src/lib/elementary/elm_list.c +++ b/src/lib/elementary/elm_list.c @@ -291,7 +291,6 @@ _elm_list_item_content_focus_set(Elm_List_Item_Data *it, Elm_Focus_Direction dir return EINA_TRUE; } - /* FOCUS-FIXME if (dir != ELM_FOCUS_PREVIOUS) { Evas_Object *nextfocus; @@ -310,7 +309,6 @@ _elm_list_item_content_focus_set(Elm_List_Item_Data *it, Elm_Focus_Direction dir if (idx >= focus_objs) idx = 0; focused = focus_chain[idx]; } - */ elm_object_focus_set(focused, EINA_TRUE); return EINA_TRUE; } @@ -1289,7 +1287,12 @@ _elm_list_efl_ui_focus_object_on_focus_update(Eo *obj, Elm_List_Data *sd) if (!_elm_config->item_select_on_focus_disable && is_sel) elm_list_item_selected_set(EO_OBJ(it), EINA_TRUE); else - _elm_list_item_focused(EO_OBJ(it)); + { + if (elm_widget_is_legacy(WIDGET(it))) + elm_object_item_focus_set(EO_OBJ(it), EINA_TRUE); + else + _elm_list_item_focused(EO_OBJ(it)); + } } } } @@ -2325,7 +2328,8 @@ _item_new(Evas_Object *obj, (it->icon, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _size_hints_changed_cb, obj); efl_access_type_set(it->icon, EFL_ACCESS_TYPE_DISABLED); - elm_widget_tree_unfocusable_set(it->icon, EINA_TRUE); + if (!elm_widget_is_legacy(obj)) + elm_widget_tree_unfocusable_set(it->icon, EINA_TRUE); } if (it->end) { @@ -2334,7 +2338,8 @@ _item_new(Evas_Object *obj, (it->end, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _size_hints_changed_cb, obj); efl_access_type_set(it->end, EFL_ACCESS_TYPE_DISABLED); - elm_widget_tree_unfocusable_set(it->end, EINA_TRUE); + if (!elm_widget_is_legacy(obj)) + elm_widget_tree_unfocusable_set(it->end, EINA_TRUE); } if (_elm_config->atspi_mode) @@ -2354,6 +2359,39 @@ _resize_cb(void *data, static Eina_Bool _elm_list_smart_focus_next_enable = EINA_FALSE; +EOLIAN static Eina_Bool +_elm_list_efl_ui_widget_focus_next_manager_is(Eo *obj EINA_UNUSED, Elm_List_Data *sd EINA_UNUSED) +{ + return _elm_list_smart_focus_next_enable; +} + +EOLIAN static Eina_Bool +_elm_list_efl_ui_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, Elm_List_Data *sd EINA_UNUSED) +{ + return EINA_FALSE; +} + +EOLIAN static Eina_Bool +_elm_list_efl_ui_widget_focus_next(Eo *obj, Elm_List_Data *sd, Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item) +{ + Eina_List *items = NULL; + Eina_List *elist = NULL; + Elm_Object_Item *eo_it; + + if (_elm_config->access_mode != ELM_ACCESS_MODE_ON) return EINA_FALSE; + + EINA_LIST_FOREACH(sd->items, elist, eo_it) + { + ELM_LIST_ITEM_DATA_GET(eo_it, it); + items = eina_list_append(items, it->base->access_obj); + if (it->icon) items = eina_list_append(items, it->icon); + if (it->end) items = eina_list_append(items, it->end); + } + + return efl_ui_widget_focus_list_next_get + (obj, items, eina_list_data_get, dir, next, next_item); +} + EOLIAN static void _elm_list_efl_canvas_group_group_add(Eo *obj, Elm_List_Data *priv) { diff --git a/src/lib/elementary/elm_list.eo b/src/lib/elementary/elm_list.eo index 27fb896c0f..88d0b7291e 100644 --- a/src/lib/elementary/elm_list.eo +++ b/src/lib/elementary/elm_list.eo @@ -406,6 +406,9 @@ class Elm.List (Efl.Ui.Layout, Elm.Interface_Scrollable, Efl.Ui.Widget.widget_sub_object_del; Efl.Ui.Widget.widget_event; Efl.Ui.Widget.focused_item { get; } + Efl.Ui.Widget.focus_next_manager_is; + Efl.Ui.Widget.focus_direction_manager_is; + Efl.Ui.Widget.focus_next; Elm.Interface_Scrollable.item_loop_enabled { get; set; } Elm.Interface_Scrollable.policy { set; } Efl.Access.Widget.Action.elm_actions { get; } diff --git a/src/lib/elementary/elm_notify.c b/src/lib/elementary/elm_notify.c index e7acd30d6a..b26329bde3 100644 --- a/src/lib/elementary/elm_notify.c +++ b/src/lib/elementary/elm_notify.c @@ -358,6 +358,43 @@ _parent_hide_cb(void *data, evas_object_hide(data); } +EOLIAN static Eina_Bool +_elm_notify_efl_ui_widget_focus_next_manager_is(Eo *obj EINA_UNUSED, Elm_Notify_Data *sd EINA_UNUSED) +{ + return EINA_TRUE; +} + +EOLIAN static Eina_Bool +_elm_notify_efl_ui_widget_focus_next(Eo *obj EINA_UNUSED, Elm_Notify_Data *sd, Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item) +{ + Evas_Object *cur; + + if (!sd->content) return EINA_FALSE; + + cur = sd->content; + + /* Try to cycle focus on content */ + return efl_ui_widget_focus_next_get(cur, dir, next, next_item); +} + +EOLIAN static Eina_Bool +_elm_notify_efl_ui_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, Elm_Notify_Data *sd EINA_UNUSED) +{ + return EINA_TRUE; +} + +EOLIAN static Eina_Bool +_elm_notify_efl_ui_widget_focus_direction(Eo *obj EINA_UNUSED, Elm_Notify_Data *sd, const Evas_Object *base, double degree, Evas_Object **direction, Elm_Object_Item **direction_item, double *weight) +{ + Evas_Object *cur; + + if (!sd->content) return EINA_FALSE; + + cur = sd->content; + + return efl_ui_widget_focus_direction_get(cur, base, degree, direction, direction_item, weight); +} + static Eina_Bool _elm_notify_content_set(Eo *obj, Elm_Notify_Data *sd, const char *part, Evas_Object *content) { diff --git a/src/lib/elementary/elm_notify.eo b/src/lib/elementary/elm_notify.eo index 4b4236efe6..448dbb0a51 100644 --- a/src/lib/elementary/elm_notify.eo +++ b/src/lib/elementary/elm_notify.eo @@ -86,6 +86,10 @@ class Elm.Notify (Efl.Ui.Widget, Efl.Ui.Focus.Layer, Efl.Content, Efl.Part, Efl. Efl.Ui.Widget.widget_parent { get; set; } Efl.Ui.Widget.theme_apply; Efl.Ui.Widget.widget_sub_object_del; + Efl.Ui.Widget.focus_direction; + Efl.Ui.Widget.focus_direction_manager_is; + Efl.Ui.Widget.focus_next_manager_is; + Efl.Ui.Widget.focus_next; Efl.Content.content { get; set; } Efl.Content.content_unset; Efl.Part.part; diff --git a/src/lib/elementary/elm_spinner.c b/src/lib/elementary/elm_spinner.c index 187abb4022..c34dd2a93f 100644 --- a/src/lib/elementary/elm_spinner.c +++ b/src/lib/elementary/elm_spinner.c @@ -55,6 +55,10 @@ _inc_dec_button_unpressed_cb(void *data, const Efl_Event *event); static void _inc_dec_button_mouse_move_cb(void *data, const Efl_Event *event); static void +_text_button_focused_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); +static void +_entry_unfocused_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); +static void _entry_focus_change(void *data, const Efl_Event *event); static void _entry_activated_cb(void *data, const Efl_Event *event); @@ -406,8 +410,12 @@ _entry_value_apply(Evas_Object *obj) if (!sd->entry_visible) return; - efl_event_callback_del - (sd->ent, EFL_UI_FOCUS_OBJECT_EVENT_FOCUS_CHANGED, _entry_focus_change, obj); + if (elm_widget_is_legacy(obj)) + evas_object_smart_callback_del_full(sd->ent, "unfocused", + _entry_unfocused_cb, obj); + else + efl_event_callback_del(sd->ent, EFL_UI_FOCUS_OBJECT_EVENT_FOCUS_CHANGED, + _entry_focus_change, obj); _entry_hide(obj); str = elm_object_text_get(sd->ent); if (!str) return; @@ -642,25 +650,32 @@ _toggle_entry(Evas_Object *obj) elm_layout_signal_emit(obj, "elm,state,active", "elm"); _entry_show(sd); elm_entry_select_all(sd->ent); + if (elm_widget_is_legacy(sd->ent)) + elm_widget_focus_set(sd->ent, EINA_TRUE); sd->entry_visible = EINA_TRUE; } - - efl_event_callback_add - (sd->ent, EFL_UI_FOCUS_OBJECT_EVENT_FOCUS_CHANGED, _entry_focus_change, obj); + if (elm_widget_is_legacy(sd->ent)) + evas_object_smart_callback_add(sd->ent, "focused", _entry_unfocused_cb, obj); + else + efl_event_callback_add + (sd->ent, EFL_UI_FOCUS_OBJECT_EVENT_FOCUS_CHANGED, _entry_focus_change, obj); sd->entry_visible = EINA_TRUE; elm_layout_signal_emit(obj, "elm,state,entry,active", "elm"); evas_object_show(sd->ent); - { - Eina_List *items = NULL; - items = eina_list_append(items, sd->dec_button); - items = eina_list_append(items, sd->text_button); - items = eina_list_append(items, sd->ent); - items = eina_list_append(items, sd->inc_button); + if (!elm_widget_is_legacy(obj)) + { + Eina_List *items = NULL; + + items = eina_list_append(items, sd->dec_button); + items = eina_list_append(items, sd->text_button); + items = eina_list_append(items, sd->ent); + items = eina_list_append(items, sd->inc_button); + + efl_ui_focus_composition_elements_set(obj, items); - efl_ui_focus_composition_elements_set(obj, items); - } - efl_ui_focus_manager_focus_set(efl_ui_focus_object_focus_manager_get(obj), sd->ent); + efl_ui_focus_manager_focus_set(efl_ui_focus_object_focus_manager_get(obj), sd->ent); + } } } @@ -894,6 +909,18 @@ _entry_focus_change(void *data, const Efl_Event *event) } static void +_text_button_focused_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + _toggle_entry(data); +} + +static void +_entry_unfocused_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + _toggle_entry(data); +} + +static void _text_button_clicked_cb(void *data, const Efl_Event *event EINA_UNUSED) { ELM_SPINNER_DATA_GET(data, sd); @@ -1215,8 +1242,12 @@ _elm_spinner_efl_canvas_group_group_add(Eo *obj, Elm_Spinner_Data *priv) efl_event_callback_add (priv->text_button, EFL_UI_EVENT_CLICKED, _text_button_clicked_cb, obj); - efl_event_callback_add - (priv->text_button, EFL_UI_FOCUS_OBJECT_EVENT_FOCUS_CHANGED, _text_button_focus_change, obj); + if (elm_widget_is_legacy(priv->text_button)) + evas_object_smart_callback_add(priv->text_button, "focused", + _text_button_focused_cb, obj); + else + efl_event_callback_add + (priv->text_button, EFL_UI_FOCUS_OBJECT_EVENT_FOCUS_CHANGED, _text_button_focus_change, obj); elm_layout_content_set(obj, "elm.swallow.text_button", priv->text_button); elm_widget_sub_object_add(obj, priv->text_button); @@ -1229,15 +1260,16 @@ _elm_spinner_efl_canvas_group_group_add(Eo *obj, Elm_Spinner_Data *priv) elm_layout_content_set(obj, "elm.swallow.dec_button", priv->dec_button); elm_widget_sub_object_add(obj, priv->dec_button); - { - Eina_List *items = NULL; + if (!elm_widget_is_legacy(obj)) + { + Eina_List *items = NULL; - items = eina_list_append(items, priv->dec_button); - items = eina_list_append(items, priv->text_button); - items = eina_list_append(items, priv->inc_button); + items = eina_list_append(items, priv->dec_button); + items = eina_list_append(items, priv->text_button); + items = eina_list_append(items, priv->inc_button); - efl_ui_focus_composition_elements_set(obj, items); - } + efl_ui_focus_composition_elements_set(obj, items); + } } else { @@ -1346,6 +1378,90 @@ _elm_spinner_efl_ui_widget_theme_apply(Eo *obj, Elm_Spinner_Data *sd) static Eina_Bool _elm_spinner_smart_focus_next_enable = EINA_FALSE; + +EOLIAN static Eina_Bool +_elm_spinner_efl_ui_widget_focus_next_manager_is(Eo *obj EINA_UNUSED, Elm_Spinner_Data *_pd EINA_UNUSED) +{ + ELM_SPINNER_DATA_GET(obj, sd); + + return _elm_spinner_smart_focus_next_enable | sd->button_layout; +} + +EOLIAN static Eina_Bool +_elm_spinner_efl_ui_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, Elm_Spinner_Data *_pd EINA_UNUSED) +{ + ELM_SPINNER_DATA_GET(obj, sd); + + if (sd->button_layout) return EINA_TRUE; + return EINA_FALSE; +} + +EOLIAN static Eina_Bool +_elm_spinner_efl_ui_widget_focus_direction(Eo *obj, Elm_Spinner_Data *_pd, const Evas_Object *base, double degree, Evas_Object **direction, Elm_Object_Item **direction_item, double *weight) +{ + Eina_Bool ret; + Eina_List *items = NULL; + void *(*list_data_get)(const Eina_List *list); + + ELM_SPINNER_CHECK(obj) EINA_FALSE; + + if (!_pd) + return EINA_FALSE; + + list_data_get = eina_list_data_get; + + items = eina_list_append(items, _pd->inc_button); + items = eina_list_append(items, _pd->text_button); + items = eina_list_append(items, _pd->dec_button); + + ret = efl_ui_widget_focus_list_direction_get + (obj, base, items, list_data_get, degree, direction, direction_item, weight); + eina_list_free(items); + + return ret; +} + +static Evas_Object * +_access_object_get(const Evas_Object *obj, const char* part) +{ + Evas_Object *eo, *po, *ao; + + eo = elm_layout_edje_get(obj); + + po = (Evas_Object *)edje_object_part_object_get(eo, part); + ao = evas_object_data_get(po, "_part_access_obj"); + + return ao; +} + +EOLIAN static Eina_Bool +_elm_spinner_efl_ui_widget_focus_next(Eo *obj, Elm_Spinner_Data *_pd, Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item) +{ + Evas_Object *ao; + Eina_List *items = NULL; + int ret; + + ELM_SPINNER_CHECK(obj) EINA_FALSE; + + if (_elm_config->access_mode) + { + ao = _access_object_get(obj, "access"); + items = eina_list_append(items, ao); + } + if (!elm_widget_disabled_get(obj)) + { + items = eina_list_append(items, _pd->dec_button); + items = eina_list_append(items, _pd->text_button); + items = eina_list_append(items, _pd->inc_button); + } + + ret = efl_ui_widget_focus_list_next_get + (obj, items, eina_list_data_get, dir, next, next_item); + eina_list_free(items); + + return ret; +} + EOLIAN static void _elm_spinner_efl_ui_widget_on_access_update(Eo *obj, Elm_Spinner_Data *_pd EINA_UNUSED, Eina_Bool acs) { diff --git a/src/lib/elementary/elm_spinner.eo b/src/lib/elementary/elm_spinner.eo index 2c5d6ca51b..623ba4ac0d 100644 --- a/src/lib/elementary/elm_spinner.eo +++ b/src/lib/elementary/elm_spinner.eo @@ -172,6 +172,10 @@ class Elm.Spinner (Efl.Ui.Layout, Efl.Ui.Range, Efl.Ui.Focus.Composition, Efl.Object.constructor; Efl.Ui.Widget.theme_apply; Efl.Ui.Widget.on_access_update; + Efl.Ui.Widget.focus_next_manager_is; + Efl.Ui.Widget.focus_direction_manager_is; + Efl.Ui.Widget.focus_next; + Efl.Ui.Widget.focus_direction; Efl.Ui.Focus.Object.on_focus_update; Efl.Ui.Widget.widget_event; Efl.Ui.Range.range_min_max { get; set; } |