Sorry, but there is directional scrolling implemented. Why did you
duplicate it with a worse API (directional scrolling takes x,y as
direction parameters and may do diagonal). If it's broken or not
implemented it's better to fix it than to introduce something new.

Sent from my iPhone

On 05/08/2011, at 10:26, "Enlightenment SVN" <no-re...@enlightenment.org> wrote:

> Log:
> elementary : Focus movement is possible with arrow keys. You can check
>  this feature in elementary_test -> focus.
>
>
> Author:       woohyun
> Date:         2011-08-05 01:25:07 -0700 (Fri, 05 Aug 2011)
> New Revision: 62125
> Trac:         http://trac.enlightenment.org/e/changeset/62125
>
> Modified:
>  trunk/elementary/src/bin/test_focus.c 
> trunk/elementary/src/lib/Elementary.h.in 
> trunk/elementary/src/lib/elm_widget.c trunk/elementary/src/lib/elm_widget.h 
> trunk/elementary/src/lib/elm_win.c
>
> Modified: trunk/elementary/src/bin/test_focus.c
> ===================================================================
> --- trunk/elementary/src/bin/test_focus.c    2011-08-05 07:45:45 UTC (rev 
> 62124)
> +++ trunk/elementary/src/bin/test_focus.c    2011-08-05 08:25:07 UTC (rev 
> 62125)
> @@ -91,7 +91,8 @@
>           {
>              Evas_Object *lb = elm_label_add(win);
>              elm_object_text_set(lb,
> -                                 "<b>Use Tab and Shift+Tab</b>"
> +                                 "<b>Use Tab, Shift+Tab, and<br>"
> +                                 "Arrow Keys</b>"
>                                 );
>              evas_object_size_hint_weight_set(lb, 0.0, 0.0);
>              evas_object_size_hint_align_set(lb, EVAS_HINT_FILL,
>
> Modified: trunk/elementary/src/lib/Elementary.h.in
> ===================================================================
> --- trunk/elementary/src/lib/Elementary.h.in    2011-08-05 07:45:45 UTC (rev 
> 62124)
> +++ trunk/elementary/src/lib/Elementary.h.in    2011-08-05 08:25:07 UTC (rev 
> 62125)
> @@ -320,7 +320,11 @@
>    typedef enum _Elm_Focus_Direction
>      {
>         ELM_FOCUS_PREVIOUS,
> -        ELM_FOCUS_NEXT
> +        ELM_FOCUS_NEXT,
> +        ELM_FOCUS_UP,
> +        ELM_FOCUS_DOWN,
> +        ELM_FOCUS_LEFT,
> +        ELM_FOCUS_RIGHT
>      } Elm_Focus_Direction;
>
>    typedef enum _Elm_Text_Format
>
> Modified: trunk/elementary/src/lib/elm_widget.c
> ===================================================================
> --- trunk/elementary/src/lib/elm_widget.c    2011-08-05 07:45:45 UTC (rev 
> 62124)
> +++ trunk/elementary/src/lib/elm_widget.c    2011-08-05 08:25:07 UTC (rev 
> 62125)
> @@ -158,6 +158,10 @@
> static Evas_Object *_newest_focus_order_get(Evas_Object  *obj,
>                                             unsigned int *newest_focus_order,
>                                             Eina_Bool     can_focus_only);
> +static Eina_Bool _focus_list_direction_nearest_get(Evas_Object        *obj,
> +                                                Eina_List          *list,
> +                                                Elm_Focus_Direction dir,
> +                                                Evas_Object       **nearest);
>
> /* local subsystem globals */
> static Evas_Smart *_e_smart = NULL;
> @@ -399,6 +403,96 @@
>      }
> }
>
> +static Eina_Bool
> +_focus_list_direction_nearest_get(Evas_Object        *obj,
> +                                  Eina_List          *list,
> +                                  Elm_Focus_Direction dir,
> +                                  Evas_Object       **nearest)
> +{
> +   Evas_Object *cur, *next = NULL;
> +   Eina_List *l;
> +   double weight = 0.0;
> +   Evas_Coord x, y, w, h, cx, cy;
> +
> +   if (!nearest) return EINA_FALSE;
> +   *nearest =  NULL;
> +
> +   evas_object_geometry_get(obj, &x, &y, &w, &h);
> +   cx = x + (w / 2);
> +   cy = y + (h / 2);
> +
> +   EINA_LIST_FOREACH(list, l, cur)
> +     {
> +        if (obj == cur) continue;
> +        Evas_Coord cur_x, cur_y, cur_w, cur_h;
> +        int w_gap = 0, h_gap = 0;
> +        double cur_weight = 0.0;
> +
> +        evas_object_geometry_get(cur, &cur_x, &cur_y, &cur_w, &cur_h);
> +
> +        if (dir == ELM_FOCUS_LEFT)
> +          {
> +             if (x < (cur_x + cur_w)) continue;
> +             w_gap = x - (cur_x + cur_w);
> +             if ((cy >= cur_y) && (cy <= (cur_y + cur_h)))
> +               h_gap = 0;
> +             else if (cy > (cur_y + cur_h))
> +               h_gap = cy - (cur_y + cur_h);
> +             else if (cy < (cur_y))
> +               h_gap = cur_y - cy;
> +          }
> +        else if (dir == ELM_FOCUS_RIGHT)
> +          {
> +             if ((x + w) > cur_x) continue;
> +             w_gap = cur_x - (x + w);
> +             if ((cy >= cur_y) && (cy <= (cur_y + cur_h)))
> +               h_gap = 0;
> +             else if (cy > (cur_y + cur_h))
> +               h_gap = cy - (cur_y + cur_h);
> +             else if (cy < (cur_y))
> +               h_gap = cur_y - cy;
> +          }
> +        else if (dir == ELM_FOCUS_UP)
> +          {
> +             if (y < (cur_y + cur_h)) continue;
> +             h_gap = y - (cur_y + cur_h);
> +             if ((cx >= cur_x) && (cx <= (cur_x + cur_w)))
> +               w_gap = 0;
> +             else if (cx < cur_x)
> +               w_gap = cur_x - cx;
> +             else if (cx > (cur_x + cur_w))
> +               w_gap = cur_x + cur_w - cx;
> +          }
> +        else if (dir == ELM_FOCUS_DOWN)
> +          {
> +             if ((y + h) > cur_y) continue;
> +             h_gap = cur_y - (y + h);
> +             if ((cx >= cur_x) && (cx <= (cur_x + cur_w))) w_gap = 0;
> +             else if (cx < cur_x)
> +               w_gap = cur_x - cx;
> +             else if (cx > (cur_x + cur_w))
> +               w_gap = cur_x + cur_w - cx;
> +          }
> +        cur_weight = (w_gap * w_gap) + (h_gap * h_gap);
> +
> +        if (cur_weight == 0.0)
> +          {
> +             *nearest = cur;
> +             return EINA_TRUE;
> +          }
> +        cur_weight = 1.0 / cur_weight;
> +        if (cur_weight > weight)
> +          {
> +             weight = cur_weight;
> +             next = cur;
> +          }
> +     }
> +   if (!next) return EINA_FALSE;
> +   *nearest = next;
> +   return EINA_TRUE;
> +}
> +
> +
> /**
>  * @defgroup Widget Widget
>  *
> @@ -1147,6 +1241,47 @@
>    return sd->tree_unfocusable;
> }
>
> +/**
> + * @internal
> + *
> + * Get the list of focusable child objects.
> + *
> + * This function retruns list of child objects which can get focus.
> + *
> + * @param obj The parent widget
> + * @retrun list of focusable child objects.
> + *
> + * @ingroup Widget
> + */
> +EAPI Eina_List *
> +elm_widget_can_focus_child_list_get(const Evas_Object *obj)
> +{
> +   API_ENTRY return NULL;
> +
> +   const Eina_List *l;
> +   Eina_List *child_list = NULL;
> +   Evas_Object *child;
> +
> +   if (sd->subobjs)
> +     {
> +        EINA_LIST_FOREACH(sd->subobjs, l, child)
> +          {
> +             if ((elm_widget_can_focus_get(child)) &&
> +                 (evas_object_visible_get(child)) &&
> +                 (!elm_widget_disabled_get(child)))
> +               child_list = eina_list_append(child_list, child);
> +             else if (elm_widget_is(child))
> +               {
> +                  Eina_List *can_focus_list;
> +                  can_focus_list = 
> elm_widget_can_focus_child_list_get(child);
> +                  if (can_focus_list)
> +                    child_list = eina_list_merge(child_list, can_focus_list);
> +               }
> +          }
> +     }
> +   return child_list;
> +}
> +
> EAPI void
> elm_widget_highlight_ignore_set(Evas_Object *obj,
>                                 Eina_Bool    ignore)
> @@ -1598,7 +1733,7 @@
>                                Elm_Focus_Direction dir,
>                                Evas_Object       **next)
> {
> -   Eina_List *(*list_next)(const Eina_List * list);
> +   Eina_List *(*list_next)(const Eina_List * list) = NULL;
>
>    if (!next)
>      return EINA_FALSE;
> @@ -1617,64 +1752,110 @@
>         list_next = eina_list_prev;
>      }
>    else if (dir == ELM_FOCUS_NEXT)
> -     list_next = eina_list_next;
> +     {
> +        list_next = eina_list_next;
> +     }
> +   else if ((dir == ELM_FOCUS_LEFT) || (dir == ELM_FOCUS_RIGHT) ||
> +            (dir == ELM_FOCUS_UP) || (dir == ELM_FOCUS_DOWN))
> +     {
> +        list_next = eina_list_next;
> +     }
>    else
>      return EINA_FALSE;
>
> -   const Eina_List *l = items;
> +   if ((dir == ELM_FOCUS_PREVIOUS) || (dir == ELM_FOCUS_NEXT))
> +     {
> +        const Eina_List *l = items;
>
> -   /* Recovery last focused sub item */
> -   if (elm_widget_focus_get(obj))
> -     for (; l; l = list_next(l))
> -       {
> -          Evas_Object *cur = list_data_get(l);
> -          if (elm_widget_focus_get(cur)) break;
> -       }
> +        /* Recovery last focused sub item */
> +        if (elm_widget_focus_get(obj))
> +          for (; l; l = list_next(l))
> +            {
> +               Evas_Object *cur = list_data_get(l);
> +               if (elm_widget_focus_get(cur)) break;
> +            }
>
> -   const Eina_List *start = l;
> -   Evas_Object *to_focus = NULL;
> +        const Eina_List *start = l;
> +        Evas_Object *to_focus = NULL;
>
> -   /* Interate sub items */
> -   /* Go to end of list */
> -   for (; l; l = list_next(l))
> -     {
> -        Evas_Object *tmp = NULL;
> -        Evas_Object *cur = list_data_get(l);
> +        /* Interate sub items */
> +        /* Go to end of list */
> +        for (; l; l = list_next(l))
> +          {
> +             Evas_Object *tmp = NULL;
> +             Evas_Object *cur = list_data_get(l);
>
> -        if (elm_widget_parent_get(cur) != obj)
> -          continue;
> +             if (elm_widget_parent_get(cur) != obj)
> +               continue;
>
> -        /* Try Focus cycle in subitem */
> -        if (elm_widget_focus_next_get(cur, dir, &tmp))
> +             /* Try Focus cycle in subitem */
> +             if (elm_widget_focus_next_get(cur, dir, &tmp))
> +               {
> +                  *next = tmp;
> +                  return EINA_TRUE;
> +               }
> +             else if ((tmp) && (!to_focus))
> +               to_focus = tmp;
> +          }
> +
> +        l = items;
> +
> +        /* Get First possible */
> +        for (; l != start; l = list_next(l))
>           {
> -             *next = tmp;
> -             return EINA_TRUE;
> +             Evas_Object *tmp = NULL;
> +             Evas_Object *cur = list_data_get(l);
> +
> +             if (elm_widget_parent_get(cur) != obj)
> +               continue;
> +
> +             /* Try Focus cycle in subitem */
> +             elm_widget_focus_next_get(cur, dir, &tmp);
> +             if (tmp)
> +               {
> +                  *next = tmp;
> +                  return EINA_FALSE;
> +               }
>           }
> -        else if ((tmp) && (!to_focus))
> -          to_focus = tmp;
> +
> +        *next = to_focus;
> +        return EINA_FALSE;
>      }
> -
> -   l = items;
> -
> -   /* Get First possible */
> -   for (; l != start; l = list_next(l))
> +   else if ((dir == ELM_FOCUS_LEFT) || (dir == ELM_FOCUS_RIGHT) ||
> +            (dir == ELM_FOCUS_UP) || (dir == ELM_FOCUS_DOWN))
>      {
> +        Eina_List *can_focus_list;
>         Evas_Object *tmp = NULL;
> -        Evas_Object *cur = list_data_get(l);
> +        Evas_Object *cur;
>
> -        if (elm_widget_parent_get(cur) != obj)
> -          continue;
> -
> -        /* Try Focus cycle in subitem */
> -        elm_widget_focus_next_get(cur, dir, &tmp);
> -        if (tmp)
> +        can_focus_list = elm_widget_can_focus_child_list_get(obj);
> +        if (can_focus_list)
>           {
> -             *next = tmp;
> -             return EINA_FALSE;
> +             Eina_List *l;
> +             EINA_LIST_FOREACH(can_focus_list, l, cur)
> +               {
> +                  if (elm_widget_focus_get(cur))
> +                    {
> +                       if (_focus_list_direction_nearest_get(cur, 
> can_focus_list, dir, &tmp))
> +                         {
> +                            *next = tmp;
> +                            return EINA_TRUE;
> +                         }
> +                       else
> +                         {
> +                            *next = cur;
> +                            return EINA_FALSE;
> +                         }
> +                    }
> +               }
> +             if (elm_widget_focus_get(obj))
> +               {
> +                  *next = list_data_get(can_focus_list);
> +                  return EINA_FALSE;
> +               }
>           }
>      }
>
> -   *next = to_focus;
>    return EINA_FALSE;
> }
>
>
> Modified: trunk/elementary/src/lib/elm_widget.h
> ===================================================================
> --- trunk/elementary/src/lib/elm_widget.h    2011-08-05 07:45:45 UTC (rev 
> 62124)
> +++ trunk/elementary/src/lib/elm_widget.h    2011-08-05 08:25:07 UTC (rev 
> 62125)
> @@ -269,6 +269,7 @@
> EAPI void             elm_widget_can_focus_set(Evas_Object *obj, Eina_Bool 
> can_focus);
> EAPI Eina_Bool        elm_widget_can_focus_get(const Evas_Object *obj);
> EAPI Eina_Bool        elm_widget_child_can_focus_get(const Evas_Object *obj);
> +EAPI Eina_List       *elm_widget_can_focus_child_list_get(const Evas_Object 
> *obj);
> EAPI void             elm_widget_tree_unfocusable_set(Evas_Object *obj, 
> Eina_Bool tree_unfocusable);
> EAPI Eina_Bool        elm_widget_tree_unfocusable_get(const Evas_Object *obj);
> EAPI void             elm_widget_highlight_ignore_set(Evas_Object *obj, 
> Eina_Bool ignore);
>
> Modified: trunk/elementary/src/lib/elm_win.c
> ===================================================================
> --- trunk/elementary/src/lib/elm_win.c    2011-08-05 07:45:45 UTC (rev 62124)
> +++ trunk/elementary/src/lib/elm_win.c    2011-08-05 08:25:07 UTC (rev 62125)
> @@ -397,6 +397,34 @@
>              ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
>              return EINA_TRUE;
>           }
> +        else if ((!strcmp(ev->keyname, "Left")) ||
> +                 (!strcmp(ev->keyname, "KP_Left")))
> +          {
> +             elm_widget_focus_cycle(obj, ELM_FOCUS_LEFT);
> +             ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
> +             return EINA_TRUE;
> +          }
> +        else if ((!strcmp(ev->keyname, "Right")) ||
> +                 (!strcmp(ev->keyname, "KP_Right")))
> +          {
> +             elm_widget_focus_cycle(obj, ELM_FOCUS_RIGHT);
> +             ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
> +             return EINA_TRUE;
> +          }
> +        else if ((!strcmp(ev->keyname, "Up")) ||
> +                 (!strcmp(ev->keyname, "KP_Up")))
> +          {
> +             elm_widget_focus_cycle(obj, ELM_FOCUS_UP);
> +             ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
> +             return EINA_TRUE;
> +          }
> +        else if ((!strcmp(ev->keyname, "Down")) ||
> +                 (!strcmp(ev->keyname, "KP_Down")))
> +          {
> +             elm_widget_focus_cycle(obj, ELM_FOCUS_DOWN);
> +             ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
> +             return EINA_TRUE;
> +          }
>      }
>
>    return EINA_FALSE;
>
>
> ------------------------------------------------------------------------------
> BlackBerry&reg; DevCon Americas, Oct. 18-20, San Francisco, CA
> The must-attend event for mobile developers. Connect with experts.
> Get tools for creating Super Apps. See the latest technologies.
> Sessions, hands-on labs, demos & much more. Register early & save!
> http://p.sf.net/sfu/rim-blackberry-1
> _______________________________________________
> enlightenment-svn mailing list
> enlightenment-...@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/enlightenment-svn

------------------------------------------------------------------------------
BlackBerry&reg; DevCon Americas, Oct. 18-20, San Francisco, CA
The must-attend event for mobile developers. Connect with experts. 
Get tools for creating Super Apps. See the latest technologies.
Sessions, hands-on labs, demos & much more. Register early & save!
http://p.sf.net/sfu/rim-blackberry-1
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to