From 08936d7f38f0eb18afdfda5c6b31ae0f6bea95e1 Mon Sep 17 00:00:00 2001 From: Amitesh Singh Date: Wed, 13 Nov 2013 20:32:31 +0900 Subject: [PATCH] [hoversel] - Added focus support on hoversel items. Summary: Focus support on hoversel items. Test Plan: elementary_test->hoversel2 Reviewers: seoz, raster, Hermet CC: nirajkr Differential Revision: https://phab.enlightenment.org/D316 --- legacy/elementary/ChangeLog | 4 ++ legacy/elementary/NEWS | 1 + legacy/elementary/src/bin/test.c | 2 + legacy/elementary/src/bin/test_hoversel.c | 62 ++++++++++++++++ legacy/elementary/src/lib/elc_hoversel.c | 87 +++++++++++++++++++++++ 5 files changed, 156 insertions(+) diff --git a/legacy/elementary/ChangeLog b/legacy/elementary/ChangeLog index 4939b81340..c7c7dee47f 100644 --- a/legacy/elementary/ChangeLog +++ b/legacy/elementary/ChangeLog @@ -1743,3 +1743,7 @@ 2013-11-07 ChunEon Park (Hermet) * scroller: don't focus region show if the scroller is disabled. + +2013-11-05 Amitesh Singh (_ami_) + + * hoversel: Added focus support on hoversel items. diff --git a/legacy/elementary/NEWS b/legacy/elementary/NEWS index 49d973a644..a4029a9661 100644 --- a/legacy/elementary/NEWS +++ b/legacy/elementary/NEWS @@ -156,6 +156,7 @@ Improvements: layout. * Popup: Change the behavior of adding/removing buttons dynamically. User defined button's position is kept. * Fileselector: Monitor and update changes of selected path automatically while EIO is working. + * Hoversel: Added focus support on hoversel items. Fixes: * Now elm_datetime_field_limit_set() can set year limits wihtout problems. diff --git a/legacy/elementary/src/bin/test.c b/legacy/elementary/src/bin/test.c index 6a54dad8af..1740246465 100755 --- a/legacy/elementary/src/bin/test.c +++ b/legacy/elementary/src/bin/test.c @@ -71,6 +71,7 @@ void test_toolbar7(void *data, Evas_Object *obj, void *event_info); void test_toolbar8(void *data, Evas_Object *obj, void *event_info); void test_toolbar_vertical(void *data, Evas_Object *obj, void *event_info); void test_hoversel(void *data, Evas_Object *obj, void *event_info); +void test_hoversel_focus(void *data, Evas_Object *obj, void *event_info); void test_list(void *data, Evas_Object *obj, void *event_info); void test_list_horizontal(void *data, Evas_Object *obj, void *event_info); void test_list2(void *data, Evas_Object *obj, void *event_info); @@ -710,6 +711,7 @@ add_tests: ADD_TEST(NULL, "Selectors", "ColorSelector", test_colorselector); ADD_TEST(NULL, "Selectors", "SegmentControl", test_segment_control); ADD_TEST(NULL, "Selectors", "Hoversel", test_hoversel); + ADD_TEST(NULL, "Selectors", "Hoversel Focus", test_hoversel_focus); ADD_TEST(NULL, "Selectors", "Radio", test_radio); ADD_TEST(NULL, "Selectors", "FlipSelector", test_flipselector); ADD_TEST(NULL, "Selectors", "DaySelector", test_dayselector); diff --git a/legacy/elementary/src/bin/test_hoversel.c b/legacy/elementary/src/bin/test_hoversel.c index e0417d348e..25b3de094d 100644 --- a/legacy/elementary/src/bin/test_hoversel.c +++ b/legacy/elementary/src/bin/test_hoversel.c @@ -240,3 +240,65 @@ test_hoversel(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_ evas_object_show(win); } + +void +test_hoversel_focus(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *hoversel; + + win = elm_win_util_standard_add("hoversel focus", "Hoversel Focus"); + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + elm_win_focus_highlight_animate_set(win, EINA_TRUE); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + hoversel = elm_hoversel_add(win); + elm_hoversel_hover_parent_set(hoversel, win); + elm_object_text_set(hoversel, "Vertical"); + elm_hoversel_item_add(hoversel, "Item 1", NULL, ELM_ICON_NONE, NULL, NULL); + elm_hoversel_item_add(hoversel, "Item 2", NULL, ELM_ICON_NONE, NULL, NULL); + elm_hoversel_item_add(hoversel, "Item 3", NULL, ELM_ICON_NONE, NULL, NULL); + elm_hoversel_item_add(hoversel, "Item 4 - Long Label Here", "close", ELM_ICON_STANDARD, NULL, NULL); + evas_object_smart_callback_add(hoversel, "clicked", + _hoversel_clicked_cb, NULL); + evas_object_smart_callback_add(hoversel, "selected", + _hoversel_selected_cb, NULL); + evas_object_smart_callback_add(hoversel, "dismissed", + _hoversel_dismissed_cb, NULL); + elm_box_pack_end(bx, hoversel); + evas_object_show(hoversel); + + hoversel = elm_hoversel_add(win); + elm_hoversel_horizontal_set(hoversel, EINA_TRUE); + elm_hoversel_hover_parent_set(hoversel, win); + elm_object_text_set(hoversel, "Horizontal"); + elm_hoversel_item_add(hoversel, "Item 1", NULL, ELM_ICON_NONE, NULL, NULL); + elm_hoversel_item_add(hoversel, "Item 2", NULL, ELM_ICON_NONE, NULL, NULL); + elm_hoversel_item_add(hoversel, "Item 3", "home", ELM_ICON_STANDARD, NULL, + NULL); + elm_hoversel_item_add(hoversel, "Item 4", "close", ELM_ICON_STANDARD, NULL, + NULL); + elm_box_pack_end(bx, hoversel); + evas_object_show(hoversel); + + hoversel = elm_hoversel_add(win); + elm_hoversel_hover_parent_set(hoversel, win); + elm_object_text_set(hoversel, "Icons"); + elm_hoversel_item_add(hoversel, "Item 1", "apps", ELM_ICON_STANDARD, NULL, + NULL); + elm_hoversel_item_add(hoversel, "Item 2", "arrow_down", ELM_ICON_STANDARD, + NULL, NULL); + elm_hoversel_item_add(hoversel, "Item 3", "home", ELM_ICON_STANDARD, NULL, + NULL); + elm_hoversel_item_add(hoversel, "Item 4", "close", ELM_ICON_STANDARD, NULL, + NULL); + elm_box_pack_end(bx, hoversel); + evas_object_show(hoversel); + + evas_object_resize(win, 320, 500); + evas_object_show(win); +} diff --git a/legacy/elementary/src/lib/elc_hoversel.c b/legacy/elementary/src/lib/elc_hoversel.c index f050e5804b..2ca3465fee 100644 --- a/legacy/elementary/src/lib/elc_hoversel.c +++ b/legacy/elementary/src/lib/elc_hoversel.c @@ -562,6 +562,90 @@ elm_hoversel_item_icon_get(const Elm_Object_Item *it, if (icon_type) *icon_type = item->icon_type; } +static void +_elm_hoversel_smart_focus_direction_manager_is(Eo *obj EINA_UNUSED, void *_pd EINA_UNUSED, va_list *list) +{ + Eina_Bool *ret = va_arg(*list, Eina_Bool *); + if(ret) *ret = EINA_TRUE; +} + +static void +_elm_hoversel_smart_focus_direction(Eo *obj EINA_UNUSED, void *_pd EINA_UNUSED, va_list *list) +{ + Elm_Hoversel_Smart_Data *sd = _pd; + Evas_Object *base = va_arg(*list, Evas_Object *); + double degree = va_arg(*list, double); + Evas_Object **direction = va_arg(*list, Evas_Object **); + double *weight = va_arg(*list, double *); + Eina_Bool *ret = va_arg(*list, Eina_Bool *); + if (ret) *ret = EINA_FALSE; + Eina_Bool int_ret; + Eina_List *l = NULL; + void *(*list_data_get)(const Eina_List *list); + + if (!sd || !sd->hover) return; + + list_data_get = eina_list_data_get; + l = eina_list_append(l, sd->hover); + + int_ret = elm_widget_focus_list_direction_get + (obj, base, l, list_data_get, degree, direction, weight); + if (ret) *ret = int_ret; + eina_list_free(l); +} + +static void +_elm_hoversel_smart_event(Eo *obj, void *_pd, va_list *list) +{ + Evas_Object *src = va_arg(*list, Evas_Object *); + (void) src; + Evas_Callback_Type type = va_arg(*list, Evas_Callback_Type); + void *event_info = va_arg(*list, void *); + Eina_Bool *ret = va_arg(*list, Eina_Bool *); + if (ret) *ret = EINA_FALSE; + Evas_Event_Key_Down *ev = event_info; + Elm_Hoversel_Smart_Data *sd = _pd; + + eo_do_super(obj, MY_CLASS, elm_wdg_event(src, type, event_info, ret)); + if (*ret) return; + + if (!sd || !sd->hover) return; + if (elm_widget_disabled_get(obj)) return; + if (type != EVAS_CALLBACK_KEY_DOWN) return; + if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return; + + if ((!strcmp(ev->key, "Down")) || + ((!strcmp(ev->key, "KP_Down")) && (!ev->string))) + { + elm_widget_focus_cycle(sd->hover, ELM_FOCUS_DOWN); + goto success; + } + else if ((!strcmp(ev->key, "Up")) || + ((!strcmp(ev->key, "KP_Up")) && (!ev->string))) + { + elm_widget_focus_cycle(sd->hover, ELM_FOCUS_UP); + goto success; + } + else if ((!strcmp(ev->key, "Left")) || + ((!strcmp(ev->key, "KP_Left")) && (!ev->string))) + { + elm_widget_focus_cycle(sd->hover, ELM_FOCUS_LEFT); + goto success; + } + else if ((!strcmp(ev->key, "Right")) || + ((!strcmp(ev->key, "KP_Right")) && (!ev->string))) + { + elm_widget_focus_cycle(sd->hover, ELM_FOCUS_RIGHT); + goto success; + } + + return; + +success: + ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; + if (ret) *ret = EINA_TRUE; +} + static void _class_constructor(Eo_Class *klass) { @@ -576,6 +660,9 @@ _class_constructor(Eo_Class *klass) EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_THEME), _elm_hoversel_smart_theme), EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_TRANSLATE), _elm_hoversel_smart_translate), EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_PARENT_SET), _elm_hoversel_smart_parent_set), + EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_FOCUS_DIRECTION_MANAGER_IS), _elm_hoversel_smart_focus_direction_manager_is), + EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_FOCUS_DIRECTION), _elm_hoversel_smart_focus_direction), + EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_EVENT), _elm_hoversel_smart_event), EO_OP_FUNC(ELM_OBJ_BUTTON_ID(ELM_OBJ_BUTTON_SUB_ID_ADMITS_AUTOREPEAT_GET), _elm_hoversel_smart_admits_autorepeat_get),