summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYeongJong Lee <yj34.lee@samsung.com>2018-04-24 17:30:51 +0900
committerWooHyun Jung <wh0705.jung@samsung.com>2018-04-24 17:30:51 +0900
commit86e1ac2baefa9be2e58d5ae5f63b1007ba702d8a (patch)
tree3e471e9b376d95a02e140ae04a069d40b95fb046
parentb1f4250871e4eec8bf4c57085ea7200713d2f2b2 (diff)
downloadefl-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
-rw-r--r--src/lib/elementary/efl_ui_frame.c45
-rw-r--r--src/lib/elementary/efl_ui_frame.eo4
-rw-r--r--src/lib/elementary/efl_ui_panes.c59
-rw-r--r--src/lib/elementary/efl_ui_panes.eo2
-rw-r--r--src/lib/elementary/efl_ui_progressbar.c12
-rw-r--r--src/lib/elementary/efl_ui_progressbar.eo2
-rw-r--r--src/lib/elementary/efl_ui_slider.c57
-rw-r--r--src/lib/elementary/efl_ui_slider.eo2
-rw-r--r--src/lib/elementary/efl_ui_widget.c8
-rw-r--r--src/lib/elementary/elc_ctxpopup.c78
-rw-r--r--src/lib/elementary/elc_hoversel.c29
-rw-r--r--src/lib/elementary/elm_conform.c10
-rw-r--r--src/lib/elementary/elm_ctxpopup.eo4
-rw-r--r--src/lib/elementary/elm_genlist.eo1
-rw-r--r--src/lib/elementary/elm_grid.c81
-rw-r--r--src/lib/elementary/elm_grid.eo4
-rw-r--r--src/lib/elementary/elm_hover.c12
-rw-r--r--src/lib/elementary/elm_hover.eo2
-rw-r--r--src/lib/elementary/elm_index.c49
-rw-r--r--src/lib/elementary/elm_index.eo3
-rw-r--r--src/lib/elementary/elm_label.c12
-rw-r--r--src/lib/elementary/elm_label.eo2
-rw-r--r--src/lib/elementary/elm_list.c48
-rw-r--r--src/lib/elementary/elm_list.eo3
-rw-r--r--src/lib/elementary/elm_notify.c37
-rw-r--r--src/lib/elementary/elm_notify.eo4
-rw-r--r--src/lib/elementary/elm_spinner.c162
-rw-r--r--src/lib/elementary/elm_spinner.eo4
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; }