seoz pushed a commit to branch elementary-1.9. http://git.enlightenment.org/core/elementary.git/commit/?id=2f346109d72b5fd2f7e03c8efe94a50fa72c39c4
commit 2f346109d72b5fd2f7e03c8efe94a50fa72c39c4 Author: Daniel Juyung Seo <[email protected]> Date: Mon Mar 24 00:49:06 2014 +0900 genlist: Fixed item multi/single selection routine to skip disabled item correctly. @fix --- src/lib/elm_genlist.c | 56 ++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 42 insertions(+), 14 deletions(-) diff --git a/src/lib/elm_genlist.c b/src/lib/elm_genlist.c index ca933e1..6473e15 100644 --- a/src/lib/elm_genlist.c +++ b/src/lib/elm_genlist.c @@ -2321,6 +2321,14 @@ _item_multi_select_up(Elm_Genlist_Smart_Data *sd) if (!sd->multi) return EINA_FALSE; prev = elm_genlist_item_prev_get(sd->last_selected_item); + while (prev) + { + if ((((Elm_Gen_Item*)prev)->generation == sd->generation) && + (!elm_object_item_disabled_get(prev))) + break; + prev = (Elm_Object_Item *)ELM_GEN_ITEM_FROM_INLIST( + EINA_INLIST_GET((Elm_Gen_Item *)prev)->prev); + } if (!prev) return EINA_TRUE; if (elm_genlist_item_selected_get(prev)) @@ -2347,6 +2355,14 @@ _item_multi_select_down(Elm_Genlist_Smart_Data *sd) if (!sd->multi) return EINA_FALSE; next = elm_genlist_item_next_get(sd->last_selected_item); + while ((next)) + { + if ((((Elm_Gen_Item *)next)->generation == sd->generation) && + (!elm_object_item_disabled_get(next))) + break; + next = (Elm_Object_Item *)ELM_GEN_ITEM_FROM_INLIST( + EINA_INLIST_GET((Elm_Gen_Item *)next)->next); + } if (!next) return EINA_TRUE; if (elm_genlist_item_selected_get(next)) @@ -2385,18 +2401,24 @@ _all_items_deselect(Elm_Genlist_Smart_Data *sd) static Eina_Bool _item_single_select_up(Elm_Genlist_Smart_Data *sd) { - Elm_Gen_Item *prev; + Elm_Gen_Item *prev = NULL; if (!sd->selected) - { - prev = ELM_GEN_ITEM_FROM_INLIST(sd->items->last); - while ((prev) && (prev->generation < sd->generation)) - prev = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(prev)->prev); - } + prev = ELM_GEN_ITEM_FROM_INLIST(sd->items->last); else prev = (Elm_Gen_Item *)elm_genlist_item_prev_get - (sd->last_selected_item); + (sd->last_selected_item); + + printf("last %p prev %p\n", sd->last_selected_item, prev); + while (prev) + { + if ((prev->generation == sd->generation) && + (!elm_object_item_disabled_get((Elm_Object_Item *)prev))) + break; + prev = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(prev)->prev); + } + printf("prev %p\n", prev); if (!prev) return EINA_FALSE; _all_items_deselect(sd); @@ -2409,17 +2431,23 @@ _item_single_select_up(Elm_Genlist_Smart_Data *sd) static Eina_Bool _item_single_select_down(Elm_Genlist_Smart_Data *sd) { - Elm_Gen_Item *next; + Elm_Gen_Item *next = NULL; if (!sd->selected) + next = ELM_GEN_ITEM_FROM_INLIST(sd->items); + else { - next = ELM_GEN_ITEM_FROM_INLIST(sd->items); - while ((next) && (next->generation < sd->generation)) - next = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(next)->next); + next = (Elm_Gen_Item *)elm_genlist_item_next_get + (sd->last_selected_item); + } + + while ((next)) + { + if ((next->generation == sd->generation) && + (!elm_object_item_disabled_get((Elm_Object_Item *)next))) + break; + next = ELM_GEN_ITEM_FROM_INLIST(EINA_INLIST_GET(next)->next); } - else - next = (Elm_Gen_Item *)elm_genlist_item_next_get - (sd->last_selected_item); if (!next) return EINA_FALSE; --
