raster pushed a commit to branch master.

http://git.enlightenment.org/core/elementary.git/commit/?id=2ac2628612060114cf6e5205e5331044221178c6

commit 2ac2628612060114cf6e5205e5331044221178c6
Author: Carsten Haitzler (Rasterman) <[email protected]>
Date:   Fri Feb 13 13:14:07 2015 +0900

    elm scroller - add adnimated and accelerated wheel scroll
    
    now when a whele event comes in, 1. the amount we scroll accelerates
    based on time between wheel events (the faster wheel events come out,
    the more accel), and 2. we animate to the new position providing a
    smooth transition to the new spot rather than a jump. very visually
    nice.
    
    @feature
---
 src/lib/elm_interface_scrollable.c | 33 ++++++++++++++++++++++++---------
 src/lib/elm_interface_scrollable.h |  2 ++
 2 files changed, 26 insertions(+), 9 deletions(-)

diff --git a/src/lib/elm_interface_scrollable.c 
b/src/lib/elm_interface_scrollable.c
index d1b818a..e510ac1 100644
--- a/src/lib/elm_interface_scrollable.c
+++ b/src/lib/elm_interface_scrollable.c
@@ -1817,6 +1817,7 @@ _elm_scroll_wheel_event_cb(void *data,
    Evas_Coord x = 0, y = 0, vw = 0, vh = 0, cw = 0, ch = 0;
    int direction = 0;
    int pagenumber_h = 0, pagenumber_v = 0;
+   int mx = 0, my = 0, minx = 0, miny = 0;
 
    sid = data;
    ev = event_info;
@@ -1835,6 +1836,15 @@ _elm_scroll_wheel_event_cb(void *data,
    else if (evas_key_modifier_is_set(ev->modifiers, "Shift"))
      direction = !direction;
    eo_do(sid->obj, elm_interface_scrollable_content_pos_get(&x, &y));
+   if (sid->scrollto.x.animator) x = sid->scrollto.x.end;
+   if (sid->scrollto.y.animator) y = sid->scrollto.y.end;
+   eo_do(sid->pan_obj, elm_obj_pan_pos_max_get(&mx, &my));
+   eo_do(sid->pan_obj, elm_obj_pan_pos_min_get(&minx, &miny));
+   if (x < minx) x = minx;
+   if (x > mx) x = mx;
+   if (y < miny) y = miny;
+   if (y > my) y = my;
+
    if ((sid->down.bounce_x_animator) || (sid->down.bounce_y_animator) ||
        (sid->scrollto.x.animator) || (sid->scrollto.y.animator))
      {
@@ -1862,25 +1872,29 @@ _elm_scroll_wheel_event_cb(void *data,
      eo_do(sid->pan_obj, elm_obj_pan_content_size_get(&cw, &ch));
    if (!_paging_is_enabled(sid))
      {
+        int d = ev->z;
+        double delta_t = (double)(ev->timestamp - sid->last_wheel) / 1000.0;
+        double mul;
+
+        mul = 1.0 + (7.0 * ((0.2 - delta_t) / 0.2));
+        if (delta_t < 0.2) d *= mul;
+        sid->last_wheel = ev->timestamp;
         if (!direction)
           {
-             if (ch > vh || cw <= vw)
-               y += ev->z * sid->step.y;
-             else
-               x += ev->z * sid->step.x;
+             if ((ch > vh) || (cw <= vw)) y += d * sid->step.y;
+             else x += d * sid->step.x;
           }
         else if (direction == 1)
           {
-             if (cw > vw || ch <= vh)
-               x += ev->z * sid->step.x;
-             else
-               y += ev->z * sid->step.y;
+             if ((cw > vw) || (ch <= vh)) x += d * sid->step.x;
+             else y += d * sid->step.y;
           }
 
         if ((!sid->hold) && (!sid->freeze))
           {
              _elm_scroll_wanted_coordinates_update(sid, x, y);
-             eo_do(sid->obj, elm_interface_scrollable_content_pos_set(x, y, 
EINA_TRUE));
+             _elm_scroll_scroll_to_x(sid, 
_elm_config->bring_in_scroll_friction, x);
+             _elm_scroll_scroll_to_y(sid, 
_elm_config->bring_in_scroll_friction, y);
           }
      }
    else
@@ -1903,6 +1917,7 @@ _elm_scroll_wheel_event_cb(void *data,
 
         if ((!sid->hold) && (!sid->freeze))
           {
+             _elm_scroll_wanted_coordinates_update(sid, x, y);
              _elm_scroll_scroll_to_x(sid, 
_elm_config->bring_in_scroll_friction, x);
              _elm_scroll_scroll_to_y(sid, 
_elm_config->bring_in_scroll_friction, y);
           }
diff --git a/src/lib/elm_interface_scrollable.h 
b/src/lib/elm_interface_scrollable.h
index 25f50a1..5ae8947 100644
--- a/src/lib/elm_interface_scrollable.h
+++ b/src/lib/elm_interface_scrollable.h
@@ -185,6 +185,8 @@ struct _Elm_Scrollable_Smart_Interface_Data
    int        page_limit_h, page_limit_v;
    int        current_calc;
 
+   unsigned int last_wheel;
+
    unsigned char size_adjust_recurse;
    unsigned char size_count;
    Eina_Bool  size_adjust_recurse_abort : 1;

-- 


Reply via email to