| // Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'dart:ui' show Offset; |
| |
| import 'package:flutter/foundation.dart'; |
| |
| import 'velocity_tracker.dart'; |
| |
| /// Details object for callbacks that use [GestureDragDownCallback]. |
| /// |
| /// See also: |
| /// |
| /// * [DragGestureRecognizer.onDown], which uses [GestureDragDownCallback]. |
| /// * [DragStartDetails], the details for [GestureDragStartCallback]. |
| /// * [DragUpdateDetails], the details for [GestureDragUpdateCallback]. |
| /// * [DragEndDetails], the details for [GestureDragEndCallback]. |
| class DragDownDetails { |
| /// Creates details for a [GestureDragDownCallback]. |
| /// |
| /// The [globalPosition] argument must not be null. |
| DragDownDetails({ this.globalPosition: Offset.zero }) |
| : assert(globalPosition != null); |
| |
| /// The global position at which the pointer contacted the screen. |
| /// |
| /// Defaults to the origin if not specified in the constructor. |
| final Offset globalPosition; |
| |
| @override |
| String toString() => '$runtimeType($globalPosition)'; |
| } |
| |
| /// Signature for when a pointer has contacted the screen and might begin to |
| /// move. |
| /// |
| /// The `details` object provides the position of the touch. |
| /// |
| /// See [DragGestureRecognizer.onDown]. |
| typedef void GestureDragDownCallback(DragDownDetails details); |
| |
| /// Details object for callbacks that use [GestureDragStartCallback]. |
| /// |
| /// See also: |
| /// |
| /// * [DragGestureRecognizer.onStart], which uses [GestureDragStartCallback]. |
| /// * [DragDownDetails], the details for [GestureDragDownCallback]. |
| /// * [DragUpdateDetails], the details for [GestureDragUpdateCallback]. |
| /// * [DragEndDetails], the details for [GestureDragEndCallback]. |
| class DragStartDetails { |
| /// Creates details for a [GestureDragStartCallback]. |
| /// |
| /// The [globalPosition] argument must not be null. |
| DragStartDetails({ this.sourceTimeStamp, this.globalPosition: Offset.zero }) |
| : assert(globalPosition != null); |
| |
| /// Recorded timestamp of the source pointer event that triggered the drag |
| /// event. |
| /// |
| /// Could be null if triggered from proxied events such as accessibility. |
| final Duration sourceTimeStamp; |
| |
| /// The global position at which the pointer contacted the screen. |
| /// |
| /// Defaults to the origin if not specified in the constructor. |
| final Offset globalPosition; |
| |
| // TODO(ianh): Expose the current position, so that you can have a no-jump |
| // drag even when disambiguating (though of course it would lag the finger |
| // instead). |
| |
| @override |
| String toString() => '$runtimeType($globalPosition)'; |
| } |
| |
| /// Signature for when a pointer has contacted the screen and has begun to move. |
| /// |
| /// The `details` object provides the position of the touch when it first |
| /// touched the surface. |
| /// |
| /// See [DragGestureRecognizer.onStart]. |
| typedef void GestureDragStartCallback(DragStartDetails details); |
| |
| /// Details object for callbacks that use [GestureDragUpdateCallback]. |
| /// |
| /// See also: |
| /// |
| /// * [DragGestureRecognizer.onUpdate], which uses [GestureDragUpdateCallback]. |
| /// * [DragDownDetails], the details for [GestureDragDownCallback]. |
| /// * [DragStartDetails], the details for [GestureDragStartCallback]. |
| /// * [DragEndDetails], the details for [GestureDragEndCallback]. |
| class DragUpdateDetails { |
| /// Creates details for a [DragUpdateDetails]. |
| /// |
| /// The [delta] argument must not be null. |
| /// |
| /// If [primaryDelta] is non-null, then its value must match one of the |
| /// coordinates of [delta] and the other coordinate must be zero. |
| /// |
| /// The [globalPosition] argument must be provided and must not be null. |
| DragUpdateDetails({ |
| this.sourceTimeStamp, |
| this.delta: Offset.zero, |
| this.primaryDelta, |
| @required this.globalPosition |
| }) : assert(delta != null), |
| assert(primaryDelta == null |
| || (primaryDelta == delta.dx && delta.dy == 0.0) |
| || (primaryDelta == delta.dy && delta.dx == 0.0)); |
| |
| /// Recorded timestamp of the source pointer event that triggered the drag |
| /// event. |
| /// |
| /// Could be null if triggered from proxied events such as accessibility. |
| final Duration sourceTimeStamp; |
| |
| /// The amount the pointer has moved since the previous update. |
| /// |
| /// If the [GestureDragUpdateCallback] is for a one-dimensional drag (e.g., |
| /// a horizontal or vertical drag), then this offset contains only the delta |
| /// in that direction (i.e., the coordinate in the other direction is zero). |
| /// |
| /// Defaults to zero if not specified in the constructor. |
| final Offset delta; |
| |
| /// The amount the pointer has moved along the primary axis since the previous |
| /// update. |
| /// |
| /// If the [GestureDragUpdateCallback] is for a one-dimensional drag (e.g., |
| /// a horizontal or vertical drag), then this value contains the component of |
| /// [delta] along the primary axis (e.g., horizontal or vertical, |
| /// respectively). Otherwise, if the [GestureDragUpdateCallback] is for a |
| /// two-dimensional drag (e.g., a pan), then this value is null. |
| /// |
| /// Defaults to null if not specified in the constructor. |
| final double primaryDelta; |
| |
| /// The pointer's global position when it triggered this update. |
| final Offset globalPosition; |
| |
| @override |
| String toString() => '$runtimeType($delta)'; |
| } |
| |
| /// Signature for when a pointer that is in contact with the screen and moving |
| /// has moved again. |
| /// |
| /// The `details` object provides the position of the touch and the distance it |
| /// has travelled since the last update. |
| /// |
| /// See [DragGestureRecognizer.onUpdate]. |
| typedef void GestureDragUpdateCallback(DragUpdateDetails details); |
| |
| /// Details object for callbacks that use [GestureDragEndCallback]. |
| /// |
| /// See also: |
| /// |
| /// * [DragGestureRecognizer.onEnd], which uses [GestureDragEndCallback]. |
| /// * [DragDownDetails], the details for [GestureDragDownCallback]. |
| /// * [DragStartDetails], the details for [GestureDragStartCallback]. |
| /// * [DragUpdateDetails], the details for [GestureDragUpdateCallback]. |
| class DragEndDetails { |
| /// Creates details for a [GestureDragEndCallback]. |
| /// |
| /// The [velocity] argument must not be null. |
| DragEndDetails({ |
| this.velocity: Velocity.zero, |
| this.primaryVelocity, |
| }) : assert(velocity != null), |
| assert(primaryVelocity == null |
| || primaryVelocity == velocity.pixelsPerSecond.dx |
| || primaryVelocity == velocity.pixelsPerSecond.dy); |
| |
| /// The velocity the pointer was moving when it stopped contacting the screen. |
| /// |
| /// Defaults to zero if not specified in the constructor. |
| final Velocity velocity; |
| |
| /// The velocity the pointer was moving along the primary axis when it stopped |
| /// contacting the screen, in logical pixels per second. |
| /// |
| /// If the [GestureDragEndCallback] is for a one-dimensional drag (e.g., a |
| /// horizontal or vertical drag), then this value contains the component of |
| /// [velocity] along the primary axis (e.g., horizontal or vertical, |
| /// respectively). Otherwise, if the [GestureDragEndCallback] is for a |
| /// two-dimensional drag (e.g., a pan), then this value is null. |
| /// |
| /// Defaults to null if not specified in the constructor. |
| final double primaryVelocity; |
| |
| @override |
| String toString() => '$runtimeType($velocity)'; |
| } |