Commit 0585a44a authored by Adam Barth's avatar Adam Barth

Merge pull request #435 from abarth/event_duration

Convert PointerInputEvent to Duration for timestamp
parents e98ae242 7b2004b0
......@@ -8,14 +8,9 @@ export 'dart:ui' show Point;
/// Base class for input events.
class InputEvent {
const InputEvent({ this.type, this.timeStamp: 0.0 });
const InputEvent({ this.type, this.timeStamp: const Duration() });
final String type;
// TODO: Should timeStamp be a DateTime object instead of double?
// Some client code (e.g. drag.dart) does math on the time stamp.
final double timeStamp;
final Duration timeStamp;
}
/// Input event representing a touch or button.
......@@ -23,7 +18,7 @@ class PointerInputEvent extends InputEvent {
const PointerInputEvent({
String type,
double timeStamp: 0.0,
Duration timeStamp: const Duration(),
this.pointer: 0,
this.kind,
this.x: 0.0,
......
......@@ -16,7 +16,7 @@ class GestureVelocity {
class _Estimator {
int degree;
double time;
Duration time;
List<double> xCoefficients;
List<double> yCoefficients;
double confidence;
......@@ -32,7 +32,7 @@ class _Estimator {
}
abstract class _VelocityTrackerStrategy {
void addMovement(double timeStamp, double x, double y);
void addMovement(Duration timeStamp, double x, double y);
bool getEstimator(_Estimator estimator);
void clear();
}
......@@ -45,7 +45,7 @@ enum _Weighting {
}
class _Movement {
double eventTime = 0.0;
Duration eventTime = const Duration();
ui.Point position = ui.Point.origin;
}
......@@ -61,7 +61,7 @@ class _LeastSquaresVelocityTrackerStrategy extends _VelocityTrackerStrategy {
final List<_Movement> _movements;
int _index;
void addMovement(double timeStamp, double x, double y) {
void addMovement(Duration timeStamp, double x, double y) {
if (++_index == kHistorySize)
_index = 0;
_Movement movement = _getMovement(_index);
......@@ -81,7 +81,7 @@ class _LeastSquaresVelocityTrackerStrategy extends _VelocityTrackerStrategy {
do {
_Movement movement = _getMovement(index);
double age = newestMovement.eventTime - movement.eventTime;
double age = (newestMovement.eventTime - movement.eventTime).inMilliseconds.toDouble();
if (age > kHorizonMilliseconds)
break;
......@@ -143,8 +143,7 @@ class _LeastSquaresVelocityTrackerStrategy extends _VelocityTrackerStrategy {
return 1.0;
}
int nextIndex = (index + 1) % kHistorySize;
double deltaMilliseconds = _movements[nextIndex].eventTime -
_movements[index].eventTime;
int deltaMilliseconds = (_movements[nextIndex].eventTime - _movements[index].eventTime).inMilliseconds;
if (deltaMilliseconds < 0)
return 0.5;
if (deltaMilliseconds < 10)
......@@ -159,8 +158,7 @@ class _LeastSquaresVelocityTrackerStrategy extends _VelocityTrackerStrategy {
// age 10ms: 1.0
// age 50ms: 1.0
// age 60ms: 0.5
double ageMilliseconds = _movements[_index].eventTime -
_movements[index].eventTime;
int ageMilliseconds = (_movements[_index].eventTime - _movements[index].eventTime).inMilliseconds;
if (ageMilliseconds < 0)
return 0.5;
if (ageMilliseconds < 10)
......@@ -177,8 +175,7 @@ class _LeastSquaresVelocityTrackerStrategy extends _VelocityTrackerStrategy {
// age 0ms: 1.0
// age 50ms: 1.0
// age 100ms: 0.5
double ageMilliseconds = _movements[_index].eventTime -
_movements[index].eventTime;
int ageMilliseconds = (_movements[_index].eventTime - _movements[index].eventTime).inMilliseconds;
if (ageMilliseconds < 50) {
return 1.0;
}
......@@ -207,13 +204,13 @@ class _LeastSquaresVelocityTrackerStrategy extends _VelocityTrackerStrategy {
class VelocityTracker {
static const int kAssumePointerMoveStoppedTimeMs = 40;
VelocityTracker() : _lastTimeStamp = 0.0, _strategy = _createStrategy();
VelocityTracker() : _strategy = _createStrategy();
double _lastTimeStamp;
Duration _lastTimeStamp = const Duration();
_VelocityTrackerStrategy _strategy;
void addPosition(double timeStamp, double x, double y) {
if ((timeStamp - _lastTimeStamp) >= kAssumePointerMoveStoppedTimeMs)
void addPosition(Duration timeStamp, double x, double y) {
if ((timeStamp - _lastTimeStamp).inMilliseconds >= kAssumePointerMoveStoppedTimeMs)
_strategy.clear();
_lastTimeStamp = timeStamp;
_strategy.addMovement(timeStamp, x, y);
......
......@@ -90,7 +90,7 @@ class _PointerEventConverter {
return new PointerInputEvent(
type: eventType,
timeStamp: pointer.timeStamp.toDouble(),
timeStamp: new Duration(microseconds: pointer.timeStamp),
pointer: pointerIndex,
kind: _mapPointerKindToString(pointer.kind),
x: pointer.x,
......@@ -200,11 +200,12 @@ class FlutterBinding extends HitTestTarget {
/// Stops calling listener for every event that isn't localized to a given view coordinate
bool removeEventListener(EventListener listener) => _eventListeners.remove(listener);
// TODO(abarth): The engine should give us the timeStamp in Durations.
void _handleEvent(String eventType, double timeStamp) {
assert(eventType == 'back');
InputEvent ourEvent = new InputEvent(
type: eventType,
timeStamp: timeStamp
timeStamp: new Duration(microseconds: timeStamp.round())
);
for (EventListener listener in _eventListeners)
listener(ourEvent);
......
......@@ -11,7 +11,7 @@ class TestPointer {
bool isDown = false;
ui.Point location;
PointerInputEvent down(ui.Point newLocation, { double timeStamp: 0.0 }) {
PointerInputEvent down(ui.Point newLocation, { Duration timeStamp: const Duration() }) {
assert(!isDown);
isDown = true;
location = newLocation;
......@@ -24,7 +24,7 @@ class TestPointer {
);
}
PointerInputEvent move(ui.Point newLocation, { double timeStamp: 0.0 }) {
PointerInputEvent move(ui.Point newLocation, { Duration timeStamp: const Duration() }) {
assert(isDown);
ui.Offset delta = newLocation - location;
location = newLocation;
......@@ -39,7 +39,7 @@ class TestPointer {
);
}
PointerInputEvent up({ double timeStamp: 0.0 }) {
PointerInputEvent up({ Duration timeStamp: const Duration() }) {
assert(isDown);
isDown = false;
return new PointerInputEvent(
......@@ -51,7 +51,7 @@ class TestPointer {
);
}
PointerInputEvent cancel({ double timeStamp: 0.0 }) {
PointerInputEvent cancel({ Duration timeStamp: const Duration() }) {
assert(isDown);
isDown = false;
return new PointerInputEvent(
......
......@@ -24,7 +24,7 @@ List<PointerInputEvent> _eventFromMap(List<Map> intermediate) {
PointerInputEvent _eventFor(Map entry) {
PointerInputEvent result = new PointerInputEvent(
type: entry['type'],
timeStamp: entry['timeStamp'],
timeStamp: new Duration(milliseconds: entry['timeStamp'].round()),
pointer: entry['pointer'],
x: entry['x'],
y: entry['y']
......
......@@ -165,13 +165,13 @@ class WidgetTester {
final kMoveCount = 50; // Needs to be >= kHistorySize, see _LeastSquaresVelocityTrackerStrategy
final double timeStampDelta = 1000.0 * offset.distance / (kMoveCount * velocity);
double timeStamp = 0.0;
_dispatchEvent(p.down(startLocation, timeStamp: timeStamp), result);
_dispatchEvent(p.down(startLocation, timeStamp: new Duration(milliseconds: timeStamp.round())), result);
for(int i = 0; i < kMoveCount; i++) {
final Point location = startLocation + Offset.lerp(Offset.zero, offset, i / kMoveCount);
_dispatchEvent(p.move(location, timeStamp: timeStamp), result);
_dispatchEvent(p.move(location, timeStamp: new Duration(milliseconds: timeStamp.round())), result);
timeStamp += timeStampDelta;
}
_dispatchEvent(p.up(timeStamp: timeStamp), result);
_dispatchEvent(p.up(timeStamp: new Duration(milliseconds: timeStamp.round())), result);
}
void scroll(Element element, Offset offset, { int pointer: 1 }) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment