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);

-- 


Reply via email to