Enlightenment CVS committal

Author  : raster
Project : e17
Module  : libs/etk

Dir     : e17/libs/etk/src/lib


Modified Files:
        etk_scrolled_view.c etk_scrolled_view.h etk_viewport.c 


Log Message:


the black art of checking momentum - if its a "flick" of the mouse/finger and
keep momentum going, or it's a stp or an input device jitter/variation

===================================================================
RCS file: /cvs/e/e17/libs/etk/src/lib/etk_scrolled_view.c,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -3 -r1.41 -r1.42
--- etk_scrolled_view.c 8 Jul 2008 13:03:32 -0000       1.41
+++ etk_scrolled_view.c 10 Jul 2008 20:35:16 -0000      1.42
@@ -333,6 +333,7 @@
    scrolled_view->drag.bar_pressed = ETK_FALSE;
    scrolled_view->drag.dragable    = ETK_FALSE;
    scrolled_view->drag.bouncy      = ETK_TRUE;
+   scrolled_view->drag.damping_magic = ETK_SCROLLED_VIEW_DRAG_DAMPING_MAGIC;
 
    // FIXME This can be put in etk_config (Make whole system be configured)
    etk_scrolled_view_drag_sample_interval_set(scrolled_view, 
ETK_SCROLLED_VIEW_DRAG_SAMPLE_INTERVAL_MAGIC);
@@ -596,6 +597,7 @@
    double delta_V;
    double delta_x;
    double delta_y;
+   
    if (!scrolled_view) 
       return 0;
    drag = &scrolled_view->drag;
@@ -606,7 +608,7 @@
    delta_time = ecore_time_get() - drag->timestamp;
    delta_V = delta_time * (drag->damping_magic + abs(drag->Vx)+ abs(drag->Vy)) 
/ 2;
    delta_time = delta_time < 0.01 ? 0.01 : delta_time;
