genlist : Add item looping on flag.
authorHosang Kim <hosang12.kim@samsung.com>
Tue, 22 Jul 2014 06:11:17 +0000 (15:11 +0900)
committerCarsten Haitzler (Rasterman) <raster@rasterman.com>
Tue, 22 Jul 2014 06:11:18 +0000 (15:11 +0900)
Summary: When item looping feature is on and press up or down key, screen seems to be frozen.

Test Plan: elementary_test -to "genlist focus" -> click item looing enable -> move list up and down

Reviewers: anand.km, seoz, woohyun

Subscribers: singh.amitesh

Differential Revision: https://phab.enlightenment.org/D1193

src/lib/elm_genlist.c
src/lib/elm_list.c
src/lib/elm_widget_genlist.h
src/lib/elm_widget_list.h

index 7857d37..e874dc7 100644 (file)
@@ -2636,14 +2636,20 @@ _key_action_move_dir(Evas_Object *obj, Elm_Focus_Direction dir, Eina_Bool multi)
 
    focus_only = _elm_config->item_select_on_focus_disable && elm_widget_focus_highlight_enabled_get(obj);
    // handle item loop feature
-   if (sd->item_loop_enable)
+   if (sd->item_loop_enable && !sd->item_looping_on)
      {
         if (min > v)
           {
              if (dir == ELM_FOCUS_UP)
-               elm_layout_signal_emit(obj, "elm,action,looping,up", "elm");
+               {
+                  elm_layout_signal_emit(obj, "elm,action,looping,up", "elm");
+                  sd->item_looping_on = EINA_TRUE;
+               }
              else if (dir == ELM_FOCUS_DOWN)
-               elm_layout_signal_emit(obj, "elm,action,looping,down", "elm");
+               {
+                  elm_layout_signal_emit(obj, "elm,action,looping,down", "elm");
+                  sd->item_looping_on = EINA_TRUE;
+               }
           }
         else
           {
@@ -2659,6 +2665,8 @@ _key_action_move_dir(Evas_Object *obj, Elm_Focus_Direction dir, Eina_Bool multi)
           }
         return EINA_TRUE;
      }
+   else if (sd->item_looping_on)
+     return EINA_TRUE;
 
    return EINA_FALSE;
 }
@@ -5185,12 +5193,16 @@ _elm_genlist_looping_up_cb(void *data,
                           const char *source EINA_UNUSED)
 {
    Evas_Object *genlist = data;
+
+   ELM_GENLIST_DATA_GET(genlist, sd);
+
    Elm_Object_Item *it = elm_genlist_last_item_get(genlist);
    if (!_elm_config->item_select_on_focus_disable)
      elm_genlist_item_selected_set(it, EINA_TRUE);
    else
      elm_object_item_focus_set(it, EINA_TRUE);
    elm_layout_signal_emit(genlist, "elm,action,looping,up,end", "elm");
+   sd->item_looping_on = EINA_FALSE;
 }
 
 static void
@@ -5200,12 +5212,16 @@ _elm_genlist_looping_down_cb(void *data,
                           const char *source EINA_UNUSED)
 {
    Evas_Object *genlist = data;
+
+   ELM_GENLIST_DATA_GET(genlist, sd);
+
    Elm_Object_Item *it = elm_genlist_first_item_get(genlist);
    if (!_elm_config->item_select_on_focus_disable)
      elm_genlist_item_selected_set(it, EINA_TRUE);
    else
      elm_object_item_focus_set(it, EINA_TRUE);
    elm_layout_signal_emit(genlist, "elm,action,looping,down,end", "elm");
+   sd->item_looping_on = EINA_FALSE;
 }
 
 
