From 105ee3660d9b3c485b07acf9330b7de3b5d01a52 Mon Sep 17 00:00:00 2001 From: Hosang Kim Date: Tue, 22 Jul 2014 15:11:17 +0900 Subject: [PATCH] genlist : Add item looping on flag. 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 --- legacy/elementary/src/lib/elm_genlist.c | 22 ++++++++-- legacy/elementary/src/lib/elm_list.c | 40 ++++++++++++++++--- .../elementary/src/lib/elm_widget_genlist.h | 1 + legacy/elementary/src/lib/elm_widget_list.h | 1 + 4 files changed, 56 insertions(+), 8 deletions(-) diff --git a/legacy/elementary/src/lib/elm_genlist.c b/legacy/elementary/src/lib/elm_genlist.c index 7857d37d05..e874dc7cdf 100644 --- a/legacy/elementary/src/lib/elm_genlist.c +++ b/legacy/elementary/src/lib/elm_genlist.c @@ -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; } diff --git a/legacy/elementary/src/lib/elm_list.c b/legacy/elementary/src/lib/elm_list.c index fa9c03acd7..bf20b911f9 100644 --- a/legacy/elementary/src/lib/elm_list.c +++ b/legacy/elementary/src/lib/elm_list.c @@ -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 diff --git a/legacy/elementary/src/lib/elm_widget_genlist.h b/legacy/elementary/src/lib/elm_widget_genlist.h index ab0945bbf9..098914ee14 100644 --- a/legacy/elementary/src/lib/elm_widget_genlist.h +++ b/legacy/elementary/src/lib/elm_widget_genlist.h @@ -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; diff --git a/legacy/elementary/src/lib/elm_widget_list.h b/legacy/elementary/src/lib/elm_widget_list.h index 0ee0d87915..51d14e68f5 100644 --- a/legacy/elementary/src/lib/elm_widget_list.h +++ b/legacy/elementary/src/lib/elm_widget_list.h @@ -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;