jaehwan pushed a commit to branch master. http://git.enlightenment.org/core/elementary.git/commit/?id=b4e50ef6c0d5f768a04715456767a45a6e55ceca
commit b4e50ef6c0d5f768a04715456767a45a6e55ceca Author: Jaehwan Kim <[email protected]> Date: Wed Aug 12 17:25:15 2015 +0900 focus: add the focus region show mode When the focus is move to the object in scroller, it is scrolled to show the focus region as a widget. If the focus region want to be shown as an item, set the mode ELM_FOCUS_REGION_SHOW_ITEM. If then, it will be scrolled as an item. TODO: Widgets have items are added on_focus_region function. @feature --- src/bin/test_gengrid.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++-- src/lib/elm_focus.h | 44 ++++++++++++++++++++++++++++ src/lib/elm_gengrid.c | 20 +++++++++++++ src/lib/elm_gengrid.eo | 1 + src/lib/elm_main.c | 12 ++++++++ src/lib/elm_widget.c | 13 +++++++++ src/lib/elm_widget.eo | 10 +++++++ src/lib/elm_widget.h | 3 ++ 8 files changed, 179 insertions(+), 3 deletions(-) diff --git a/src/bin/test_gengrid.c b/src/bin/test_gengrid.c index 93d7f38..7e7c982 100644 --- a/src/bin/test_gengrid.c +++ b/src/bin/test_gengrid.c @@ -29,6 +29,7 @@ struct _api_data unsigned int state; /* What state we are testing */ Evas_Object *box; /* Use this to get box content */ Evas_Object *grid; + Evas_Object *grid2; Elm_Gengrid_Item_Field_Type field_type; }; typedef struct _api_data api_data; @@ -1644,6 +1645,19 @@ _gg_focus_focus_animate_changed_cb(void *data, } static void +_gg_focus_region_show_item_cb(void *data, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + if (elm_check_state_get(obj)) + elm_object_focus_region_show_mode_set((Evas_Object *)data, + ELM_FOCUS_REGION_SHOW_ITEM); + else + elm_object_focus_region_show_mode_set((Evas_Object *)data, + ELM_FOCUS_REGION_SHOW_WIDGET); +} + +static void _grid_reorder_mode(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { @@ -1675,7 +1689,7 @@ test_gengrid_focus(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { - Evas_Object *win, *bx, *bx_horiz, *gengrid, *btn, *fr, *bx_mv, *bx_opt, *ck, *rdg, *rd; + Evas_Object *win, *bx, *bx_horiz, *in_bx, *scr, *gengrid, *gengrid2, *btn, *fr, *bx_mv, *bx_opt, *ck, *rdg, *rd; Elm_Gengrid_Item_Class *ic; Item_Data *id; char buf[PATH_MAX]; @@ -1711,13 +1725,26 @@ test_gengrid_focus(void *data EINA_UNUSED, evas_object_show(btn); elm_object_focus_set(btn, EINA_TRUE); - gengrid = elm_gengrid_add(bx); + scr = elm_scroller_add(bx); + evas_object_size_hint_weight_set(scr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(scr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, scr); + evas_object_show(scr); + + in_bx = elm_box_add(scr); + evas_object_size_hint_weight_set(in_bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(in_bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_content_set(scr, in_bx); + evas_object_show(in_bx); + + gengrid = elm_gengrid_add(in_bx); elm_gengrid_item_size_set(gengrid, ELM_SCALE_SIZE(150), ELM_SCALE_SIZE(150)); evas_object_size_hint_weight_set(gengrid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(gengrid, EVAS_HINT_FILL, EVAS_HINT_FILL); - elm_box_pack_end(bx, gengrid); + evas_object_size_hint_min_set(gengrid, 0, ELM_SCALE_SIZE(600)); + elm_box_pack_end(in_bx, gengrid); evas_object_show(gengrid); evas_object_smart_callback_add(gengrid, "item,focused", _gengrid_focus_item_cb, "item,focused"); evas_object_smart_callback_add(gengrid, "item,unfocused", _gengrid_focus_item_cb, "item,unfocused"); @@ -1728,6 +1755,24 @@ test_gengrid_focus(void *data EINA_UNUSED, evas_object_smart_callback_add(gengrid, "unhighlighted", _gengrid_focus_item_cb, "unhighlighted"); evas_object_event_callback_add(gengrid, EVAS_CALLBACK_KEY_DOWN, _gengrid_focus_key_down_cb, NULL); + gengrid2 = elm_gengrid_add(in_bx); + elm_gengrid_item_size_set(gengrid2, + ELM_SCALE_SIZE(150), + ELM_SCALE_SIZE(150)); + evas_object_size_hint_weight_set(gengrid2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(gengrid2, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_min_set(gengrid2, 0, ELM_SCALE_SIZE(600)); + elm_box_pack_end(in_bx, gengrid2); + evas_object_show(gengrid2); + evas_object_smart_callback_add(gengrid2, "item,focused", _gengrid_focus_item_cb, "item,focused"); + evas_object_smart_callback_add(gengrid2, "item,unfocused", _gengrid_focus_item_cb, "item,unfocused"); + evas_object_smart_callback_add(gengrid2, "selected", _gengrid_focus_item_cb, "selected"); + evas_object_smart_callback_add(gengrid2, "unselected", _gengrid_focus_item_cb, "unselected"); + evas_object_smart_callback_add(gengrid2, "activated", _gengrid_focus_item_cb, "activated"); + evas_object_smart_callback_add(gengrid2, "highlighted", _gengrid_focus_item_cb, "highlighted"); + evas_object_smart_callback_add(gengrid2, "unhighlighted", _gengrid_focus_item_cb, "unhighlighted"); + evas_object_event_callback_add(gengrid2, EVAS_CALLBACK_KEY_DOWN, _gengrid_focus_key_down_cb, NULL); + btn = elm_button_add(bx); elm_object_text_set(btn, "Down"); elm_box_pack_end(bx, btn); @@ -1792,9 +1837,23 @@ test_gengrid_focus(void *data EINA_UNUSED, evas_object_show(ck); ck = elm_check_add(bx_opt); + elm_object_text_set(ck, "Focus Region Show as Item"); + elm_check_state_set(ck, EINA_FALSE); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(ck, "changed", + _gg_focus_region_show_item_cb, + gengrid); + evas_object_smart_callback_add(ck, "changed", + _gg_focus_region_show_item_cb, + gengrid2); + elm_box_pack_end(bx_opt, ck); + evas_object_show(ck); + + ck = elm_check_add(bx_opt); elm_object_text_set(ck, "Horizontal Mode"); evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0); evas_object_smart_callback_add(ck, "changed", _horizontal_grid, gengrid); + evas_object_smart_callback_add(ck, "changed", _horizontal_grid, gengrid2); elm_box_pack_end(bx_opt, ck); evas_object_show(ck); @@ -1802,6 +1861,7 @@ test_gengrid_focus(void *data EINA_UNUSED, elm_object_text_set(ck, "Rorder mode enable"); evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0); evas_object_smart_callback_add(ck, "changed", _grid_reorder_mode, gengrid); + evas_object_smart_callback_add(ck, "changed", _grid_reorder_mode, gengrid2); elm_box_pack_end(bx_opt, ck); evas_object_show(ck); @@ -1882,6 +1942,19 @@ test_gengrid_focus(void *data EINA_UNUSED, if (i == 4) elm_object_item_disabled_set(id->item, EINA_TRUE); } + + n = 0; + for (i = 0; i < 24; i++) + { + id = calloc(1, sizeof(Item_Data)); + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[n]); + n = (n + 1) % 9; + id->mode = i; + id->path = eina_stringshare_add(buf); + id->item = elm_gengrid_item_append(gengrid2, ic, id, NULL, NULL); + if (i == 4) + elm_object_item_disabled_set(id->item, EINA_TRUE); + } elm_gengrid_item_class_free(ic); evas_object_resize(win, 600, 600); diff --git a/src/lib/elm_focus.h b/src/lib/elm_focus.h index 258d5d9..fcc6aa1 100644 --- a/src/lib/elm_focus.h +++ b/src/lib/elm_focus.h @@ -49,6 +49,17 @@ typedef enum } Elm_Focus_Direction; /** + * Focus region show mode. + * + * @ingroup Focus + */ +typedef enum +{ + ELM_FOCUS_REGION_SHOW_WIDGET, /**< as a widget */ + ELM_FOCUS_REGION_SHOW_ITEM, /**< as an item */ +} Elm_Focus_Region_Show_Mode; + +/** * Get the whether an Elementary object has the focus or not. * * @param obj The Elementary object to get the information from @@ -371,3 +382,36 @@ EAPI void elm_object_focus_move_policy_set(Evas_Object *obj, Elm * @ingroup Focus */ EAPI Elm_Focus_Move_Policy elm_object_focus_move_policy_get(const Evas_Object *obj); + +/** + * Set the focus region show mode to a given Elementary object. + * + * @param obj The Elementary object to operate on + * @param mode A mode to show the focus region + * + * @see elm_object_focus_region_show_mode_get + * + * When the focus is move to the object in scroller, it is scrolled + * to show the focus region as a widget. If the focus region want to be shown + * as an item, set the mode ELM_FOCUS_REGION_SHOW_ITEM. + * If then, it will be scrolled as an item. + * + * @since 1.16 + * + * @ingroup Focus + */ +EAPI void elm_object_focus_region_show_mode_set(Evas_Object *obj, Elm_Focus_Region_Show_Mode mode); + +/** + * Get the focus region show mode to a given Elementary object. + * + * @param obj The Elementary object to get the information from + * @return The focus region shown mode + * + * @see elm_object_focus_region_show_mode_set + * + * @since 1.16 + * + * @ingroup Focus + */ +EAPI Elm_Focus_Region_Show_Mode elm_object_focus_region_show_mode_get(const Evas_Object *obj); diff --git a/src/lib/elm_gengrid.c b/src/lib/elm_gengrid.c index ed5599f..26a4953 100644 --- a/src/lib/elm_gengrid.c +++ b/src/lib/elm_gengrid.c @@ -3577,6 +3577,25 @@ _elm_gengrid_elm_widget_on_focus(Eo *obj, Elm_Gengrid_Data *sd) return EINA_TRUE; } +EOLIAN static Eina_Bool +_elm_gengrid_elm_widget_on_focus_region(Eo *obj, Elm_Gengrid_Data *sd, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h) +{ + if (!sd->focused_item) return EINA_FALSE; + if (elm_object_focus_region_show_mode_get(obj) == ELM_FOCUS_REGION_SHOW_ITEM) + { + Evas_Coord vx, vy; + ELM_GENGRID_ITEM_DATA_GET(sd->focused_item, focus_it); + evas_object_geometry_get(VIEW(focus_it), x, y, w, h); + evas_object_geometry_get(obj, &vx, &vy, NULL, NULL); + + *x -= vx; + *y -= vy; + + return EINA_TRUE; + } + return EINA_FALSE; +} + static Eina_Bool _elm_gengrid_smart_focus_next_enable = EINA_FALSE; EOLIAN static Eina_Bool @@ -3891,6 +3910,7 @@ _elm_gengrid_item_elm_widget_item_focus_set(Eo *eo_it, Elm_Gen_Item *it, Eina_Bo return; _elm_gengrid_item_unfocused(eo_it); } + elm_widget_focus_region_show(obj); } EOLIAN static Eina_Bool diff --git a/src/lib/elm_gengrid.eo b/src/lib/elm_gengrid.eo index f5822d5..cda12c0 100644 --- a/src/lib/elm_gengrid.eo +++ b/src/lib/elm_gengrid.eo @@ -697,6 +697,7 @@ class Elm.Gengrid (Elm.Layout, Elm_Interface_Scrollable, Elm.Widget.access; Elm.Widget.focus_next; Elm.Widget.on_focus; + Elm.Widget.on_focus_region; Elm.Widget.event; Elm.Widget.focus_highlight_geometry_get; Elm.Widget.focused_item.get; diff --git a/src/lib/elm_main.c b/src/lib/elm_main.c index 6679ef1..dcd22b4 100644 --- a/src/lib/elm_main.c +++ b/src/lib/elm_main.c @@ -1748,3 +1748,15 @@ elm_object_focused_item_get(const Evas_Object *obj) return elm_widget_focused_item_get(obj); } +EAPI void +elm_object_focus_region_show_mode_set(Evas_Object *obj, Elm_Focus_Region_Show_Mode mode) +{ + elm_widget_focus_region_show_mode_set(obj, mode); +} + +EAPI Elm_Focus_Region_Show_Mode +elm_object_focus_region_show_mode_get(const Evas_Object *obj) +{ + return elm_widget_focus_region_show_mode_get(obj); +} + diff --git a/src/lib/elm_widget.c b/src/lib/elm_widget.c index b854e0d..0bb9f0f 100644 --- a/src/lib/elm_widget.c +++ b/src/lib/elm_widget.c @@ -349,6 +349,7 @@ _elm_widget_evas_object_smart_add(Eo *obj, Elm_Widget_Smart_Data *priv) priv->obj = obj; priv->mirrored_auto_mode = EINA_TRUE; /* will follow system locale * settings */ + priv->focus_region_show_mode = ELM_FOCUS_REGION_SHOW_WIDGET; elm_widget_can_focus_set(obj, EINA_TRUE); priv->is_mirrored = elm_config_mirrored_get(); priv->focus_move_policy = _elm_config->focus_move_policy; @@ -3992,6 +3993,18 @@ _elm_widget_focused_item_get(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *_pd EIN return NULL; } +EOLIAN static void +_elm_widget_focus_region_show_mode_set(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *_pd, Elm_Focus_Region_Show_Mode mode) +{ + _pd->focus_region_show_mode = mode; +} + +EOLIAN static Elm_Focus_Region_Show_Mode +_elm_widget_focus_region_show_mode_get(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *_pd) +{ + return _pd->focus_region_show_mode; +} + EAPI void elm_widget_activate(Evas_Object *obj, Elm_Activate act) { diff --git a/src/lib/elm_widget.eo b/src/lib/elm_widget.eo index 5d4a190..b59c47d 100644 --- a/src/lib/elm_widget.eo +++ b/src/lib/elm_widget.eo @@ -182,6 +182,16 @@ abstract Elm.Widget (Evas.Object_Smart, Elm_Interface_Atspi_Accessible, Elm_Inte highlight: bool; [[highlight]] } } + @property focus_region_show_mode { + [[Control the focus_region_show mode.]] + set { + } + get { + } + values { + mode: Elm_Focus_Region_Show_Mode; + } + } @property parent_highlight { set { } diff --git a/src/lib/elm_widget.h b/src/lib/elm_widget.h index a78a8e9..86099da 100644 --- a/src/lib/elm_widget.h +++ b/src/lib/elm_widget.h @@ -420,6 +420,7 @@ typedef struct _Elm_Widget_Smart_Data int orient_mode; /* -1 is disabled */ Elm_Focus_Move_Policy focus_move_policy; + Elm_Focus_Region_Show_Mode focus_region_show_mode; Eina_Bool drag_x_locked : 1; Eina_Bool drag_y_locked : 1; @@ -773,6 +774,8 @@ EAPI void elm_widget_focus_highlight_geometry_get(const Evas_Object void _elm_widget_item_highlight_in_theme(Evas_Object *obj, Elm_Object_Item *it); EAPI void elm_widget_focus_move_policy_set(Evas_Object *obj, Elm_Focus_Move_Policy policy); EAPI Elm_Focus_Move_Policy elm_widget_focus_move_policy_get(const Evas_Object *obj); +EAPI void elm_widget_focus_region_show_mode_set(Evas_Object *obj, Elm_Focus_Region_Show_Mode mode); +EAPI Elm_Focus_Region_Show_Mode elm_widget_focus_region_show_mode_get(const Evas_Object *obj); /** * Function to operate on a given widget's scrollabe children when necessary. --
