seoz pushed a commit to branch master.

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

commit d7832a6a5d7aa3f96591b5b4e194fd9f5a729b7a
Author: nirajkr <[email protected]>
Date:   Sun Mar 9 01:04:34 2014 +0900

    genlist: Implemented the item focus support in genlist
    
    Summary:
    Implemented the following function
              1. _item_unfocused
              2. _item_focused
              3. _item_focus_up
              4. _item_focus_down
              5. _item_focus_left : Currently this function return EINA_FALSE. 
It means focus will move out of genlist to the another left widget
              6. _item_focus_right : Currently this function return EINA_FALSE. 
It means focus will move out of genlist to the right widget
              7. _item_focus_set_hook
              8. _item_focus_get_hook
              9. _elm_genlist_focus_highlight_geometry_get
              10. _elm_genlist_focused_item_get
              11. Changes in the smart_event, smart_on_focus, 
pan_smart_calculate, mouse up callback.
                  Currently selected/focus logic are both present in the 
smart_event function and its
                  will be separate out.
    
    Reviewers: seoz, woohyun
    
    CC: singh.amitesh
    
    Differential Revision: https://phab.enlightenment.org/D558
    
    Conflicts:
    
        src/lib/elm_genlist.c
---
 data/themes/edc/elm/genlist.edc |  15 ++
 src/lib/elm_genlist.c           | 300 ++++++++++++++++++++++++++++++++++++++--
 src/lib/elm_genlist.h           |   2 +
 src/lib/elm_widget_genlist.h    |   3 +
 4 files changed, 307 insertions(+), 13 deletions(-)

diff --git a/data/themes/edc/elm/genlist.edc b/data/themes/edc/elm/genlist.edc
index 9066a4d..cf77f4c 100644
--- a/data/themes/edc/elm/genlist.edc
+++ b/data/themes/edc/elm/genlist.edc
@@ -260,6 +260,7 @@ group { name: 
"elm/genlist/item_compress/group_index/default";
 
 group { name: "elm/genlist/item/default/default";
    data.item: "selectraise" "on";
+   data.item: "focusraise" "on";
    data.item: "texts" "elm.text";
    data.item: "contents" "elm.swallow.icon elm.swallow.end";
    data.item: "treesize" TREEPAD;
@@ -634,6 +635,7 @@ 
COMPRESS_ODD("elm/genlist/item_compress_odd/default/default", "elm/genlist/item/
 
 group { name: "elm/genlist/item/default_style/default";
    data.item: "selectraise" "on";
+   data.item: "focusraise" "on";
    data.item: "texts" "elm.text";
    data.item: "contents" "elm.swallow.icon elm.swallow.end";
    data.item: "treesize" TREEPAD;
@@ -874,6 +876,7 @@ 
COMPRESS_ODD("elm/genlist/item_compress_odd/default_style/default", "elm/genlist
 
 group { name: "elm/genlist/item/one_icon/default";
    data.item: "selectraise" "on";
+   data.item: "focusraise" "on";
    data.item: "texts" "elm.text";
    data.item: "contents" "elm.swallow.icon";
    data.item: "treesize" TREEPAD;
@@ -1074,6 +1077,7 @@ 
COMPRESS_ODD("elm/genlist/item_compress_odd/one_icon/default", "elm/genlist/item
 
 group { name: "elm/genlist/item/end_icon/default";
    data.item: "selectraise" "on";
+   data.item: "focusraise" "on";
    data.item: "texts" "elm.text";
    data.item: "contents" "elm.swallow.icon";
    data.item: "treesize" TREEPAD;
@@ -1273,6 +1277,7 @@ 
COMPRESS_ODD("elm/genlist/item_compress_odd/end_icon/default", "elm/genlist/item
 
 group { name: "elm/genlist/item/no_icon/default";
    data.item: "selectraise" "on";
+   data.item: "focusraise" "on";
    data.item: "texts" "elm.text";
    data.item: "treesize" TREEPAD;
    data.item: "flips" "elm.text.flip";
@@ -1445,6 +1450,7 @@ 
COMPRESS_ODD("elm/genlist/item_compress_odd/no_icon/default", "elm/genlist/item/
 
 group { name: "elm/genlist/item/full/default";
    data.item: "selectraise" "on";
+   data.item: "focusraise" "on";
    data.item: "contents" "elm.swallow.content";
    data.item: "treesize" TREEPAD;
    data.item: "flips" "elm.text.flip";
@@ -1887,6 +1893,7 @@ group { name: 
"elm/genlist/tree_compress_odd/full/default";
 
 group { name: "elm/genlist/tree/tree_effect/default";
    data.item: "selectraise" "on";
+   data.item: "focusraise" "on";
    data.item: "texts" "elm.text";
    data.item: "contents" "elm.swallow.icon elm.swallow.end";
    data.item: "treesize" TREEPAD;
@@ -1982,6 +1989,7 @@ group { name: "elm/genlist/item/tree_effect/default";
 
 group { name: "elm/genlist/item/icon_top_text_bottom/default";
    data.item: "selectraise" "on";
+   data.item: "focusraise" "on";
    data.item: "texts" "elm.text";
    data.item: "contents" "elm.swallow.icon";
    data.item: "treesize" TREEPAD;
@@ -2412,6 +2420,7 @@ 
COMPRESS_ODD("elm/genlist/tree_compress_odd/icon_top_text_bottom/default", "elm/
    }
 group { name: "elm/genlist/item/double_label/default";
    data.item: "selectraise" "on";
+   data.item: "focusraise" "on";
    data.item: "texts" "elm.text elm.text.sub";
    data.item: "contents" "elm.swallow.icon elm.swallow.end";
    data.item: "treesize" TREEPAD;
@@ -3036,6 +3045,7 @@ 
COMPRESS_SUB_ODD("elm/genlist/tree_compress_odd/double_label/default", "elm/genl
    }
 group { name: "elm/genlist/item/message/default";
    data.item: "selectraise" "on";
+   data.item: "focusraise" "on";
    data.item: "texts" "elm.text elm.title.1 elm.title.2";
    data.item: "contents" "elm.swallow.icon";
    data.item: "treesize" TREEPAD;
@@ -3431,6 +3441,7 @@ 
COMPRESS_T1T2_ODD("elm/genlist/item_compress_odd/message/default", "elm/genlist/
 
 group { name: "elm/genlist/item/media/default";
    data.item: "selectraise" "on";
+   data.item: "focusraise" "on";
    data.item: "texts" "elm.text.title elm.text.album-artist";
    data.item: "treesize" TREEPAD;
    data.item: "flips" "elm.text.flip";
@@ -3900,6 +3911,7 @@ 
COMPRESS_MEDIA_ODD("elm/genlist/item_compress_odd/media/default", "elm/genlist/i
       
 group { name: "elm/genlist/item/media-album/default";
    data.item: "selectraise" "on";
+   data.item: "focusraise" "on";
    data.item: "texts" "elm.text.title elm.text.trackno elm.text.length";
    data.item: "treesize" TREEPAD;
    data.item: "flips" "elm.text.flip";
@@ -4492,6 +4504,7 @@ group { name: 
"elm/genlist/item_compress_odd/media-album/default";
 
 group { name: "elm/genlist/item/media-preview/default";
    data.item: "selectraise" "on";
+   data.item: "focusraise" "on";
    data.item: "texts" "elm.text elm.text.artist";
    data.item: "contents" "elm.swallow.preview";
    data.item: "treesize" TREEPAD;
@@ -5081,6 +5094,7 @@ group { name: 
"elm/genlist/item_odd_compress/media-preview/default";
    }
 group { name: "elm/genlist/item/mode/default";
    data.item: "selectraise" "on";
+   data.item: "focusraise" "on";
    data.item: "texts" "elm.text.mode";
    data.item: "mode_part" "elm.swallow.original";
    data.item: "treesize" TREEPAD;
@@ -5413,6 +5427,7 @@ 
COMPRESS_MODE_ODD("elm/genlist/tree_compress_odd/mode/default", "elm/genlist/tre
 group { name: "elm/genlist/item/edit/default";
    data.item: "contents" "elm.edit.icon.1 elm.edit.icon.2";
    data.item: "selectraise" "on";
+   data.item: "focusraise" "on";
    images.image: "vgrad_med_dark.png" COMP;
    images.image: "bevel_horiz_out.png" COMP;
    images.image: "shadow_horiz.png" COMP;
diff --git a/src/lib/elm_genlist.c b/src/lib/elm_genlist.c
index 1c3abb4..134ff49 100644
--- a/src/lib/elm_genlist.c
+++ b/src/lib/elm_genlist.c
@@ -86,6 +86,8 @@ EAPI Eo_Op ELM_OBJ_GENLIST_BASE_ID = EO_NOOP;
     cmd(SIG_TREE_EFFECT_FINISHED , "tree,effect,finished", "") \
     cmd(SIG_HIGHLIGHTED, "highlighted", "") \
     cmd(SIG_UNHIGHLIGHTED, "unhighlighted", "") \
+    cmd(SIG_ITEM_FOCUSED, "item,focused", "") \
+    cmd(SIG_ITEM_UNFOCUSED, "item,unfocused", "") \
     cmd(SIG_PRESSED, "pressed", "") \
     cmd(SIG_RELEASED, "released", "")
 
@@ -97,6 +99,8 @@ static const Evas_Smart_Cb_Description _smart_callbacks[] = {
    {SIG_WIDGET_ACCESS_CHANGED, ""}, /**< handled by elm_widget */
    {SIG_LAYOUT_FOCUSED, ""}, /**< handled by elm_layout */
    {SIG_LAYOUT_UNFOCUSED, ""}, /**< handled by elm_layout */
+   {SIG_ITEM_FOCUSED, ""},
+   {SIG_ITEM_UNFOCUSED, ""},
 
    {NULL, NULL}
 };
@@ -1766,6 +1770,9 @@ _item_realize(Elm_Gen_Item *it,
 
    if (it->decorate_it_set) _decorate_item_set(it);
 
+   if (!calc)
+     _elm_widget_item_highlight_in_theme(WIDGET(it), (Elm_Object_Item *)it);
+
    edje_object_message_signal_process(VIEW(it));
 }
 
@@ -2265,6 +2272,9 @@ _elm_genlist_pan_smart_calculate(Eo *obj EINA_UNUSED, 
void *_pd, va_list *list E
    else if (psd->wsd->reorder_fast == -1)
       eo_do((psd->wsd)->obj, elm_scrollable_interface_content_region_show(vx, 
vy + 10, vw, vh));
 
+   if (psd->wsd->focused_item)
+     _elm_widget_focus_highlight_start(psd->wobj);
+
    evas_event_thaw(evas_object_evas_get(obj));
    evas_event_thaw_eval(evas_object_evas_get(obj));
 }
@@ -2327,8 +2337,6 @@ _item_multi_select_up(Elm_Genlist_Smart_Data *sd)
      {
         elm_genlist_item_selected_set(sd->last_selected_item, EINA_FALSE);
         sd->last_selected_item = prev;
-        elm_genlist_item_show
-          (sd->last_selected_item, ELM_GENLIST_ITEM_SCROLLTO_IN);
      }
    else
      {
@@ -2353,8 +2361,6 @@ _item_multi_select_down(Elm_Genlist_Smart_Data *sd)
      {
         elm_genlist_item_selected_set(sd->last_selected_item, EINA_FALSE);
         sd->last_selected_item = next;
-        elm_genlist_item_show
-          (sd->last_selected_item, ELM_GENLIST_ITEM_SCROLLTO_IN);
      }
    else
      {
@@ -2396,7 +2402,6 @@ _item_single_select_up(Elm_Genlist_Smart_Data *sd)
    _all_items_deselect(sd);
 
    elm_genlist_item_selected_set((Elm_Object_Item *)prev, EINA_TRUE);
-   elm_genlist_item_show((Elm_Object_Item *)prev, 
ELM_GENLIST_ITEM_SCROLLTO_IN);
    return EINA_TRUE;
 }
 
@@ -2420,8 +2425,118 @@ _item_single_select_down(Elm_Genlist_Smart_Data *sd)
    _all_items_deselect(sd);
 
    elm_genlist_item_selected_set((Elm_Object_Item *)next, EINA_TRUE);
-   elm_genlist_item_show
-     ((Elm_Object_Item *)next, ELM_GENLIST_ITEM_SCROLLTO_IN);
+
+   return EINA_TRUE;
+}
+
+static void
+_elm_genlist_item_focused(Elm_Gen_Item *it)
+{
+   Evas_Object *obj = WIDGET(it);
+   Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
+   const char *focus_raise;
+
+   if (it->generation < sd->generation)
+     return;
+
+   if ((sd->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY) ||
+       (it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY) ||
+       (it == (Elm_Gen_Item *)sd->focused_item) ||
+       (elm_widget_item_disabled_get(it)))
+     return;
+
+   elm_genlist_item_bring_in((Elm_Object_Item *)it,
+                             ELM_GENLIST_ITEM_SCROLLTO_IN);
+   sd->focused_item = (Elm_Object_Item *)it;
+
+   if (elm_widget_focus_highlight_enabled_get(obj))
+     {
+        edje_object_signal_emit
+           (VIEW(it), "elm,state,focused", "elm");
+     }
+
+   focus_raise = edje_object_data_get(VIEW(it), "focusraise");
+   if ((focus_raise) && (!strcmp(focus_raise, "on")))
+     evas_object_raise(VIEW(it));
+   evas_object_smart_callback_call
+           (WIDGET(it), SIG_ITEM_FOCUSED, it);
+}
+
+static void
+_elm_genlist_item_unfocused(Elm_Gen_Item *it)
+{
+   Elm_Genlist_Smart_Data *sd = GL_IT(it)->wsd;
+
+   if (it->generation < sd->generation)
+     return;
+
+   if ((sd->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY) ||
+       (it->select_mode == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)) 
+     return;
+
+   if ((!sd->focused_item) ||
+       (it != (Elm_Gen_Item *)sd->focused_item))
+     return;
+
+   sd->prev_focused_item = (Elm_Object_Item *)it;
+
+   edje_object_signal_emit
+      (VIEW(sd->focused_item), "elm,state,unfocused", "elm");
+
+   sd->focused_item = NULL;
+   evas_object_smart_callback_call
+      (WIDGET(it), SIG_ITEM_UNFOCUSED, it);
+}
+
+static Eina_Bool
+_item_focused_next(Evas_Object *obj, Elm_Focus_Direction dir)
+{
+   ELM_GENLIST_DATA_GET(obj, sd);
+   Elm_Gen_Item *next;
+   Elm_Object_Item *first_item;
+   Elm_Object_Item *last_item;
+
+   if (!sd->focused_item)
+     {
+        if (dir == ELM_FOCUS_UP)
+          next = ELM_GEN_ITEM_FROM_INLIST(sd->items->last);
+        else if (dir == ELM_FOCUS_DOWN)
+          next = ELM_GEN_ITEM_FROM_INLIST(sd->items);
+        else
+          return EINA_FALSE;
+
+        while ((next) &&
+               (next->generation < sd->generation) &&
+               (!elm_widget_item_disabled_get(next)))
+          next = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(next)->next);
+     }
+   else
+     {
+        if (dir == ELM_FOCUS_UP)
+          {
+             first_item = elm_genlist_first_item_get(WIDGET(sd->focused_item));
+             if (first_item == sd->focused_item) return EINA_FALSE;
+             next = (Elm_Gen_Item 
*)elm_genlist_item_prev_get(sd->focused_item);
+
+             while (elm_widget_item_disabled_get(next))
+               next = (Elm_Gen_Item 
*)elm_genlist_item_prev_get((Elm_Object_Item *)next);
+          }
+        else if (dir == ELM_FOCUS_DOWN)
+          {
+             last_item = elm_genlist_last_item_get(WIDGET(sd->focused_item));
+             if (last_item == sd->focused_item) return EINA_FALSE;
+             next = (Elm_Gen_Item 
*)elm_genlist_item_next_get(sd->focused_item);
+
+             while (elm_widget_item_disabled_get(next))
+               next = (Elm_Gen_Item 
*)elm_genlist_item_next_get((Elm_Object_Item *)next);
+          }
+        else
+          return EINA_FALSE;
+
+        if (!next) return EINA_FALSE;
+     }
+
+   elm_object_item_focus_set((Elm_Object_Item *)next, EINA_TRUE);
 
    return EINA_TRUE;
 }
@@ -2511,6 +2626,10 @@ _elm_genlist_smart_event(Eo *obj, void *_pd, va_list 
*list)
 
         Elm_Gen_Item *gt = (Elm_Gen_Item*)elm_genlist_selected_item_get(obj);
         _elm_genlist_item_content_focus_set(gt, ELM_FOCUS_LEFT);
+
+        if (ret) *ret = EINA_FALSE;
+
+        return;
      }
    else if ((!strcmp(ev->key, "Right")) ||
             ((!strcmp(ev->key, "KP_Right")) && (!ev->string)))
@@ -2519,6 +2638,10 @@ _elm_genlist_smart_event(Eo *obj, void *_pd, va_list 
*list)
 
         Elm_Gen_Item *gt = (Elm_Gen_Item*)elm_genlist_selected_item_get(obj);
         _elm_genlist_item_content_focus_set(gt, ELM_FOCUS_RIGHT);
+
+        if (ret) *ret = EINA_FALSE;
+
+        return;
      }
    else if ((!strcmp(ev->key, "Up")) ||
             ((!strcmp(ev->key, "KP_Up")) && (!ev->string)))
@@ -2529,10 +2652,21 @@ _elm_genlist_smart_event(Eo *obj, void *_pd, va_list 
*list)
           {
              ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
              if (ret) *ret = EINA_TRUE;
-             return;
           }
         else
           y -= step_y;
+
+        if (_item_focused_next(obj, ELM_FOCUS_UP))
+          {
+             ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
+             if (ret) *ret = EINA_TRUE;
+          }
+        else
+          {
+             if (ret) *ret = EINA_FALSE;
+          }
+
+        return;
      }
    else if ((!strcmp(ev->key, "Down")) ||
             ((!strcmp(ev->key, "KP_Down")) && (!ev->string)))
@@ -2543,10 +2677,21 @@ _elm_genlist_smart_event(Eo *obj, void *_pd, va_list 
*list)
           {
              ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
              if (ret) *ret = EINA_TRUE;
-             return;
           }
         else
           y += step_y;
+
+        if (_item_focused_next(obj, ELM_FOCUS_DOWN))
+          {
+             ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
+             if (ret) *ret = EINA_TRUE;
+          }
+        else
+          {
+             if (ret) *ret = EINA_FALSE;
+          }
+
+        return;
      }
    else if ((!strcmp(ev->key, "Home")) ||
             ((!strcmp(ev->key, "KP_Home")) && (!ev->string)))
@@ -2675,6 +2820,7 @@ _elm_genlist_smart_on_focus(Eo *obj, void *_pd 
EINA_UNUSED, va_list *list)
    if (ret) *ret = EINA_FALSE;
    Eina_Bool int_ret = EINA_FALSE;
    Elm_Genlist_Smart_Data *sd = _pd;
+   Elm_Object_Item *it = NULL;
 
    eo_do_super(obj, MY_CLASS, elm_wdg_on_focus(&int_ret));
    if (!int_ret) return;
@@ -2683,6 +2829,28 @@ _elm_genlist_smart_on_focus(Eo *obj, void *_pd 
EINA_UNUSED, va_list *list)
        (!sd->last_selected_item))
      sd->last_selected_item = eina_list_data_get(sd->selected);
 
+   if (elm_widget_focus_get(obj))
+     {
+       if (sd->last_focused_item)
+         elm_object_item_focus_set(sd->last_focused_item, EINA_TRUE);
+       else if (sd->last_selected_item)
+         elm_object_item_focus_set(sd->last_selected_item, EINA_TRUE);
+       else
+         {
+           it = elm_genlist_first_item_get(obj);
+           elm_object_item_focus_set(it, EINA_TRUE);
+         }
+     }
+   else
+     {
+        if (sd->focused_item)
+          {
+             sd->prev_focused_item = sd->focused_item;
+             sd->last_focused_item = sd->focused_item;
+             _elm_genlist_item_unfocused((Elm_Gen_Item *)sd->focused_item);
+          }
+     }
+
    if (ret) *ret = EINA_TRUE;
 }
 
@@ -2776,7 +2944,8 @@ _elm_genlist_smart_theme(Eo *obj, void *_pd, va_list 
*list)
    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
    if (ret) *ret = EINA_FALSE;
    Eina_Bool int_ret = EINA_FALSE;
-
+   Eina_List *l;
+   Elm_Gen_Item *it;
    Elm_Genlist_Smart_Data *sd = _pd;
 
    eo_do_super(obj, MY_CLASS, elm_wdg_theme_apply(&int_ret));
@@ -2789,11 +2958,9 @@ _elm_genlist_smart_theme(Eo *obj, void *_pd, va_list 
*list)
    sd->item_width = sd->item_height = 0;
    sd->group_item_width = sd->group_item_height = 0;
    sd->minw = sd->minh = sd->realminw = 0;
+
    EINA_INLIST_FOREACH(sd->blocks, itb)
      {
-        Eina_List *l;
-        Elm_Gen_Item *it;
-
         if (itb->realized) _item_block_unrealize(itb);
         EINA_LIST_FOREACH(itb->items, l, it)
           it->item->mincalcd = EINA_FALSE;
@@ -4237,6 +4404,10 @@ _item_mouse_up_cb(void *data,
      return;
 
    if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
+   
+   if (sd->focused_item != (Elm_Object_Item *)it)
+     elm_object_item_focus_set((Elm_Object_Item *)it, EINA_TRUE);
+
    if (sd->multi &&
        ((sd->multi_select_mode != ELM_OBJECT_MULTI_SELECT_MODE_WITH_CONTROL) ||
         (evas_key_modifier_is_set(ev->modifiers, "Control"))))
@@ -5335,6 +5506,43 @@ _item_signal_emit_hook(Elm_Object_Item *it,
    edje_object_signal_emit(VIEW(it), emission, source);
 }
 
+static void
+_item_focus_set_hook(Elm_Object_Item *it, Eina_Bool focused)
+{
+   ELM_GENLIST_ITEM_CHECK_OR_RETURN(it);
+   Evas_Object *obj = WIDGET(it);
+   ELM_GENLIST_DATA_GET(obj, sd);
+
+   if (focused)
+     {
+        if (!elm_object_focus_get(obj))
+          elm_object_focus_set(obj, EINA_TRUE);
+
+        if (it != sd->focused_item)
+          {
+             if (sd->focused_item)
+               _elm_genlist_item_unfocused((Elm_Gen_Item *)sd->focused_item);
+             _elm_genlist_item_focused((Elm_Gen_Item *)it);
+             _elm_widget_focus_highlight_start(obj);
+          }
+     }
+   else
+     _elm_genlist_item_unfocused((Elm_Gen_Item *)it);
+}
+
+static Eina_Bool
+_item_focus_get_hook(Elm_Object_Item *it)
+{
+   ELM_GENLIST_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
+   Evas_Object *obj = WIDGET(it);
+   ELM_GENLIST_DATA_GET(obj, sd);
+
+   if (it == sd->focused_item)
+     return EINA_TRUE;
+
+   return EINA_FALSE;
+}
+
 static Elm_Gen_Item *
 _elm_genlist_item_new(Elm_Genlist_Smart_Data *sd,
                       const Elm_Genlist_Item_Class *itc,
@@ -5366,6 +5574,8 @@ _elm_genlist_item_new(Elm_Genlist_Smart_Data *sd,
    elm_widget_item_disable_hook_set(it, _item_disable_hook);
    elm_widget_item_del_pre_hook_set(it, _item_del_pre_hook);
    elm_widget_item_signal_emit_hook_set(it, _item_signal_emit_hook);
+   elm_widget_item_focus_set_hook_set(it, _item_focus_set_hook);
+   elm_widget_item_focus_get_hook_set(it, _item_focus_get_hook);
 
    it->del_cb = (Ecore_Cb)_item_del;
    it->highlight_cb = (Ecore_Cb)_item_highlight;
@@ -7628,6 +7838,68 @@ elm_genlist_nth_item_get(const Evas_Object *obj, 
unsigned int nth)
 }
 
 static void
+_elm_genlist_focus_highlight_geometry_get(Eo *obj EINA_UNUSED, void *_pd, 
va_list *list)
+{
+   Evas_Coord *x = va_arg(*list, Evas_Coord *);
+   Evas_Coord *y = va_arg(*list, Evas_Coord *);
+   Evas_Coord *w = va_arg(*list, Evas_Coord *);
+   Evas_Coord *h = va_arg(*list, Evas_Coord *);
+   Eina_Bool *is_next = va_arg(*list, Eina_Bool *);
+   Evas_Coord ox, oy, oh, ow, item_x, item_y, item_w, item_h;
+
+   Elm_Genlist_Smart_Data *sd = _pd;
+   evas_object_geometry_get(obj, &ox, &oy, &ow, &oh);
+
+   if (is_next && *is_next)
+     {
+       if (sd->focused_item)
+         {
+            evas_object_geometry_get(VIEW(sd->focused_item), &item_x, &item_y, 
&item_w, &item_h);
+            
elm_widget_focus_highlight_focus_part_geometry_get(VIEW(sd->focused_item), 
&item_x, &item_y, &item_w, &item_h);
+         }
+     }
+   else
+     {
+       if (sd->prev_focused_item)
+         {
+            evas_object_geometry_get(VIEW(sd->prev_focused_item), &item_x, 
&item_y, &item_w, &item_h);
+            
elm_widget_focus_highlight_focus_part_geometry_get(VIEW(sd->prev_focused_item), 
&item_x, &item_y, &item_w, &item_h);
+         }
+     }
+
+   if (item_y < oy)
+     {
+        *x = ox;
+        *y = oy;
+        *w = item_w;
+        *h = item_h;
+     }
+   else if (item_y > (oy + oh - item_h))
+     {
+        *x = ox;
+        *y = oy + oh - item_h;
+        *w = item_w;
+        *h = item_h;
+     }
+   else
+     {
+        *x = item_x;
+        *y = item_y;
+        *w = item_w;
+        *h = item_h;
+     }
+}
+
+static void
+_elm_genlist_focused_item_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
+{
+   Elm_Object_Item **ret = va_arg(*list, Elm_Object_Item **);
+   Elm_Genlist_Smart_Data *sd = _pd;
+
+   if (ret) *ret = sd->focused_item;
+}
+
+static void
 _class_constructor(Eo_Class *klass)
 {
    const Eo_Op_Func_Description func_desc[] = {
@@ -7647,6 +7919,8 @@ _class_constructor(Eo_Class *klass)
         EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_FOCUS_NEXT_MANAGER_IS), 
_elm_genlist_smart_focus_next_manager_is),
         
EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_FOCUS_DIRECTION_MANAGER_IS), 
_elm_genlist_smart_focus_direction_manager_is),
         EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_FOCUS_NEXT), 
_elm_genlist_smart_focus_next),
+        
EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_FOCUS_HIGHLIGHT_GEOMETRY_GET), 
_elm_genlist_focus_highlight_geometry_get),
+        EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_FOCUSED_ITEM_GET), 
_elm_genlist_focused_item_get),
         EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_ACCESS), 
_elm_genlist_smart_access),
 
         EO_OP_FUNC(ELM_OBJ_LAYOUT_ID(ELM_OBJ_LAYOUT_SUB_ID_SIZING_EVAL), 
_elm_genlist_smart_sizing_eval),
diff --git a/src/lib/elm_genlist.h b/src/lib/elm_genlist.h
index 58c4a24..aca51fb 100644
--- a/src/lib/elm_genlist.h
+++ b/src/lib/elm_genlist.h
@@ -377,6 +377,8 @@
  *   was unhighlighted.
  * - @c "focused" - When the genlist has received focus. (since 1.8)
  * - @c "unfocused" - When the genlist has lost focus. (since 1.8)
+ * - @c "item,focused" - When the genlist item has recieved focus. (since 1.10)
+ * - @c "item,unfocused" - When the genlist item has lost focus. (since 1.10)
  *
  *
  * Supported elm_object_item common APIs
diff --git a/src/lib/elm_widget_genlist.h b/src/lib/elm_widget_genlist.h
index 4ac52c2..9d0c8d0 100644
--- a/src/lib/elm_widget_genlist.h
+++ b/src/lib/elm_widget_genlist.h
@@ -46,6 +46,9 @@ struct _Elm_Genlist_Smart_Data
                                                      * being
                                                      * repositioned */
    Elm_Object_Item                      *last_selected_item;
+   Elm_Object_Item                      *focused_item; /**< a focused item by 
keypad arrow or mouse. This is set to NULL if widget looses focus. */
+   Elm_Object_Item                      *last_focused_item; /**< This records 
the last focused item when widget looses focus. This is required to set the 
focus on last focused item when widgets gets focus. */
+   Elm_Object_Item                      *prev_focused_item; /**< a previous 
focused item by keypad arrow or mouse. */
    Ecore_Job                            *calc_job;
    int                                   walking;
    int                                   item_width, item_height;

-- 


Reply via email to