index fa9c03a..bf20b91 100644 (file)
@@ -392,18 +392,30 @@ _elm_list_elm_widget_event_direction(Evas_Object *obj, Elm_Focus_Direction dir,
      return EINA_TRUE;
 
    // handle item loop feature
-   if (sd->item_loop_enable)
+   if (sd->item_loop_enable && !sd->item_looping_on)
      {
         if (min > v)
           {
              if (dir == ELM_FOCUS_LEFT)
-               elm_layout_signal_emit(obj, "elm,action,looping,left", "elm");
+               {
+                  elm_layout_signal_emit(obj, "elm,action,looping,left", "elm");
+                  sd->item_looping_on = EINA_TRUE;
+               }
              else if (dir == ELM_FOCUS_RIGHT)
-               elm_layout_signal_emit(obj, "elm,action,looping,right", "elm");
+               {
+                  elm_layout_signal_emit(obj, "elm,action,looping,right", "elm");
+                  sd->item_looping_on = EINA_TRUE;
+               }
              else if (dir == ELM_FOCUS_UP)
-               elm_layout_signal_emit(obj, "elm,action,looping,up", "elm");
+               {
+                  elm_layout_signal_emit(obj, "elm,action,looping,up", "elm");
+                  sd->item_looping_on = EINA_TRUE;
+               }
              else if (dir == ELM_FOCUS_DOWN)
-               elm_layout_signal_emit(obj, "elm,action,looping,down", "elm");
+               {
+                  elm_layout_signal_emit(obj, "elm,action,looping,down", "elm");
+                  sd->item_looping_on = EINA_TRUE;
+               }
           }
         else
           {
@@ -419,6 +431,8 @@ _elm_list_elm_widget_event_direction(Evas_Object *obj, Elm_Focus_Direction dir,
           }
         return EINA_TRUE;
      }
+   else if (sd->item_looping_on)
+     return EINA_TRUE;
 
    return EINA_FALSE;
 }
@@ -1719,12 +1733,16 @@ _elm_list_looping_left_cb(void *data,
                           const char *source EINA_UNUSED)
 {
    Evas_Object *list = data;
+
+   ELM_LIST_DATA_GET(list, sd);
+
    Elm_List_Item *it = (Elm_List_Item *)elm_list_last_item_get(list);
    if (!_elm_config->item_select_on_focus_disable)
      elm_list_item_selected_set((Elm_Object_Item *)it, EINA_TRUE);
    else
      elm_object_item_focus_set((Elm_Object_Item *)it, EINA_TRUE);
    elm_layout_signal_emit(list, "elm,action,looping,left,end", "elm");
+   sd->item_looping_on = EINA_FALSE;
 }
 
 static void
@@ -1734,12 +1752,16 @@ _elm_list_looping_right_cb(void *data,
                           const char *source EINA_UNUSED)
 {
    Evas_Object *list = data;
+
+   ELM_LIST_DATA_GET(list, sd);
+
    Elm_List_Item *it = (Elm_List_Item *)elm_list_first_item_get(list);
    if (!_elm_config->item_select_on_focus_disable)
      elm_list_item_selected_set((Elm_Object_Item *)it, EINA_TRUE);
    else
      elm_object_item_focus_set((Elm_Object_Item *)it, EINA_TRUE);
    elm_layout_signal_emit(list, "elm,action,looping,right,end", "elm");
+   sd->item_looping_on = EINA_FALSE;
 }
 
 static void
@@ -1749,12 +1771,16 @@ _elm_list_looping_up_cb(void *data,
                           const char *source EINA_UNUSED)
 {
    Evas_Object *list = data;
+
+   ELM_LIST_DATA_GET(list, sd);
+
    Elm_List_Item *it = (Elm_List_Item *)elm_list_last_item_get(list);
    if (!_elm_config->item_select_on_focus_disable)
      elm_list_item_selected_set((Elm_Object_Item *)it, EINA_TRUE);
    else
      elm_object_item_focus_set((Elm_Object_Item *)it, EINA_TRUE);
    elm_layout_signal_emit(list, "elm,action,looping,up,end", "elm");
+   sd->item_looping_on = EINA_FALSE;
 }
 
 static void
@@ -1764,12 +1790,16 @@ _elm_list_looping_down_cb(void *data,
                           const char *source EINA_UNUSED)
 {
    Evas_Object *list = data;
+
+   ELM_LIST_DATA_GET(list, sd);
+
    Elm_List_Item *it = (Elm_List_Item *)elm_list_first_item_get(list);
    if (!_elm_config->item_select_on_focus_disable)
      elm_list_item_selected_set((Elm_Object_Item *)it, EINA_TRUE);
    else
      elm_object_item_focus_set((Elm_Object_Item *)it, EINA_TRUE);
    elm_layout_signal_emit(list, "elm,action,looping,down,end", "elm");
+   sd->item_looping_on = EINA_FALSE;
 }
 
 static void
index ab0945b..098914e 100644 (file)
@@ -185,6 +185,7 @@ struct _Elm_Genlist_Data
    Eina_Bool                             swipe : 1;
    /**< value whether item loop feature is enabled or not. */
    Eina_Bool                             item_loop_enable : 1;
+   Eina_Bool                             item_looping_on : 1;
 };
 
 typedef struct _Item_Block Item_Block;
index 0ee0d87..51d14e6 100644 (file)
@@ -54,6 +54,7 @@ struct _Elm_List_Data
    Eina_Bool                             delete_me : 1;
    Eina_Bool                             mouse_down : 1; /**< a flag that mouse is down on the list at the moment. this flag is set to true on mouse and reset to false on mouse up */
    Eina_Bool                             item_loop_enable : 1; /**< value whether item loop feature is enabled or not. */
+   Eina_Bool                             item_looping_on : 1;
 };
 
 typedef struct _Elm_List_Item Elm_List_Item;