elm scroller - improve thumbscroll smoothness even more

this does even more smoothing of scrolling follow on from
939d8ef4c3c48120046560814db63858175a2d12
This commit is contained in:
Carsten Haitzler 2015-09-14 14:45:19 +09:00
parent 915ba802be
commit f9b154c5ed
1 changed files with 34 additions and 20 deletions

View File

@ -2959,54 +2959,56 @@ _elm_scroll_hold_enterer(void *data)
{
Elm_Scrollable_Smart_Interface_Data *sid = data;
Evas_Coord ox = 0, oy = 0, fx = 0, fy = 0;
// Evas_Coord fy2;
sid->down.hold_enterer = NULL;
fx = sid->down.hold_x;
fy = sid->down.hold_y;
// printf("%1.5f %i ",
// ecore_loop_time_get() - sid->down.dragged_began_timestamp,
// fy);
// fy2 = fy;
if ((_elm_config->scroll_smooth_amount > 0.0) &&
(_elm_config->scroll_smooth_time_window > 0.0))
{
int i, count = 0;
Evas_Coord basex = 0, basey = 0, x, y;
double dt, t, tdiff, tnow, twin;
double dt, tdiff, tnow, twin, ttot;
double xx, yy, tot;
struct
{
Evas_Coord x, y, dx, dy;
double t, dt;
} pos[60];
Evas_Coord x, y;
double t;
} pos[100];
tdiff = sid->down.hist.est_timestamp_diff;
tnow = ecore_loop_time_get();
t = tnow;
twin = _elm_config->scroll_smooth_time_window;
for (i = 0; i < 60; i++)
{
if ((sid->down.history[i].timestamp - tdiff) > tnow)
{
continue;
}
continue;
if ((sid->down.history[i].timestamp >
sid->down.dragged_began_timestamp) || (count == 0))
{
x = sid->down.history[i].x;
y = sid->down.history[i].y;
if (i == 0)
_elm_scroll_down_coord_eval(sid, &x, &y);
if (count == 0)
{
basex = x;
basey = y;
}
dt = t - sid->down.history[i].timestamp;
dt = (tnow + tdiff) - sid->down.history[i].timestamp;
if ((dt > twin) && (count > 0)) break;
_elm_scroll_down_coord_eval(sid, &x, &y);
pos[i].x = x - basex;
pos[i].y = y - basey;
pos[i].t = sid->down.history[0].timestamp - sid->down.history[i].timestamp;
if ((dt > 0.0) && (count == 0))
{
pos[count].x = x - basex;
pos[count].y = y - basey;
pos[count].t = 0.0;
count++;
}
pos[count].x = x - basex;
pos[count].y = y - basey;
pos[count].t = dt;
count++;
}
}
@ -3015,9 +3017,19 @@ _elm_scroll_hold_enterer(void *data)
xx = 0.0;
yy = 0.0;
tot = 0.0;
ttot = pos[count - 1].t;
for (i = 0; i < count; i++)
{
double wt = (twin - pos[i].t) / twin;
double wt;
if (ttot > 0.0)
{
if (i < (count - 1))
wt = (ttot - pos[i].t) * (pos[i + 1].t - pos[i].t);
else
wt = 0.0;
}
else wt = 1.0;
xx += ((double)(pos[i].x)) * wt;
yy += ((double)(pos[i].y)) * wt;
@ -3036,7 +3048,9 @@ _elm_scroll_hold_enterer(void *data)
}
}
}
// printf("%i\n", fy);
// printf("%1.5f %i %i\n",
// ecore_loop_time_get() - sid->down.dragged_began_timestamp,
// fy, fy2);
eo_do(sid->obj, elm_interface_scrollable_content_pos_get(&ox, &oy));
if (sid->down.dir_x)