raster pushed a commit to branch master.

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

commit f0480a3e435361181f11f341c012ef8d5818ef6a
Author: Amitesh Singh <[email protected]>
Date:   Thu Apr 3 18:31:47 2014 +0900

    gengrid: Added feature to move focus out of gengrid if focus is on edge 
items.
    
    Summary:
    Earlier, Focus can only move out of gengrid from first or last item.
    Now, Focus can move out of gengrid if focus is on edge items.
    @feature
    
    Test Plan: elementary_test->Gengrid Focus
    
    Reviewers: raster, seoz
    
    CC: seoz, nirajkr
    
    Differential Revision: https://phab.enlightenment.org/D682
---
 src/lib/elm_gengrid.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 74 insertions(+)

diff --git a/src/lib/elm_gengrid.c b/src/lib/elm_gengrid.c
index 71cfed4..a7a3a14 100644
--- a/src/lib/elm_gengrid.c
+++ b/src/lib/elm_gengrid.c
@@ -1839,6 +1839,55 @@ _item_single_select_right(Elm_Gengrid_Data *sd)
    return EINA_TRUE;
 }
 
+static Eina_Bool
+_elm_gengrid_item_edge_check(Elm_Object_Item *it,
+                             Elm_Focus_Direction dir)
+{
+   ELM_GENGRID_DATA_GET(WIDGET(it), sd);
+   Evas_Coord ix = 0, iy = 0; //item's geometry
+   Evas_Coord cx = 0, cy = 0; //prev or next item's geometry
+   Elm_Object_Item *item = NULL;
+
+   evas_object_geometry_get(VIEW(it), &ix, &iy, NULL, NULL);
+
+   if (((sd->horizontal) && (dir == ELM_FOCUS_UP)) ||
+       ((!sd->horizontal) && (dir == ELM_FOCUS_LEFT)))
+     {
+        item = elm_gengrid_item_prev_get(it);
+        while (item)
+          {
+             if (!elm_object_item_disabled_get(item)) break;
+             item = elm_gengrid_item_prev_get(item);
+          }
+        if (item)
+          {
+             evas_object_geometry_get(VIEW(item), &cx, &cy, NULL, NULL);
+             if (((sd->horizontal) && (ix == cx) && (iy > cy))||
+                 ((!sd->horizontal) && (iy == cy) && (ix > cx)))
+               return EINA_FALSE;
+          }
+     }
+   else if (((sd->horizontal) && (dir == ELM_FOCUS_DOWN)) ||
+            ((!sd->horizontal) && (dir == ELM_FOCUS_RIGHT)))
+     {
+        item = elm_gengrid_item_next_get(it);
+        while (item)
+          {
+             if (!elm_object_item_disabled_get(item)) break;
+             item = elm_gengrid_item_next_get(item);
+          }
+        if (item)
+          {
+             evas_object_geometry_get(VIEW(item), &cx, &cy, NULL, NULL);
+             if (((sd->horizontal) && (ix == cx) && (iy < cy)) ||
+                 ((!sd->horizontal) && (iy == cy) && (ix < cx)))
+               return EINA_FALSE;
+          }
+     }
+
+   return EINA_TRUE;
+}
+
 EOLIAN static Eina_Bool
 _elm_gengrid_elm_widget_event(Eo *obj, Elm_Gengrid_Data *sd, Evas_Object *src, 
Evas_Callback_Type type, void *event_info)
 {
@@ -1855,6 +1904,7 @@ _elm_gengrid_elm_widget_event(Eo *obj, Elm_Gengrid_Data 
*sd, Evas_Object *src, E
    Evas_Coord page_y = 0;
    Elm_Object_Item *it = NULL;
    Eina_Bool sel_ret = EINA_FALSE;
+   Eina_Bool edge_ret = EINA_FALSE;
 
    if (elm_widget_disabled_get(obj)) return EINA_FALSE;
    if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
@@ -1870,6 +1920,12 @@ _elm_gengrid_elm_widget_event(Eo *obj, Elm_Gengrid_Data 
*sd, Evas_Object *src, E
    if ((!strcmp(ev->key, "Left")) ||
        ((!strcmp(ev->key, "KP_Left")) && (!ev->string)))
      {
+        if (!sd->horizontal)
+          edge_ret = _elm_gengrid_item_edge_check(sd->focused_item,
+                                                  ELM_FOCUS_LEFT);
+        if (edge_ret)
+          return EINA_FALSE;
+
         if (sd->horizontal)
           {
              if (evas_key_modifier_is_set(ev->modifiers, "Shift"))
@@ -1896,6 +1952,12 @@ _elm_gengrid_elm_widget_event(Eo *obj, Elm_Gengrid_Data 
*sd, Evas_Object *src, E
    else if ((!strcmp(ev->key, "Right")) ||
             ((!strcmp(ev->key, "KP_Right")) && (!ev->string)))
      {
+        if (!sd->horizontal)
+          edge_ret = _elm_gengrid_item_edge_check(sd->focused_item,
+                                                  ELM_FOCUS_RIGHT);
+        if (edge_ret)
+          return EINA_FALSE;
+
         if (sd->horizontal)
           {
              if (evas_key_modifier_is_set(ev->modifiers, "Shift"))
@@ -1923,6 +1985,12 @@ _elm_gengrid_elm_widget_event(Eo *obj, Elm_Gengrid_Data 
*sd, Evas_Object *src, E
             ((!strcmp(ev->key, "KP_Up")) && (!ev->string)))
      {
         if (sd->horizontal)
+          edge_ret = _elm_gengrid_item_edge_check(sd->focused_item,
+                                                  ELM_FOCUS_UP);
+        if (edge_ret)
+          return EINA_FALSE;
+
+        if (sd->horizontal)
           {
              if (evas_key_modifier_is_set(ev->modifiers, "Shift"))
                sel_ret = _item_multi_select_left(sd);
@@ -1949,6 +2017,12 @@ _elm_gengrid_elm_widget_event(Eo *obj, Elm_Gengrid_Data 
*sd, Evas_Object *src, E
             ((!strcmp(ev->key, "KP_Down")) && (!ev->string)))
      {
         if (sd->horizontal)
+          edge_ret = _elm_gengrid_item_edge_check(sd->focused_item,
+                                                  ELM_FOCUS_DOWN);
+        if (edge_ret)
+          return EINA_FALSE;
+
+        if (sd->horizontal)
           {
              if (evas_key_modifier_is_set(ev->modifiers, "Shift"))
                sel_ret = _item_multi_select_right(sd);

-- 


Reply via email to