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
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs