seoz pushed a commit to branch master.

http://git.enlightenment.org/core/elementary.git/commit/?id=cf61678ea3a4dcc78fc0b86af6f118969dd4ed10

commit cf61678ea3a4dcc78fc0b86af6f118969dd4ed10
Author: Amitesh Singh <[email protected]>
Date:   Wed Nov 13 20:32:31 2013 +0900

    [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
---
 ChangeLog               |  4 +++
 NEWS                    |  1 +
 src/bin/test.c          |  2 ++
 src/bin/test_hoversel.c | 62 +++++++++++++++++++++++++++++++++++
 src/lib/elc_hoversel.c  | 87 +++++++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 156 insertions(+)

diff --git a/ChangeLog b/ChangeLog
index 4939b81..c7c7dee 100644
--- a/ChangeLog
+++ b/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/NEWS b/NEWS
index 49d973a..a4029a9 100644
--- a/NEWS
+++ b/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/src/bin/test.c b/src/bin/test.c
index 6a54dad..1740246 100755
--- a/src/bin/test.c
+++ b/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/src/bin/test_hoversel.c b/src/bin/test_hoversel.c
index e0417d3..25b3de0 100644
--- a/src/bin/test_hoversel.c
+++ b/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/src/lib/elc_hoversel.c b/src/lib/elc_hoversel.c
index f050e58..2ca3465 100644
--- a/src/lib/elc_hoversel.c
+++ b/src/lib/elc_hoversel.c
@@ -563,6 +563,90 @@ elm_hoversel_item_icon_get(const Elm_Object_Item *it,
 }
 
 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)
 {
       const Eo_Op_Func_Description func_desc[] = {
@@ -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),
 

-- 


Reply via email to