discomfitor pushed a commit to branch master. http://git.enlightenment.org/apps/empc.git/commit/?id=6e8e8af54e50b39160f47f66c2c3d6eb02af3991
commit 6e8e8af54e50b39160f47f66c2c3d6eb02af3991 Author: Mike Blumenkrantz <[email protected]> Date: Fri Dec 26 02:05:24 2014 -0500 hugely improve ctrl+scrolling speed in empc --- src/bin/empc.c | 84 +++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 66 insertions(+), 18 deletions(-) diff --git a/src/bin/empc.c b/src/bin/empc.c index 2d7ff36..7b50512 100644 --- a/src/bin/empc.c +++ b/src/bin/empc.c @@ -53,6 +53,7 @@ static Eina_Bool queue_list_state = EINA_FALSE; static Eina_Bool filesystem_state = EINA_FALSE; static Evas_Object *ctxpopup = NULL; EAPI Evas_Object *queue_list = NULL; +static Elm_Object_Item *queue_list_scroll_item = NULL; static Eina_List *queue_list_realized = NULL; static Eina_List *filesystems = NULL; static Eina_List *filesystems_realized = NULL; @@ -188,6 +189,48 @@ ee_image_copy(Evas_Object *obj, Evas_Object *o, int size) } } +static inline Elm_Object_Item * +queue_list_header_prev_get(Elm_Object_Item *it) +{ + Elm_Object_Item *pick; + + pick = elm_genlist_item_prev_get(it); + if (pick) + { + do + { + Elm_Object_Item *h = elm_genlist_item_parent_get(pick); + + if ((!h) && (pick != it)) return pick; + if (h != it) + return h; + pick = elm_genlist_item_prev_get(pick); + } while (pick); + } + return elm_genlist_item_parent_get(elm_genlist_first_item_get(queue_list)); +} + +static inline Elm_Object_Item * +queue_list_header_next_get(Elm_Object_Item *it) +{ + Elm_Object_Item *pick; + + pick = elm_genlist_item_next_get(it); + if (pick) + { + do + { + Elm_Object_Item *h = elm_genlist_item_parent_get(pick); + + if ((!h) && (pick != it)) return pick; + if (h != it) + return h; + pick = elm_genlist_item_next_get(pick); + } while (pick); + } + return elm_genlist_item_parent_get(elm_genlist_last_item_get(queue_list)); +} + static int queue_list_sort(Elm_Object_Item *a, Elm_Object_Item *b) { @@ -2314,6 +2357,12 @@ queue_list_double_click(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, vo empd_empdd_play_id_call(empd_proxy, so->songid); } +static void +queue_list_scroll_stop() +{ + queue_list_scroll_item = NULL; +} + static char * queue_list_header_text_get(Empd_Empdd_Song *so, Evas_Object *obj EINA_UNUSED, const char *part) { @@ -2462,6 +2511,8 @@ queue_list_item_del(Empd_Empdd_Song *so, Evas_Object *obj EINA_UNUSED) snprintf(buf, sizeof(buf), "%s:::%s", so->artist, so->album); //INF("DEL HEADER(%p): %s", itg, buf); eina_hash_list_remove(empd_current_queue_headers, buf, itg); + if (itg == queue_list_scroll_item) + queue_list_scroll_item = NULL; elm_object_item_del(itg); } } @@ -2842,6 +2893,17 @@ mouse_wheel(void *data EINA_UNUSED, int t EINA_UNUSED, Ecore_Event_Mouse_Wheel * Elm_Object_Item *it, *pit, *pick; int x, y, w; + if (queue_list_scroll_item) + { + if (ev->z < 0) //up + pick = queue_list_header_prev_get(queue_list_scroll_item); + else if (ev->z > 0) //down + pick = queue_list_header_next_get(queue_list_scroll_item); + elm_layout_signal_emit(layout, "empc,mouse,wheel", "empc"); + elm_genlist_item_bring_in(pick, ELM_GENLIST_ITEM_SCROLLTO_TOP); + queue_list_scroll_item = pick; + return ECORE_CALLBACK_CANCEL; + } elm_scroller_region_get(queue_list, NULL, NULL, &w, NULL); evas_object_geometry_get(queue_list, &x, &y, NULL, NULL); /* FIXME: this should actually calc the height of an item for y */ @@ -2854,16 +2916,7 @@ mouse_wheel(void *data EINA_UNUSED, int t EINA_UNUSED, Ecore_Event_Mouse_Wheel * { if (pit != it) pick = pit; else - { - pick = elm_genlist_item_prev_get(pit); - do - { - if (elm_genlist_item_parent_get(pick) != pit) break; - pick = elm_genlist_item_prev_get(pick); - } while (pick); - if (!pick) - pick = elm_genlist_first_item_get(queue_list); - } + pick = queue_list_header_prev_get(pit); } else if (ev->z > 0) { @@ -2874,18 +2927,12 @@ mouse_wheel(void *data EINA_UNUSED, int t EINA_UNUSED, Ecore_Event_Mouse_Wheel * pick = elm_genlist_item_parent_get(pick); } else - { - pick = elm_genlist_item_next_get(pit); - do - { - if (elm_genlist_item_parent_get(pick) != pit) break; - pick = elm_genlist_item_next_get(pick); - } while (pick); - } + pick = queue_list_header_next_get(pit); if (!pick) pick = elm_genlist_last_item_get(queue_list); } elm_genlist_item_bring_in(pick, ELM_GENLIST_ITEM_SCROLLTO_TOP); + queue_list_scroll_item = pick; elm_layout_signal_emit(layout, "empc,mouse,wheel", "empc"); return ECORE_CALLBACK_CANCEL; } @@ -3617,6 +3664,7 @@ main(int argc, char *argv[]) evas_object_smart_callback_add(o, "unrealized", queue_list_item_unrealize, NULL); evas_object_smart_callback_add(o, "unselected", queue_list_item_unselect, NULL); evas_object_smart_callback_add(o, "clicked,double", queue_list_double_click, NULL); + evas_object_smart_callback_add(o, "scroll,anim,stop", queue_list_scroll_stop, NULL); evas_object_event_callback_add(o, EVAS_CALLBACK_KEY_DOWN, queue_list_key_down, NULL); elm_genlist_multi_select_mode_set(o, ELM_OBJECT_MULTI_SELECT_MODE_DEFAULT); elm_genlist_homogeneous_set(o, EINA_TRUE); --