-
+   
    if (drag->Vx < delta_V && drag->Vx > -delta_V) 
    {
       delta_x = 0;
@@ -715,13 +717,18 @@
 
    if (!drag->mouse_down && event->button) 
    {
+      int i;
+      
       vscrollbar_range = ETK_RANGE(scrolled_view->vscrollbar);
       hscrollbar_range = ETK_RANGE(scrolled_view->hscrollbar);
       drag->mouse_down = ETK_TRUE;
+      for (i = 0; i < 5; i++) drag->prev_position_timestamp[i] = 0.0;
       drag->timestamp = ecore_time_get(); 
       drag->old_timestamp = 0.0;
       drag->Vx = 0;
       drag->Vy = 0;
+      drag->position.x = -1;
+      drag->position.y = -1;
       drag->down_position = drag->position = event->widget;
       drag->bar_position.x = hscrollbar_range->value;
       drag->bar_position.y = vscrollbar_range->value;
@@ -736,9 +743,10 @@
    Etk_Scrolled_View *scrolled_view;
    Etk_Range *vscrollbar_range;
    Etk_Range *hscrollbar_range;
-   double delta_time;
+   double delta_time, t;
    struct Etk_Scrolled_View_Mouse_Drag *drag = (struct 
Etk_Scrolled_View_Mouse_Drag *) data;
-
+   int i;
+   
    if (!(scrolled_view = ETK_SCROLLED_VIEW(object)))
       return ETK_FALSE;
 
@@ -760,6 +768,9 @@
 
    if (drag->scroll_flag) 
    {
+      if ((drag->position.x == event->cur.widget.x) &&
+         (drag->position.y == event->cur.widget.y))
+       return ETK_TRUE;
       /* if we have dragged beyond 15 pixels from the down point, in any
        * direction, set on hold flag */
       if ((((event->cur.widget.x - drag->down_position.x) *
@@ -775,12 +786,23 @@
          etk_range_value_set(vscrollbar_range, vscrollbar_range->value - 
(event->cur.widget.y - drag->position.y));
          etk_range_value_set(hscrollbar_range, hscrollbar_range->value - 
(event->cur.widget.x - drag->position.x));
       }
+      t = ecore_time_get();
+      /* record the last 5 mouse moves and timestamps */
+      for (i = 5; i >= 1; i--)
+       {
+          drag->prev_position[i] = drag->prev_position[i - 1];
+          drag->prev_position_timestamp[i] = drag->prev_position_timestamp[i - 
1];
+       }
+      drag->prev_position_timestamp[0] = drag->position_timestamp;
+      drag->prev_position[0] = drag->position;
+      
+      drag->position_timestamp = t;
       drag->position = event->cur.widget;
       delta_time = ecore_time_get() - drag->timestamp;
       // in case delta_time is zero
       delta_time = delta_time == 0.0f ? drag->sample_magic : delta_time;
 
-      if (delta_time > drag->sample_magic || drag->old_timestamp == 0) 
+      if ((delta_time > drag->sample_magic) || (drag->old_timestamp == 0.0)) 
       {
          drag->old_timestamp = drag->timestamp;
          drag->timestamp = ecore_time_get();
@@ -821,8 +843,41 @@
 
    if (drag->scroll_flag) 
    {
-      drag->timestamp = ecore_time_get();
       int max_speed = ETK_SCROLLED_VIEW_DRAG_DAMPING_MAGIC*5;
+      int i, idelt;
+      double tlast, tdelt;
+      Etk_Position lastpos;
+      
+      drag->old_timestamp = drag->timestamp;
+      drag->timestamp = ecore_time_get();
+      
+      /* now check to see the final mouse move was not > 4 times the time
+       * between other moves (like a stop at the end - an aberration),
+       * and check to see over the past 5 moves or 0.2 seconds - whichever
+       * is "less", what the total movement is - if its more than 20
+       * pixels - then have momentum */
+      tlast = drag->position_timestamp - 0.2;
+      lastpos = drag->position;
+      
+      tdelt = drag->position_timestamp;
+      idelt = 0;
+      for (i = 0; i < 5; i++)
+       {
+          if (drag->prev_position_timestamp[i] >= tlast)
+            {
+               lastpos = drag->prev_position[i];
+               tdelt = drag->prev_position_timestamp[i];
+               idelt++;
+            }
+       }
+      if (idelt < 1)
+       return ETK_FALSE;
+      if ((tdelt / idelt) * 4 < (drag->position_timestamp - 
drag->prev_position_timestamp[0]))
+       return ETK_FALSE;
+      if ((((drag->position.x - lastpos.x) * (drag->position.x - lastpos.x)) +
+          ((drag->position.y - lastpos.y) * (drag->position.y - lastpos.y)))
+         <= (20 * 20))
+       return ETK_FALSE;
       drag->Vx = drag->Vx > 0 ?  
          drag->Vx > max_speed ?  max_speed : drag->Vx : 
          drag->Vx < -max_speed ? -max_speed : drag->Vx;
@@ -830,7 +885,7 @@
          drag->Vy > max_speed ?  max_speed : drag->Vy : 
          drag->Vy < -max_speed ? -max_speed : drag->Vy;
 
-      ecore_animator_add(&_etk_scrolled_view_motive_bounce, scrolled_view);
+      ecore_animator_add(_etk_scrolled_view_motive_bounce, scrolled_view);
       return ETK_TRUE;
    }
    return ETK_FALSE;
===================================================================
RCS file: /cvs/e/e17/libs/etk/src/lib/etk_scrolled_view.h,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -3 -r1.15 -r1.16
--- etk_scrolled_view.h 30 Jun 2008 05:53:49 -0000      1.15
+++ etk_scrolled_view.h 10 Jul 2008 20:35:16 -0000      1.16
@@ -39,8 +39,11 @@
 struct Etk_Scrolled_View_Mouse_Drag 
 {
    Etk_Position position;
+   Etk_Position prev_position[5];
    Etk_Position down_position;
    Etk_Position bar_position;
+   double position_timestamp;
+   double prev_position_timestamp[5];
    double sample_magic;
    double timestamp;
    double old_timestamp;
===================================================================
RCS file: /cvs/e/e17/libs/etk/src/lib/etk_viewport.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -3 -r1.19 -r1.20
--- etk_viewport.c      30 Jun 2008 05:53:49 -0000      1.19
+++ etk_viewport.c      10 Jul 2008 20:35:16 -0000      1.20
@@ -216,7 +216,7 @@
 static void _etk_viewport_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, 
void *event_info)
 {
    Etk_Viewport *viewport;
-   Evas_Event_Mouse_Down *event;
+   Evas_Event_Mouse_Move *event;
    
    if (!(viewport = ETK_VIEWPORT(data)) || !(event = event_info))
       return;



-------------------------------------------------------------------------
Sponsored by: SourceForge.net Community Choice Awards: VOTE NOW!
Studies have shown that voting for your favorite open source project,
along with a healthy diet, reduces your potential for chronic lameness
and boredom. Vote Now at http://www.sourceforge.net/community/cca08
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to