From 93fa4464ba475f7d5a7c3d95b86cf09fef027518 Mon Sep 17 00:00:00 2001 From: Jim Beveridge Date: Tue, 13 Oct 2015 13:53:05 -0700 Subject: [PATCH 01/13] Show new flutter tool and its use in the widgets dir. --- examples/README.md | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/examples/README.md b/examples/README.md index 7068ad2726..2078c3ab9c 100644 --- a/examples/README.md +++ b/examples/README.md @@ -2,15 +2,22 @@ Flutter Examples ================ This directory contains several examples of using Flutter. Each of these is an -individual Dart application package. If you wish to run them with `sky_tool` -then you will want to run `pub get` inside their directory before running -`./packages/sky/sky_tool start`. +individual Dart application package. -1. *Hello, world.* The [hello world app](hello_world) is a basic app that shows +To run a sample with the `flutter` tool, run `pub get` inside its directory, +then run `flutter start`. (See the +[getting started guide](https://flutter.github.io/getting-started/) to install +the `flutter` tool.) + +Available examples include: + +- *Hello, world.* The [hello world app](hello_world) is a basic app that shows the text "hello, world." -2. *Stocks.* The [stocks app](stocks) is an example of a typical mobile app +- *Stocks.* The [stocks app](stocks) is an example of a typical mobile app built using Flutter. The app shows a list of all the stocks in the NASDAQ. -3. *Widgets.* The [widgets app](widgets) contains a number of Flutter widgets so - you can experiment with them in a simple container. +- *Widgets.* The [widget apps](widgets) demonstrate a number of Flutter widgets + so you can experiment with them in a simple container. There is no main.dart + in this directory because each file is a standalone sample. To run a + particular file, use `flutter start -t filename.dart`. From ec205ac5c5fe357f896917baf815446291f96a16 Mon Sep 17 00:00:00 2001 From: Kris Giesing Date: Mon, 12 Oct 2015 16:14:53 -0700 Subject: [PATCH 02/13] Add dart-layer input event abstraction --- examples/mine_digger/lib/main.dart | 6 +- examples/rendering/sector_layout.dart | 4 +- examples/rendering/solid_color_box.dart | 5 +- examples/rendering/touch_demo.dart | 9 +- packages/flutter/lib/gestures.dart | 1 + packages/flutter/lib/src/gestures/drag.dart | 15 +-- packages/flutter/lib/src/gestures/events.dart | 114 ++++++++++++++++++ .../flutter/lib/src/gestures/long_press.dart | 5 +- .../lib/src/gestures/pointer_router.dart | 14 +-- .../flutter/lib/src/gestures/recognizer.dart | 17 +-- packages/flutter/lib/src/gestures/scale.dart | 5 +- .../flutter/lib/src/gestures/show_press.dart | 5 +- packages/flutter/lib/src/gestures/tap.dart | 5 +- .../flutter/lib/src/material/ink_well.dart | 2 +- .../lib/src/material/material_app.dart | 5 +- packages/flutter/lib/src/material/switch.dart | 5 +- .../flutter/lib/src/rendering/binding.dart | 19 +-- .../flutter/lib/src/rendering/hit_test.dart | 4 +- .../flutter/lib/src/rendering/object.dart | 3 +- .../flutter/lib/src/rendering/proxy_box.dart | 5 +- .../flutter/lib/src/rendering/toggleable.dart | 4 +- .../flutter/lib/src/widgets/drag_target.dart | 10 +- .../lib/src/widgets/gesture_detector.dart | 4 +- packages/unit/test/engine/mock_events.dart | 75 ++---------- .../unit/test/gestures/long_press_test.dart | 6 +- .../test/gestures/pointer_router_test.dart | 4 +- packages/unit/test/gestures/scale_test.dart | 24 ++-- packages/unit/test/gestures/scroll_test.dart | 6 +- .../unit/test/gestures/show_press_test.dart | 6 +- packages/unit/test/gestures/tap_test.dart | 6 +- packages/unit/test/widget/widget_tester.dart | 7 +- 31 files changed, 224 insertions(+), 176 deletions(-) create mode 100644 packages/flutter/lib/src/gestures/events.dart diff --git a/examples/mine_digger/lib/main.dart b/examples/mine_digger/lib/main.dart index 1fe6f7e0cc..588fa70779 100644 --- a/examples/mine_digger/lib/main.dart +++ b/examples/mine_digger/lib/main.dart @@ -1,9 +1,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'dart:ui' as ui; import 'dart:math'; +import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter/painting.dart'; import 'package:flutter/rendering.dart'; @@ -85,7 +85,7 @@ class MineDiggerState extends State { } PointerEventListener _pointerDownHandlerFor(int posX, int posY) { - return (ui.PointerEvent event) { + return (PointerInputEvent event) { if (event.buttons == 1) { probe(posX, posY); } else if (event.buttons == 2) { @@ -190,7 +190,7 @@ class MineDiggerState extends State { ); } - void handleToolbarPointerDown(ui.PointerEvent event) { + void handleToolbarPointerDown(PointerInputEvent event) { setState(() { resetGame(); }); diff --git a/examples/rendering/sector_layout.dart b/examples/rendering/sector_layout.dart index 912127ad0a..87d42c896b 100644 --- a/examples/rendering/sector_layout.dart +++ b/examples/rendering/sector_layout.dart @@ -3,9 +3,9 @@ // found in the LICENSE file. import 'dart:math' as math; -import 'dart:ui' as ui; import 'package:flutter/rendering.dart'; +import 'package:flutter/gestures.dart'; const double kTwoPi = 2 * math.PI; @@ -528,7 +528,7 @@ class RenderSolidColor extends RenderDecoratedSector { deltaTheta = constraints.constrainDeltaTheta(desiredDeltaTheta); } - void handleEvent(ui.Event event, HitTestEntry entry) { + void handleEvent(InputEvent event, HitTestEntry entry) { if (event.type == 'pointerdown') decoration = new BoxDecoration(backgroundColor: const Color(0xFFFF0000)); else if (event.type == 'pointerup') diff --git a/examples/rendering/solid_color_box.dart b/examples/rendering/solid_color_box.dart index acd6a6300f..31928d821c 100644 --- a/examples/rendering/solid_color_box.dart +++ b/examples/rendering/solid_color_box.dart @@ -2,9 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'dart:ui' as ui; - import 'package:flutter/rendering.dart'; +import 'package:flutter/gestures.dart'; class RenderSolidColorBox extends RenderDecoratedBox { final Size desiredSize; @@ -42,7 +41,7 @@ class RenderSolidColorBox extends RenderDecoratedBox { size = constraints.constrain(desiredSize); } - void handleEvent(ui.Event event, BoxHitTestEntry entry) { + void handleEvent(InputEvent event, BoxHitTestEntry entry) { if (event.type == 'pointerdown') decoration = new BoxDecoration(backgroundColor: const Color(0xFFFF0000)); else if (event.type == 'pointerup') diff --git a/examples/rendering/touch_demo.dart b/examples/rendering/touch_demo.dart index 5c22785110..024fd17d84 100644 --- a/examples/rendering/touch_demo.dart +++ b/examples/rendering/touch_demo.dart @@ -2,10 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'dart:ui' as ui; - import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; +import 'package:flutter/gestures.dart'; // Material design colors. :p List kColors = [ @@ -24,7 +23,7 @@ class Dot { Dot({ Color color }) : _paint = new Paint()..color = color; - void update(ui.PointerEvent event) { + void update(PointerInputEvent event) { position = new Point(event.x, event.y); radius = 5 + (95 * event.pressure); } @@ -39,8 +38,8 @@ class RenderTouchDemo extends RenderBox { RenderTouchDemo(); - void handleEvent(ui.Event event, BoxHitTestEntry entry) { - if (event is ui.PointerEvent) { + void handleEvent(InputEvent event, BoxHitTestEntry entry) { + if (event is PointerInputEvent) { switch (event.type) { case 'pointerdown': Color color = kColors[event.pointer.remainder(kColors.length)]; diff --git a/packages/flutter/lib/gestures.dart b/packages/flutter/lib/gestures.dart index 138cf554ca..f5432bc455 100644 --- a/packages/flutter/lib/gestures.dart +++ b/packages/flutter/lib/gestures.dart @@ -8,6 +8,7 @@ library gestures; export 'src/gestures/arena.dart'; export 'src/gestures/constants.dart'; export 'src/gestures/drag.dart'; +export 'src/gestures/events.dart'; export 'src/gestures/long_press.dart'; export 'src/gestures/pointer_router.dart'; export 'src/gestures/recognizer.dart'; diff --git a/packages/flutter/lib/src/gestures/drag.dart b/packages/flutter/lib/src/gestures/drag.dart index 473b410c0c..5a183d8263 100644 --- a/packages/flutter/lib/src/gestures/drag.dart +++ b/packages/flutter/lib/src/gestures/drag.dart @@ -7,6 +7,7 @@ import 'dart:ui' as ui; import 'arena.dart'; import 'recognizer.dart'; import 'constants.dart'; +import 'events.dart'; enum DragState { ready, @@ -24,7 +25,7 @@ typedef void GesturePanEndCallback(ui.Offset velocity); typedef void _GesturePolymorphicUpdateCallback(T delta); -int _eventTime(ui.PointerEvent event) => (event.timeStamp * 1000.0).toInt(); // microseconds +int _eventTime(PointerInputEvent event) => (event.timeStamp * 1000.0).toInt(); // microseconds bool _isFlingGesture(ui.GestureVelocity velocity) { double velocitySquared = velocity.x * velocity.x + velocity.y * velocity.y; @@ -45,12 +46,12 @@ abstract class _DragGestureRecognizer extends GestureRecogniz T _pendingDragDelta; T get _initialPendingDragDelta; - T _getDragDelta(ui.PointerEvent event); + T _getDragDelta(PointerInputEvent event); bool get _hasSufficientPendingDragDeltaToAccept; final ui.VelocityTracker _velocityTracker = new ui.VelocityTracker(); - void addPointer(ui.PointerEvent event) { + void addPointer(PointerInputEvent event) { startTrackingPointer(event.pointer); if (_state == DragState.ready) { _state = DragState.possible; @@ -58,7 +59,7 @@ abstract class _DragGestureRecognizer extends GestureRecogniz } } - void handleEvent(ui.PointerEvent event) { + void handleEvent(PointerInputEvent event) { assert(_state != DragState.ready); if (event.type == 'pointermove') { _velocityTracker.addPosition(_eventTime(event), event.pointer, event.x, event.y); @@ -120,7 +121,7 @@ class VerticalDragGestureRecognizer extends _DragGestureRecognizer { }) : super(router: router, onStart: onStart, onUpdate: onUpdate, onEnd: onEnd); double get _initialPendingDragDelta => 0.0; - double _getDragDelta(ui.PointerEvent event) => event.dy; + double _getDragDelta(PointerInputEvent event) => event.dy; bool get _hasSufficientPendingDragDeltaToAccept => _pendingDragDelta.abs() > kTouchSlop; } @@ -133,7 +134,7 @@ class HorizontalDragGestureRecognizer extends _DragGestureRecognizer { }) : super(router: router, onStart: onStart, onUpdate: onUpdate, onEnd: onEnd); double get _initialPendingDragDelta => 0.0; - double _getDragDelta(ui.PointerEvent event) => event.dx; + double _getDragDelta(PointerInputEvent event) => event.dx; bool get _hasSufficientPendingDragDeltaToAccept => _pendingDragDelta.abs() > kTouchSlop; } @@ -146,7 +147,7 @@ class PanGestureRecognizer extends _DragGestureRecognizer { }) : super(router: router, onStart: onStart, onUpdate: onUpdate, onEnd: onEnd); ui.Offset get _initialPendingDragDelta => ui.Offset.zero; - ui.Offset _getDragDelta(ui.PointerEvent event) => new ui.Offset(event.dx, event.dy); + ui.Offset _getDragDelta(PointerInputEvent event) => new ui.Offset(event.dx, event.dy); bool get _hasSufficientPendingDragDeltaToAccept { return _pendingDragDelta.distance > kPanSlop; } diff --git a/packages/flutter/lib/src/gestures/events.dart b/packages/flutter/lib/src/gestures/events.dart new file mode 100644 index 0000000000..664a519b52 --- /dev/null +++ b/packages/flutter/lib/src/gestures/events.dart @@ -0,0 +1,114 @@ +import 'dart:ui' as ui; + +/// Dart-layer version of ui.Event +class InputEvent { + + InputEvent({ this.type }) : timeStamp = 0.0; + + factory InputEvent.fromSkyEvent(ui.Event event) { + if (event is ui.PointerEvent) + return new PointerInputEvent.fromUiEvent(event); + + // Default event + InputEvent result = new InputEvent(); + result.type = event.type; + result.timeStamp = event.timeStamp; + } + + String type; + double timeStamp; +} + +/// Dart-layer version of ui.PointerInputEvent +class PointerInputEvent extends InputEvent { + + // Map actual input pointer value to a unique value + // Since events are serialized we can just use a counter + static Map _pointerMap = new Map(); + static int _pointerCount = 0; + + PointerInputEvent({ + String type, + this.pointer, + this.kind, + this.x, + this.y, + this.dx, + this.dy, + this.buttons, + this.down, + this.primary, + this.obscured, + this.pressure, + this.pressureMin, + this.pressureMax, + this.distance, + this.distanceMin, + this.distanceMax, + this.radiusMajor, + this.radiusMinor, + this.radiusMin, + this.radiusMax, + this.orientation, + this.tilt + }) : super(type: type); + + PointerInputEvent.fromUiEvent(ui.PointerEvent event) { + type = event.type; + timeStamp = event.timeStamp; + + if (type == 'pointerdown') { + pointer = _pointerCount; + _pointerMap[event.pointer] = _pointerCount; + _pointerCount++; + } else { + pointer = _pointerMap[event.pointer]; + } + + kind = event.kind; + x = event.x; + y = event.y; + dx = event.dx; + dy = event.dy; + buttons = event.buttons; + down = event.down; + primary = event.primary; + obscured = event.obscured; + pressure = event.pressure; + pressureMin = event.pressureMin; + pressureMax = event.pressureMax; + distance = event.distance; + distanceMin = event.distanceMin; + distanceMax = event.distanceMax; + radiusMajor = event.radiusMajor; + radiusMinor = event.radiusMinor; + radiusMin = event.radiusMin; + radiusMax = event.radiusMax; + orientation = event.orientation; + tilt = event.tilt; + + } + + int pointer; + String kind; + double x; + double y; + double dx; + double dy; + int buttons; + bool down; + bool primary; + bool obscured; + double pressure; + double pressureMin; + double pressureMax; + double distance; + double distanceMin; + double distanceMax; + double radiusMajor; + double radiusMinor; + double radiusMin; + double radiusMax; + double orientation; + double tilt; +} diff --git a/packages/flutter/lib/src/gestures/long_press.dart b/packages/flutter/lib/src/gestures/long_press.dart index 4dd278601b..2db0483772 100644 --- a/packages/flutter/lib/src/gestures/long_press.dart +++ b/packages/flutter/lib/src/gestures/long_press.dart @@ -2,10 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'dart:ui' as ui; - import 'arena.dart'; import 'constants.dart'; +import 'events.dart'; import 'pointer_router.dart'; import 'recognizer.dart'; @@ -22,7 +21,7 @@ class LongPressGestureRecognizer extends PrimaryPointerGestureRecognizer { onLongPress(); } - void handlePrimaryPointer(ui.PointerEvent event) { + void handlePrimaryPointer(PointerInputEvent event) { if (event.type == 'pointerup') resolve(GestureDisposition.rejected); } diff --git a/packages/flutter/lib/src/gestures/pointer_router.dart b/packages/flutter/lib/src/gestures/pointer_router.dart index d774bb1b5e..7af85a24c4 100644 --- a/packages/flutter/lib/src/gestures/pointer_router.dart +++ b/packages/flutter/lib/src/gestures/pointer_router.dart @@ -2,18 +2,18 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'dart:ui' as ui; +import 'package:flutter/src/gestures/events.dart'; -/// A callback that receives a [ui.PointerEvent] -typedef void PointerRoute(ui.PointerEvent event); +/// A callback that receives a [PointerInputEvent] +typedef void PointerRoute(PointerInputEvent event); -/// A routing table for [ui.PointerEvent] events. +/// A routing table for [PointerInputEvent] events. class PointerRouter { final Map> _routeMap = new Map>(); /// Adds a route to the routing table /// - /// Whenever this object routes a [ui.PointerEvent] corresponding to + /// Whenever this object routes a [PointerInputEvent] corresponding to /// pointer, call route. void addRoute(int pointer, PointerRoute route) { List routes = _routeMap.putIfAbsent(pointer, () => new List()); @@ -23,7 +23,7 @@ class PointerRouter { /// Removes a route from the routing table /// - /// No longer call route when routing a [ui.PointerEvent] corresponding to + /// No longer call route when routing a [PointerInputEvent] corresponding to /// pointer. Requires that this route was previously added to the router. void removeRoute(int pointer, PointerRoute route) { assert(_routeMap.containsKey(pointer)); @@ -37,7 +37,7 @@ class PointerRouter { /// Call the routes registed for this pointer event. /// /// Calls the routes in the order in which they were added to the route. - void route(ui.PointerEvent event) { + void route(PointerInputEvent event) { List routes = _routeMap[event.pointer]; if (routes == null) return; diff --git a/packages/flutter/lib/src/gestures/recognizer.dart b/packages/flutter/lib/src/gestures/recognizer.dart index 9adcb3d90a..93bc2d85be 100644 --- a/packages/flutter/lib/src/gestures/recognizer.dart +++ b/packages/flutter/lib/src/gestures/recognizer.dart @@ -7,6 +7,7 @@ import 'dart:ui' as ui; import 'arena.dart'; import 'constants.dart'; +import 'events.dart'; import 'pointer_router.dart'; export 'pointer_router.dart' show PointerRouter; @@ -22,9 +23,9 @@ abstract class GestureRecognizer extends GestureArenaMember { final Set _trackedPointers = new Set(); /// The primary entry point for users of this class. - void addPointer(ui.PointerEvent event); + void addPointer(PointerInputEvent event); - void handleEvent(ui.PointerEvent event); + void handleEvent(PointerInputEvent event); void acceptGesture(int pointer) { } void rejectGesture(int pointer) { } void didStopTrackingLastPointer(int pointer); @@ -58,7 +59,7 @@ abstract class GestureRecognizer extends GestureArenaMember { didStopTrackingLastPointer(pointer); } - void stopTrackingIfPointerNoLongerDown(ui.PointerEvent event) { + void stopTrackingIfPointerNoLongerDown(PointerInputEvent event) { if (event.type == 'pointerup' || event.type == 'pointercancel') stopTrackingPointer(event.pointer); } @@ -71,7 +72,7 @@ enum GestureRecognizerState { defunct } -ui.Point _getPoint(ui.PointerEvent event) { +ui.Point _getPoint(PointerInputEvent event) { return new ui.Point(event.x, event.y); } @@ -86,7 +87,7 @@ abstract class PrimaryPointerGestureRecognizer extends GestureRecognizer { ui.Point initialPosition; Timer _timer; - void addPointer(ui.PointerEvent event) { + void addPointer(PointerInputEvent event) { startTrackingPointer(event.pointer); if (state == GestureRecognizerState.ready) { state = GestureRecognizerState.possible; @@ -97,7 +98,7 @@ abstract class PrimaryPointerGestureRecognizer extends GestureRecognizer { } } - void handleEvent(ui.PointerEvent event) { + void handleEvent(PointerInputEvent event) { assert(state != GestureRecognizerState.ready); if (state == GestureRecognizerState.possible && event.pointer == primaryPointer) { // TODO(abarth): Maybe factor the slop handling out into a separate class? @@ -110,7 +111,7 @@ abstract class PrimaryPointerGestureRecognizer extends GestureRecognizer { } /// Override to provide behavior for the primary pointer when the gesture is still possible. - void handlePrimaryPointer(ui.PointerEvent event); + void handlePrimaryPointer(PointerInputEvent event); /// Override to be notified with [deadline] is exceeded. /// @@ -143,7 +144,7 @@ abstract class PrimaryPointerGestureRecognizer extends GestureRecognizer { } } - double _getDistance(ui.PointerEvent event) { + double _getDistance(PointerInputEvent event) { ui.Offset offset = _getPoint(event) - initialPosition; return offset.distance; } diff --git a/packages/flutter/lib/src/gestures/scale.dart b/packages/flutter/lib/src/gestures/scale.dart index 8898f6ec78..7e2f53a159 100644 --- a/packages/flutter/lib/src/gestures/scale.dart +++ b/packages/flutter/lib/src/gestures/scale.dart @@ -7,6 +7,7 @@ import 'dart:ui' as ui; import 'arena.dart'; import 'recognizer.dart'; import 'constants.dart'; +import 'events.dart'; enum ScaleState { ready, @@ -35,7 +36,7 @@ class ScaleGestureRecognizer extends GestureRecognizer { double get _scaleFactor => _initialSpan > 0.0 ? _currentSpan / _initialSpan : 1.0; - void addPointer(ui.PointerEvent event) { + void addPointer(PointerInputEvent event) { startTrackingPointer(event.pointer); if (_state == ScaleState.ready) { _state = ScaleState.possible; @@ -45,7 +46,7 @@ class ScaleGestureRecognizer extends GestureRecognizer { } } - void handleEvent(ui.PointerEvent event) { + void handleEvent(PointerInputEvent event) { assert(_state != ScaleState.ready); bool configChanged = false; switch(event.type) { diff --git a/packages/flutter/lib/src/gestures/show_press.dart b/packages/flutter/lib/src/gestures/show_press.dart index d3602c2f69..18ee1ca595 100644 --- a/packages/flutter/lib/src/gestures/show_press.dart +++ b/packages/flutter/lib/src/gestures/show_press.dart @@ -2,10 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'dart:ui' as ui; - import 'arena.dart'; import 'constants.dart'; +import 'events.dart'; import 'recognizer.dart'; typedef void GestureShowPressCallback(); @@ -23,7 +22,7 @@ class ShowPressGestureRecognizer extends PrimaryPointerGestureRecognizer { onShowPress(); } - void handlePrimaryPointer(ui.PointerEvent event) { + void handlePrimaryPointer(PointerInputEvent event) { if (event.type == 'pointerup') resolve(GestureDisposition.rejected); } diff --git a/packages/flutter/lib/src/gestures/tap.dart b/packages/flutter/lib/src/gestures/tap.dart index 5d028a842b..16ee90f081 100644 --- a/packages/flutter/lib/src/gestures/tap.dart +++ b/packages/flutter/lib/src/gestures/tap.dart @@ -2,9 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'dart:ui' as ui; - import 'arena.dart'; +import 'events.dart'; import 'recognizer.dart'; typedef void GestureTapCallback(); @@ -17,7 +16,7 @@ class TapGestureRecognizer extends PrimaryPointerGestureRecognizer { GestureTapCallback onTapDown; GestureTapCallback onTapCancel; - void handlePrimaryPointer(ui.PointerEvent event) { + void handlePrimaryPointer(PointerInputEvent event) { if (event.type == 'pointerdown') { if (onTapDown != null) onTapDown(); diff --git a/packages/flutter/lib/src/material/ink_well.dart b/packages/flutter/lib/src/material/ink_well.dart index 4780f7579d..161be19e5e 100644 --- a/packages/flutter/lib/src/material/ink_well.dart +++ b/packages/flutter/lib/src/material/ink_well.dart @@ -137,7 +137,7 @@ class _RenderInkWell extends RenderProxyBox { TapGestureRecognizer _tap; LongPressGestureRecognizer _longPress; - void handleEvent(ui.Event event, BoxHitTestEntry entry) { + void handleEvent(InputEvent event, BoxHitTestEntry entry) { if (event.type == 'pointerdown' && (_tap != null || _longPress != null)) { _tap?.addPointer(event); _longPress?.addPointer(event); diff --git a/packages/flutter/lib/src/material/material_app.dart b/packages/flutter/lib/src/material/material_app.dart index 06fa88f3cf..04b3087bd6 100644 --- a/packages/flutter/lib/src/material/material_app.dart +++ b/packages/flutter/lib/src/material/material_app.dart @@ -2,8 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'dart:ui' as ui; - +import 'package:flutter/gestures.dart'; import 'package:flutter/painting.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; @@ -56,7 +55,7 @@ class _MaterialAppState extends State { super.dispose(); } - void _backHandler(ui.Event event) { + void _backHandler(InputEvent event) { assert(mounted); if (event.type == 'back') { NavigatorState navigator = _navigator.currentState; diff --git a/packages/flutter/lib/src/material/switch.dart b/packages/flutter/lib/src/material/switch.dart index c5233fa2a3..9de1a2c203 100644 --- a/packages/flutter/lib/src/material/switch.dart +++ b/packages/flutter/lib/src/material/switch.dart @@ -6,6 +6,7 @@ import 'dart:async'; import 'dart:ui' as ui; import 'package:flutter/painting.dart'; +import 'package:flutter/gestures.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/widgets.dart'; @@ -82,8 +83,8 @@ class _RenderSwitch extends RenderToggleable { RadialReaction _radialReaction; - void handleEvent(ui.Event event, BoxHitTestEntry entry) { - if (event is ui.PointerEvent) { + void handleEvent(InputEvent event, BoxHitTestEntry entry) { + if (event is PointerInputEvent) { if (event.type == 'pointerdown') _showRadialReaction(entry.localPosition); else if (event.type == 'pointerup') diff --git a/packages/flutter/lib/src/rendering/binding.dart b/packages/flutter/lib/src/rendering/binding.dart index 7de8a4ebe7..f34caaa50a 100644 --- a/packages/flutter/lib/src/rendering/binding.dart +++ b/packages/flutter/lib/src/rendering/binding.dart @@ -29,7 +29,7 @@ class _PointerState { Point lastPosition; } -typedef void EventListener(ui.Event event); +typedef void EventListener(InputEvent event); /// A hit test entry used by [FlutterBinding] class BindingHitTestEntry extends HitTestEntry { @@ -95,11 +95,12 @@ class FlutterBinding extends HitTestTarget { bool removeEventListener(EventListener listener) => _eventListeners.remove(listener); void _handleEvent(ui.Event event) { - if (event is ui.PointerEvent) { - _handlePointerEvent(event); + InputEvent ourEvent = new InputEvent.fromSkyEvent(event); + if (ourEvent is PointerInputEvent) { + _handlePointerInputEvent(ourEvent); } else { for (EventListener listener in _eventListeners) - listener(event); + listener(ourEvent); } } @@ -111,7 +112,7 @@ class FlutterBinding extends HitTestTarget { /// to hit-test them on each movement. Map _stateForPointer = new Map(); - void _handlePointerEvent(ui.PointerEvent event) { + void _handlePointerInputEvent(PointerInputEvent event) { Point position = new Point(event.x, event.y); _PointerState state = _stateForPointer[event.pointer]; @@ -155,15 +156,15 @@ class FlutterBinding extends HitTestTarget { } /// Dispatch the given event to the path of the given hit test result - void dispatchEvent(ui.Event event, HitTestResult result) { + void dispatchEvent(InputEvent event, HitTestResult result) { assert(result != null); for (HitTestEntry entry in result.path) entry.target.handleEvent(event, entry); } - void handleEvent(ui.Event e, BindingHitTestEntry entry) { - if (e is ui.PointerEvent) { - ui.PointerEvent event = e; + void handleEvent(InputEvent e, BindingHitTestEntry entry) { + if (e is PointerInputEvent) { + PointerInputEvent event = e; pointerRouter.route(event); if (event.type == 'pointerdown') GestureArena.instance.close(event.pointer); diff --git a/packages/flutter/lib/src/rendering/hit_test.dart b/packages/flutter/lib/src/rendering/hit_test.dart index 6103624010..12396b1a13 100644 --- a/packages/flutter/lib/src/rendering/hit_test.dart +++ b/packages/flutter/lib/src/rendering/hit_test.dart @@ -2,12 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'dart:ui' as ui; +import 'package:flutter/gestures.dart'; /// An object that can handle events. abstract class HitTestTarget { /// Override this function to receive events. - void handleEvent(ui.Event event, HitTestEntry entry); + void handleEvent(InputEvent event, HitTestEntry entry); } /// Data collected during a hit test about a specific [HitTestTarget]. diff --git a/packages/flutter/lib/src/rendering/object.dart b/packages/flutter/lib/src/rendering/object.dart index 7b9c0a1b3d..94b6c3b687 100644 --- a/packages/flutter/lib/src/rendering/object.dart +++ b/packages/flutter/lib/src/rendering/object.dart @@ -7,6 +7,7 @@ import 'dart:ui' as ui; import 'dart:ui' show Point, Offset, Size, Rect, Color, Paint, Path; import 'package:flutter/animation.dart'; +import 'package:flutter/gestures.dart'; import 'package:vector_math/vector_math_64.dart'; import 'debug.dart'; @@ -1071,7 +1072,7 @@ abstract class RenderObject extends AbstractNode implements HitTestTarget { // EVENTS /// Override this function to handle events that hit this render object - void handleEvent(ui.Event event, HitTestEntry entry) { + void handleEvent(InputEvent event, HitTestEntry entry) { } diff --git a/packages/flutter/lib/src/rendering/proxy_box.dart b/packages/flutter/lib/src/rendering/proxy_box.dart index 6bb775f7ce..02619505cc 100644 --- a/packages/flutter/lib/src/rendering/proxy_box.dart +++ b/packages/flutter/lib/src/rendering/proxy_box.dart @@ -5,6 +5,7 @@ import 'dart:ui' as ui; import 'package:flutter/painting.dart'; +import 'package:flutter/gestures.dart'; import 'package:vector_math/vector_math_64.dart'; import 'box.dart'; @@ -1054,7 +1055,7 @@ class RenderCustomPaint extends RenderProxyBox { } } -typedef void PointerEventListener(ui.PointerEvent e); +typedef void PointerEventListener(PointerInputEvent e); /// Invokes the callbacks in response to pointer events. class RenderPointerListener extends RenderProxyBox { @@ -1071,7 +1072,7 @@ class RenderPointerListener extends RenderProxyBox { PointerEventListener onPointerUp; PointerEventListener onPointerCancel; - void handleEvent(ui.Event event, HitTestEntry entry) { + void handleEvent(InputEvent event, HitTestEntry entry) { if (onPointerDown != null && event.type == 'pointerdown') return onPointerDown(event); if (onPointerMove != null && event.type == 'pointermove') diff --git a/packages/flutter/lib/src/rendering/toggleable.dart b/packages/flutter/lib/src/rendering/toggleable.dart index 959eba22cd..f6e7879993 100644 --- a/packages/flutter/lib/src/rendering/toggleable.dart +++ b/packages/flutter/lib/src/rendering/toggleable.dart @@ -2,8 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'dart:ui' as ui; - import 'package:flutter/animation.dart'; import 'package:flutter/gestures.dart'; @@ -37,7 +35,7 @@ abstract class RenderToggleable extends RenderConstrainedBox { double get position => _performance.value; - void handleEvent(ui.Event event, BoxHitTestEntry entry) { + void handleEvent(InputEvent event, BoxHitTestEntry entry) { if (event.type == 'pointerdown') _tap.addPointer(event); } diff --git a/packages/flutter/lib/src/widgets/drag_target.dart b/packages/flutter/lib/src/widgets/drag_target.dart index e0f9ce5d37..6de530d648 100644 --- a/packages/flutter/lib/src/widgets/drag_target.dart +++ b/packages/flutter/lib/src/widgets/drag_target.dart @@ -3,9 +3,9 @@ // found in the LICENSE file. import 'dart:collection'; -import 'dart:ui' as ui; import 'package:flutter/animation.dart'; +import 'package:flutter/gestures.dart'; import 'package:flutter/rendering.dart'; import 'basic.dart'; @@ -69,7 +69,7 @@ class Draggable extends StatefulComponent { class _DraggableState extends State { DragRoute _route; - void _startDrag(ui.PointerEvent event) { + void _startDrag(PointerInputEvent event) { if (_route != null) return; // TODO(ianh): once we switch to using gestures, just hand the gesture to the route so it can do everything itself. then we can have multiple drags at the same time. final Point point = new Point(event.x, event.y); @@ -97,7 +97,7 @@ class _DraggableState extends State { config.navigator.push(_route); } - void _updateDrag(ui.PointerEvent event) { + void _updateDrag(PointerInputEvent event) { if (_route != null) { config.navigator.setState(() { _route.update(new Point(event.x, event.y)); @@ -105,14 +105,14 @@ class _DraggableState extends State { } } - void _cancelDrag(ui.PointerEvent event) { + void _cancelDrag(PointerInputEvent event) { if (_route != null) { config.navigator.popRoute(_route, DragEndKind.canceled); assert(_route == null); } } - void _drop(ui.PointerEvent event) { + void _drop(PointerInputEvent event) { if (_route != null) { _route.update(new Point(event.x, event.y)); config.navigator.popRoute(_route, DragEndKind.dropped); diff --git a/packages/flutter/lib/src/widgets/gesture_detector.dart b/packages/flutter/lib/src/widgets/gesture_detector.dart index 534148ae4a..5862ee3c43 100644 --- a/packages/flutter/lib/src/widgets/gesture_detector.dart +++ b/packages/flutter/lib/src/widgets/gesture_detector.dart @@ -2,8 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'dart:ui' as ui; - import 'package:flutter/gestures.dart'; import 'package:flutter/rendering.dart'; @@ -187,7 +185,7 @@ class _GestureDetectorState extends State { return null; } - void _handlePointerDown(ui.PointerEvent event) { + void _handlePointerDown(PointerInputEvent event) { if (_tap != null) _tap.addPointer(event); if (_showPress != null) diff --git a/packages/unit/test/engine/mock_events.dart b/packages/unit/test/engine/mock_events.dart index 53ddc9ea8e..ffb8befab9 100644 --- a/packages/unit/test/engine/mock_events.dart +++ b/packages/unit/test/engine/mock_events.dart @@ -1,64 +1,9 @@ import 'dart:ui' as ui; +import 'package:flutter/gestures.dart'; + export 'dart:ui' show Point; -class TestPointerEvent extends ui.PointerEvent { - TestPointerEvent({ - this.type, - this.pointer, - this.kind, - this.x, - this.y, - this.dx, - this.dy, - this.velocityX, - this.velocityY, - this.buttons, - this.down, - this.primary, - this.obscured, - this.pressure, - this.pressureMin, - this.pressureMax, - this.distance, - this.distanceMin, - this.distanceMax, - this.radiusMajor, - this.radiusMinor, - this.radiusMin, - this.radiusMax, - this.orientation, - this.tilt - }); - - // These are all of the PointerEvent members, but not all of Event. - String type; - int pointer; - String kind; - double x; - double y; - double dx; - double dy; - double velocityX; - double velocityY; - int buttons; - bool down; - bool primary; - bool obscured; - double pressure; - double pressureMin; - double pressureMax; - double distance; - double distanceMin; - double distanceMax; - double radiusMajor; - double radiusMinor; - double radiusMin; - double radiusMax; - double orientation; - double tilt; -} - class TestPointer { TestPointer([ this.pointer = 1 ]); @@ -66,11 +11,11 @@ class TestPointer { bool isDown = false; ui.Point location; - ui.PointerEvent down([ui.Point newLocation = ui.Point.origin ]) { + PointerInputEvent down([ui.Point newLocation = ui.Point.origin ]) { assert(!isDown); isDown = true; location = newLocation; - return new TestPointerEvent( + return new PointerInputEvent( type: 'pointerdown', pointer: pointer, x: location.x, @@ -78,11 +23,11 @@ class TestPointer { ); } - ui.PointerEvent move([ui.Point newLocation = ui.Point.origin ]) { + PointerInputEvent move([ui.Point newLocation = ui.Point.origin ]) { assert(isDown); ui.Offset delta = newLocation - location; location = newLocation; - return new TestPointerEvent( + return new PointerInputEvent( type: 'pointermove', pointer: pointer, x: newLocation.x, @@ -92,10 +37,10 @@ class TestPointer { ); } - ui.PointerEvent up() { + PointerInputEvent up() { assert(isDown); isDown = false; - return new TestPointerEvent( + return new PointerInputEvent( type: 'pointerup', pointer: pointer, x: location.x, @@ -103,10 +48,10 @@ class TestPointer { ); } - ui.PointerEvent cancel() { + PointerInputEvent cancel() { assert(isDown); isDown = false; - return new TestPointerEvent( + return new PointerInputEvent( type: 'pointercancel', pointer: pointer, x: location.x, diff --git a/packages/unit/test/gestures/long_press_test.dart b/packages/unit/test/gestures/long_press_test.dart index 8fb8022dcc..133901f9fc 100644 --- a/packages/unit/test/gestures/long_press_test.dart +++ b/packages/unit/test/gestures/long_press_test.dart @@ -2,16 +2,14 @@ import 'package:quiver/testing/async.dart'; import 'package:flutter/gestures.dart'; import 'package:test/test.dart'; -import '../engine/mock_events.dart'; - -final TestPointerEvent down = new TestPointerEvent( +final PointerInputEvent down = new PointerInputEvent( pointer: 5, type: 'pointerdown', x: 10.0, y: 10.0 ); -final TestPointerEvent up = new TestPointerEvent( +final PointerInputEvent up = new PointerInputEvent( pointer: 5, type: 'pointerup', x: 11.0, diff --git a/packages/unit/test/gestures/pointer_router_test.dart b/packages/unit/test/gestures/pointer_router_test.dart index 65f00838f4..ba3efb9932 100644 --- a/packages/unit/test/gestures/pointer_router_test.dart +++ b/packages/unit/test/gestures/pointer_router_test.dart @@ -1,5 +1,3 @@ -import 'dart:ui' as ui; - import 'package:flutter/gestures.dart'; import 'package:test/test.dart'; @@ -8,7 +6,7 @@ import '../engine/mock_events.dart'; void main() { test('Should route pointers', () { bool callbackRan = false; - void callback(ui.PointerEvent event) { + void callback(PointerInputEvent event) { callbackRan = true; } diff --git a/packages/unit/test/gestures/scale_test.dart b/packages/unit/test/gestures/scale_test.dart index 9acec2c7a3..473d0235ca 100644 --- a/packages/unit/test/gestures/scale_test.dart +++ b/packages/unit/test/gestures/scale_test.dart @@ -36,7 +36,7 @@ void main() { TestPointer pointer1 = new TestPointer(1); - ui.PointerEvent down = pointer1.down(new Point(10.0, 10.0)); + PointerInputEvent down = pointer1.down(new ui.Point(10.0, 10.0)); scale.addPointer(down); tap.addPointer(down); @@ -55,7 +55,7 @@ void main() { expect(didEndScale, isFalse); expect(didTap, isFalse); - router.route(pointer1.move(new Point(20.0, 30.0))); + router.route(pointer1.move(new ui.Point(20.0, 30.0))); expect(didStartScale, isTrue); didStartScale = false; expect(updatedFocalPoint, new ui.Point(20.0, 30.0)); @@ -67,7 +67,7 @@ void main() { // Two-finger scaling TestPointer pointer2 = new TestPointer(2); - ui.PointerEvent down2 = pointer2.down(new Point(10.0, 20.0)); + PointerInputEvent down2 = pointer2.down(new ui.Point(10.0, 20.0)); scale.addPointer(down2); tap.addPointer(down2); GestureArena.instance.close(2); @@ -80,7 +80,7 @@ void main() { expect(didStartScale, isFalse); // Zoom in - router.route(pointer2.move(new Point(0.0, 10.0))); + router.route(pointer2.move(new ui.Point(0.0, 10.0))); expect(didStartScale, isTrue); didStartScale = false; expect(updatedFocalPoint, new ui.Point(10.0, 20.0)); @@ -91,7 +91,7 @@ void main() { expect(didTap, isFalse); // Zoom out - router.route(pointer2.move(new Point(15.0, 25.0))); + router.route(pointer2.move(new ui.Point(15.0, 25.0))); expect(updatedFocalPoint, new ui.Point(17.5, 27.5)); updatedFocalPoint = null; expect(updatedScale, 0.5); @@ -100,7 +100,7 @@ void main() { // Three-finger scaling TestPointer pointer3 = new TestPointer(3); - ui.PointerEvent down3 = pointer3.down(new Point(25.0, 35.0)); + PointerInputEvent down3 = pointer3.down(new ui.Point(25.0, 35.0)); scale.addPointer(down3); tap.addPointer(down3); GestureArena.instance.close(3); @@ -113,7 +113,7 @@ void main() { expect(didStartScale, isFalse); // Zoom in - router.route(pointer3.move(new Point(55.0, 65.0))); + router.route(pointer3.move(new ui.Point(55.0, 65.0))); expect(didStartScale, isTrue); didStartScale = false; expect(updatedFocalPoint, new ui.Point(30.0, 40.0)); @@ -124,9 +124,9 @@ void main() { expect(didTap, isFalse); // Return to original positions but with different fingers - router.route(pointer1.move(new Point(25.0, 35.0))); - router.route(pointer2.move(new Point(20.0, 30.0))); - router.route(pointer3.move(new Point(15.0, 25.0))); + router.route(pointer1.move(new ui.Point(25.0, 35.0))); + router.route(pointer2.move(new ui.Point(20.0, 30.0))); + router.route(pointer3.move(new ui.Point(15.0, 25.0))); expect(didStartScale, isFalse); expect(updatedFocalPoint, new ui.Point(20.0, 30.0)); updatedFocalPoint = null; @@ -144,7 +144,7 @@ void main() { expect(didTap, isFalse); // Continue scaling with two fingers - router.route(pointer3.move(new Point(10.0, 20.0))); + router.route(pointer3.move(new ui.Point(10.0, 20.0))); expect(didStartScale, isTrue); didStartScale = false; expect(updatedFocalPoint, new ui.Point(15.0, 25.0)); @@ -161,7 +161,7 @@ void main() { expect(didTap, isFalse); // Continue panning with one finger - router.route(pointer3.move(new Point(0.0, 0.0))); + router.route(pointer3.move(new ui.Point(0.0, 0.0))); expect(didStartScale, isTrue); didStartScale = false; expect(updatedFocalPoint, new ui.Point(0.0, 0.0)); diff --git a/packages/unit/test/gestures/scroll_test.dart b/packages/unit/test/gestures/scroll_test.dart index e382ab37e5..0fe4f5b04e 100644 --- a/packages/unit/test/gestures/scroll_test.dart +++ b/packages/unit/test/gestures/scroll_test.dart @@ -32,7 +32,7 @@ void main() { }; TestPointer pointer = new TestPointer(5); - ui.PointerEvent down = pointer.down(new Point(10.0, 10.0)); + PointerInputEvent down = pointer.down(new ui.Point(10.0, 10.0)); pan.addPointer(down); tap.addPointer(down); GestureArena.instance.close(5); @@ -47,7 +47,7 @@ void main() { expect(didEndPan, isFalse); expect(didTap, isFalse); - router.route(pointer.move(new Point(20.0, 20.0))); + router.route(pointer.move(new ui.Point(20.0, 20.0))); expect(didStartPan, isTrue); didStartPan = false; expect(updatedScrollDelta, new ui.Offset(10.0, 10.0)); @@ -55,7 +55,7 @@ void main() { expect(didEndPan, isFalse); expect(didTap, isFalse); - router.route(pointer.move(new Point(20.0, 25.0))); + router.route(pointer.move(new ui.Point(20.0, 25.0))); expect(didStartPan, isFalse); expect(updatedScrollDelta, new ui.Offset(0.0, 5.0)); updatedScrollDelta = null; diff --git a/packages/unit/test/gestures/show_press_test.dart b/packages/unit/test/gestures/show_press_test.dart index 6a2005d3a8..d5e5dd5e9f 100644 --- a/packages/unit/test/gestures/show_press_test.dart +++ b/packages/unit/test/gestures/show_press_test.dart @@ -2,16 +2,14 @@ import 'package:quiver/testing/async.dart'; import 'package:flutter/gestures.dart'; import 'package:test/test.dart'; -import '../engine/mock_events.dart'; - -final TestPointerEvent down = new TestPointerEvent( +final PointerInputEvent down = new PointerInputEvent( pointer: 5, type: 'pointerdown', x: 10.0, y: 10.0 ); -final TestPointerEvent up = new TestPointerEvent( +final PointerInputEvent up = new PointerInputEvent( pointer: 5, type: 'pointerup', x: 11.0, diff --git a/packages/unit/test/gestures/tap_test.dart b/packages/unit/test/gestures/tap_test.dart index c41860ca11..a8cf91c9f9 100644 --- a/packages/unit/test/gestures/tap_test.dart +++ b/packages/unit/test/gestures/tap_test.dart @@ -1,8 +1,6 @@ import 'package:flutter/gestures.dart'; import 'package:test/test.dart'; -import '../engine/mock_events.dart'; - void main() { test('Should recognize tap', () { PointerRouter router = new PointerRouter(); @@ -13,7 +11,7 @@ void main() { tapRecognized = true; }; - TestPointerEvent down = new TestPointerEvent( + PointerInputEvent down = new PointerInputEvent( pointer: 5, type: 'pointerdown', x: 10.0, @@ -26,7 +24,7 @@ void main() { router.route(down); expect(tapRecognized, isFalse); - TestPointerEvent up = new TestPointerEvent( + PointerInputEvent up = new PointerInputEvent( pointer: 5, type: 'pointerup', x: 11.0, diff --git a/packages/unit/test/widget/widget_tester.dart b/packages/unit/test/widget/widget_tester.dart index 5d6e57f4bd..dbc599a5e8 100644 --- a/packages/unit/test/widget/widget_tester.dart +++ b/packages/unit/test/widget/widget_tester.dart @@ -1,6 +1,5 @@ -import 'dart:ui' as ui; - import 'package:flutter/animation.dart'; +import 'package:flutter/gestures.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/widgets.dart'; import 'package:quiver/testing/async.dart'; @@ -159,13 +158,13 @@ class WidgetTester { _dispatchEvent(p.up(), result); } - void dispatchEvent(ui.Event event, Point location) { + void dispatchEvent(InputEvent event, Point location) { _dispatchEvent(event, _hitTest(location)); } HitTestResult _hitTest(Point location) => WidgetFlutterBinding.instance.hitTest(location); - void _dispatchEvent(ui.Event event, HitTestResult result) { + void _dispatchEvent(InputEvent event, HitTestResult result) { WidgetFlutterBinding.instance.dispatchEvent(event, result); } From f343b7af07f92bb2316139456a48c3a0553236df Mon Sep 17 00:00:00 2001 From: Jason Simmons Date: Tue, 13 Oct 2015 11:00:54 -0700 Subject: [PATCH 03/13] Update to mojo 1292152bf533de1bfebf5966d6246e149f87add3 --- packages/flutter/lib/src/widgets/editable_text.dart | 2 ++ packages/flutter/pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/flutter/lib/src/widgets/editable_text.dart b/packages/flutter/lib/src/widgets/editable_text.dart index 8698c69d12..7e8ca295cd 100644 --- a/packages/flutter/lib/src/widgets/editable_text.dart +++ b/packages/flutter/lib/src/widgets/editable_text.dart @@ -128,6 +128,8 @@ class EditableString implements KeyboardClient { selection = new TextRange(start: start, end: end); onUpdated(); } + + void submit(SubmitAction action) {} } class EditableText extends StatefulComponent { diff --git a/packages/flutter/pubspec.yaml b/packages/flutter/pubspec.yaml index a90aa09089..227716fef9 100644 --- a/packages/flutter/pubspec.yaml +++ b/packages/flutter/pubspec.yaml @@ -6,7 +6,7 @@ homepage: http://flutter.io dependencies: cassowary: '>=0.1.7 <0.2.0' material_design_icons: '>=0.0.3 <0.1.0' - mojo_services: '>=0.2.0 <0.3.0' + mojo_services: '>=0.3.0 <0.4.0' mojo: '>=0.2.0 <0.3.0' newton: '>=0.1.4 <0.2.0' sky_engine: '>=0.0.34 <0.1.0' From 090c37077bb90326ff89efdbed4c0a9597047d2d Mon Sep 17 00:00:00 2001 From: Jason Simmons Date: Tue, 13 Oct 2015 16:07:38 -0700 Subject: [PATCH 04/13] Update imports of skysprites to flutter_sprites --- examples/game/example_effect_line.dart | 2 +- examples/game/lib/game_demo.dart | 2 +- examples/game/lib/main.dart | 2 +- examples/game/test_bed.dart | 2 +- examples/game/test_drawatlas.dart | 2 +- examples/game/test_performance.dart | 2 +- examples/game/test_physics.dart | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/examples/game/example_effect_line.dart b/examples/game/example_effect_line.dart index d6a92af06f..3185eb3610 100644 --- a/examples/game/example_effect_line.dart +++ b/examples/game/example_effect_line.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; -import 'package:skysprites/skysprites.dart'; +import 'package:flutter_sprites/skysprites.dart'; AssetBundle _initBundle() { if (rootBundle != null) diff --git a/examples/game/lib/game_demo.dart b/examples/game/lib/game_demo.dart index ceb7b22c2a..7867b60732 100644 --- a/examples/game/lib/game_demo.dart +++ b/examples/game/lib/game_demo.dart @@ -5,7 +5,7 @@ import 'dart:math' as math; import 'dart:ui' as ui; import 'package:flutter/rendering.dart'; -import 'package:skysprites/skysprites.dart'; +import 'package:flutter_sprites/skysprites.dart'; import 'package:vector_math/vector_math_64.dart'; part 'custom_actions.dart'; diff --git a/examples/game/lib/main.dart b/examples/game/lib/main.dart index 54be5e7c7e..e3f9a5963a 100644 --- a/examples/game/lib/main.dart +++ b/examples/game/lib/main.dart @@ -8,7 +8,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/painting.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; -import 'package:skysprites/skysprites.dart'; +import 'package:flutter_sprites/skysprites.dart'; import 'game_demo.dart'; diff --git a/examples/game/test_bed.dart b/examples/game/test_bed.dart index f63a8c6ca7..c31fe63198 100644 --- a/examples/game/test_bed.dart +++ b/examples/game/test_bed.dart @@ -4,7 +4,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; -import 'package:skysprites/skysprites.dart'; +import 'package:flutter_sprites/skysprites.dart'; AssetBundle _initBundle() { if (rootBundle != null) diff --git a/examples/game/test_drawatlas.dart b/examples/game/test_drawatlas.dart index f49e36dc2c..ff33504984 100644 --- a/examples/game/test_drawatlas.dart +++ b/examples/game/test_drawatlas.dart @@ -4,7 +4,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; -import 'package:skysprites/skysprites.dart'; +import 'package:flutter_sprites/skysprites.dart'; AssetBundle _initBundle() { if (rootBundle != null) diff --git a/examples/game/test_performance.dart b/examples/game/test_performance.dart index 3fddd44d86..5e762c4ec9 100644 --- a/examples/game/test_performance.dart +++ b/examples/game/test_performance.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; -import 'package:skysprites/skysprites.dart'; +import 'package:flutter_sprites/skysprites.dart'; AssetBundle _initBundle() { if (rootBundle != null) diff --git a/examples/game/test_physics.dart b/examples/game/test_physics.dart index 327b054594..41941770c8 100644 --- a/examples/game/test_physics.dart +++ b/examples/game/test_physics.dart @@ -4,7 +4,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; -import 'package:skysprites/skysprites.dart'; +import 'package:flutter_sprites/skysprites.dart'; AssetBundle _initBundle() { if (rootBundle != null) From a88a85e695f0652b3d73662db8598b868e109bc7 Mon Sep 17 00:00:00 2001 From: Adam Barth Date: Tue, 13 Oct 2015 16:34:01 -0700 Subject: [PATCH 05/13] Rename skysprites to flutter_sprites --- examples/game/example_effect_line.dart | 2 +- examples/game/lib/game_demo.dart | 2 +- examples/game/lib/main.dart | 2 +- examples/game/test_bed.dart | 2 +- examples/game/test_drawatlas.dart | 2 +- examples/game/test_performance.dart | 2 +- examples/game/test_physics.dart | 2 +- packages/flutter_sprites/README.md | 2 +- .../flutter_sprites/lib/flutter_sprites.dart | 48 +++++++++++++++++++ packages/flutter_sprites/lib/skysprites.dart | 48 ------------------- .../flutter_sprites/lib/{ => src}/action.dart | 2 +- .../lib/{ => src}/action_spline.dart | 2 +- .../lib/{ => src}/color_secuence.dart | 2 +- .../lib/{ => src}/constraint.dart | 2 +- .../lib/{ => src}/effect_line.dart | 2 +- .../lib/{ => src}/image_map.dart | 2 +- .../flutter_sprites/lib/{ => src}/label.dart | 2 +- .../flutter_sprites/lib/{ => src}/layer.dart | 2 +- .../flutter_sprites/lib/{ => src}/node.dart | 2 +- .../flutter_sprites/lib/{ => src}/node3d.dart | 2 +- .../lib/{ => src}/node_with_size.dart | 2 +- .../lib/{ => src}/particle_system.dart | 2 +- .../lib/{ => src}/physics_body.dart | 2 +- .../lib/{ => src}/physics_joint.dart | 2 +- .../lib/{ => src}/physics_node.dart | 2 +- .../lib/{ => src}/physics_shape.dart | 2 +- .../flutter_sprites/lib/{ => src}/sound.dart | 2 +- .../lib/{ => src}/sound_manager.dart | 2 +- .../flutter_sprites/lib/{ => src}/sprite.dart | 2 +- .../lib/{ => src}/sprite_box.dart | 2 +- .../lib/{ => src}/sprite_widget.dart | 2 +- .../lib/{ => src}/spritesheet.dart | 2 +- .../lib/{ => src}/texture.dart | 2 +- .../lib/{ => src}/textured_line.dart | 2 +- .../flutter_sprites/lib/{ => src}/util.dart | 2 +- .../lib/{ => src}/virtual_joystick.dart | 2 +- 36 files changed, 82 insertions(+), 82 deletions(-) create mode 100644 packages/flutter_sprites/lib/flutter_sprites.dart delete mode 100644 packages/flutter_sprites/lib/skysprites.dart rename packages/flutter_sprites/lib/{ => src}/action.dart (99%) rename packages/flutter_sprites/lib/{ => src}/action_spline.dart (98%) rename packages/flutter_sprites/lib/{ => src}/color_secuence.dart (99%) rename packages/flutter_sprites/lib/{ => src}/constraint.dart (99%) rename packages/flutter_sprites/lib/{ => src}/effect_line.dart (99%) rename packages/flutter_sprites/lib/{ => src}/image_map.dart (96%) rename packages/flutter_sprites/lib/{ => src}/label.dart (98%) rename packages/flutter_sprites/lib/{ => src}/layer.dart (98%) rename packages/flutter_sprites/lib/{ => src}/node.dart (99%) rename packages/flutter_sprites/lib/{ => src}/node3d.dart (98%) rename packages/flutter_sprites/lib/{ => src}/node_with_size.dart (98%) rename packages/flutter_sprites/lib/{ => src}/particle_system.dart (99%) rename packages/flutter_sprites/lib/{ => src}/physics_body.dart (99%) rename packages/flutter_sprites/lib/{ => src}/physics_joint.dart (99%) rename packages/flutter_sprites/lib/{ => src}/physics_node.dart (99%) rename packages/flutter_sprites/lib/{ => src}/physics_shape.dart (98%) rename packages/flutter_sprites/lib/{ => src}/sound.dart (99%) rename packages/flutter_sprites/lib/{ => src}/sound_manager.dart (99%) rename packages/flutter_sprites/lib/{ => src}/sprite.dart (99%) rename packages/flutter_sprites/lib/{ => src}/sprite_box.dart (99%) rename packages/flutter_sprites/lib/{ => src}/sprite_widget.dart (98%) rename packages/flutter_sprites/lib/{ => src}/spritesheet.dart (98%) rename packages/flutter_sprites/lib/{ => src}/texture.dart (99%) rename packages/flutter_sprites/lib/{ => src}/textured_line.dart (99%) rename packages/flutter_sprites/lib/{ => src}/util.dart (99%) rename packages/flutter_sprites/lib/{ => src}/virtual_joystick.dart (98%) diff --git a/examples/game/example_effect_line.dart b/examples/game/example_effect_line.dart index 3185eb3610..a352103b1a 100644 --- a/examples/game/example_effect_line.dart +++ b/examples/game/example_effect_line.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; -import 'package:flutter_sprites/skysprites.dart'; +import 'package:flutter_sprites/flutter_sprites.dart'; AssetBundle _initBundle() { if (rootBundle != null) diff --git a/examples/game/lib/game_demo.dart b/examples/game/lib/game_demo.dart index 7867b60732..637423d4ea 100644 --- a/examples/game/lib/game_demo.dart +++ b/examples/game/lib/game_demo.dart @@ -5,7 +5,7 @@ import 'dart:math' as math; import 'dart:ui' as ui; import 'package:flutter/rendering.dart'; -import 'package:flutter_sprites/skysprites.dart'; +import 'package:flutter_sprites/flutter_sprites.dart'; import 'package:vector_math/vector_math_64.dart'; part 'custom_actions.dart'; diff --git a/examples/game/lib/main.dart b/examples/game/lib/main.dart index e3f9a5963a..e7497703b7 100644 --- a/examples/game/lib/main.dart +++ b/examples/game/lib/main.dart @@ -8,7 +8,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/painting.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_sprites/skysprites.dart'; +import 'package:flutter_sprites/flutter_sprites.dart'; import 'game_demo.dart'; diff --git a/examples/game/test_bed.dart b/examples/game/test_bed.dart index c31fe63198..ec1de1f3c4 100644 --- a/examples/game/test_bed.dart +++ b/examples/game/test_bed.dart @@ -4,7 +4,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; -import 'package:flutter_sprites/skysprites.dart'; +import 'package:flutter_sprites/flutter_sprites.dart'; AssetBundle _initBundle() { if (rootBundle != null) diff --git a/examples/game/test_drawatlas.dart b/examples/game/test_drawatlas.dart index ff33504984..f1d854147c 100644 --- a/examples/game/test_drawatlas.dart +++ b/examples/game/test_drawatlas.dart @@ -4,7 +4,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; -import 'package:flutter_sprites/skysprites.dart'; +import 'package:flutter_sprites/flutter_sprites.dart'; AssetBundle _initBundle() { if (rootBundle != null) diff --git a/examples/game/test_performance.dart b/examples/game/test_performance.dart index 5e762c4ec9..fcf25c4efa 100644 --- a/examples/game/test_performance.dart +++ b/examples/game/test_performance.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; -import 'package:flutter_sprites/skysprites.dart'; +import 'package:flutter_sprites/flutter_sprites.dart'; AssetBundle _initBundle() { if (rootBundle != null) diff --git a/examples/game/test_physics.dart b/examples/game/test_physics.dart index 41941770c8..ecadb2f6f0 100644 --- a/examples/game/test_physics.dart +++ b/examples/game/test_physics.dart @@ -4,7 +4,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; -import 'package:flutter_sprites/skysprites.dart'; +import 'package:flutter_sprites/flutter_sprites.dart'; AssetBundle _initBundle() { if (rootBundle != null) diff --git a/packages/flutter_sprites/README.md b/packages/flutter_sprites/README.md index a3cb2c3c07..a7ebb814a9 100644 --- a/packages/flutter_sprites/README.md +++ b/packages/flutter_sprites/README.md @@ -1,4 +1,4 @@ -# skysprites +# Flutter Sprites A sprite toolkit built on top of Flutter. diff --git a/packages/flutter_sprites/lib/flutter_sprites.dart b/packages/flutter_sprites/lib/flutter_sprites.dart new file mode 100644 index 0000000000..e4e69cb962 --- /dev/null +++ b/packages/flutter_sprites/lib/flutter_sprites.dart @@ -0,0 +1,48 @@ +// 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. + +library flutter_sprites; + +import 'dart:async'; +import 'dart:convert'; +import 'dart:math' as math; +import 'dart:typed_data'; +import 'dart:ui' as ui; + +import 'package:box2d/box2d.dart' as box2d; +import 'package:mojo/core.dart'; +import 'package:sky_services/media/media.mojom.dart'; +import 'package:flutter/animation.dart'; +import 'package:flutter/painting.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter/widgets.dart'; +import 'package:vector_math/vector_math_64.dart'; + +part 'src/action.dart'; +part 'src/action_spline.dart'; +part 'src/color_secuence.dart'; +part 'src/constraint.dart'; +part 'src/effect_line.dart'; +part 'src/image_map.dart'; +part 'src/label.dart'; +part 'src/layer.dart'; +part 'src/node.dart'; +part 'src/node3d.dart'; +part 'src/node_with_size.dart'; +part 'src/particle_system.dart'; +part 'src/physics_body.dart'; +part 'src/physics_joint.dart'; +part 'src/physics_node.dart'; +part 'src/physics_shape.dart'; +part 'src/sound.dart'; +part 'src/sound_manager.dart'; +part 'src/sprite.dart'; +part 'src/spritesheet.dart'; +part 'src/sprite_box.dart'; +part 'src/sprite_widget.dart'; +part 'src/texture.dart'; +part 'src/textured_line.dart'; +part 'src/util.dart'; +part 'src/virtual_joystick.dart'; diff --git a/packages/flutter_sprites/lib/skysprites.dart b/packages/flutter_sprites/lib/skysprites.dart deleted file mode 100644 index 7bdd6274d8..0000000000 --- a/packages/flutter_sprites/lib/skysprites.dart +++ /dev/null @@ -1,48 +0,0 @@ -// 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. - -library skysprites; - -import 'dart:async'; -import 'dart:convert'; -import 'dart:math' as math; -import 'dart:typed_data'; -import 'dart:ui' as ui; - -import 'package:box2d/box2d.dart' as box2d; -import 'package:mojo/core.dart'; -import 'package:sky_services/media/media.mojom.dart'; -import 'package:flutter/animation.dart'; -import 'package:flutter/painting.dart'; -import 'package:flutter/rendering.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter/widgets.dart'; -import 'package:vector_math/vector_math_64.dart'; - -part 'action.dart'; -part 'action_spline.dart'; -part 'color_secuence.dart'; -part 'constraint.dart'; -part 'effect_line.dart'; -part 'image_map.dart'; -part 'label.dart'; -part 'layer.dart'; -part 'node.dart'; -part 'node3d.dart'; -part 'node_with_size.dart'; -part 'particle_system.dart'; -part 'physics_body.dart'; -part 'physics_joint.dart'; -part 'physics_node.dart'; -part 'physics_shape.dart'; -part 'sound.dart'; -part 'sound_manager.dart'; -part 'sprite.dart'; -part 'spritesheet.dart'; -part 'sprite_box.dart'; -part 'sprite_widget.dart'; -part 'texture.dart'; -part 'textured_line.dart'; -part 'util.dart'; -part 'virtual_joystick.dart'; diff --git a/packages/flutter_sprites/lib/action.dart b/packages/flutter_sprites/lib/src/action.dart similarity index 99% rename from packages/flutter_sprites/lib/action.dart rename to packages/flutter_sprites/lib/src/action.dart index 01c9486a10..7f867b9073 100644 --- a/packages/flutter_sprites/lib/action.dart +++ b/packages/flutter_sprites/lib/src/action.dart @@ -1,4 +1,4 @@ -part of skysprites; +part of flutter_sprites; typedef void ActionCallback(); diff --git a/packages/flutter_sprites/lib/action_spline.dart b/packages/flutter_sprites/lib/src/action_spline.dart similarity index 98% rename from packages/flutter_sprites/lib/action_spline.dart rename to packages/flutter_sprites/lib/src/action_spline.dart index 1d0e2d105e..c86fb73758 100644 --- a/packages/flutter_sprites/lib/action_spline.dart +++ b/packages/flutter_sprites/lib/src/action_spline.dart @@ -1,4 +1,4 @@ -part of skysprites; +part of flutter_sprites; Point _cardinalSplineAt(Point p0, Point p1, Point p2, Point p3, double tension, double t) { double t2 = t * t; diff --git a/packages/flutter_sprites/lib/color_secuence.dart b/packages/flutter_sprites/lib/src/color_secuence.dart similarity index 99% rename from packages/flutter_sprites/lib/color_secuence.dart rename to packages/flutter_sprites/lib/src/color_secuence.dart index 5bf041b351..a91f63b2a6 100644 --- a/packages/flutter_sprites/lib/color_secuence.dart +++ b/packages/flutter_sprites/lib/src/color_secuence.dart @@ -1,4 +1,4 @@ -part of skysprites; +part of flutter_sprites; /// A sequence of colors representing a gradient or a color transition over /// time. The sequence is represented by a list of [colors] and a list of diff --git a/packages/flutter_sprites/lib/constraint.dart b/packages/flutter_sprites/lib/src/constraint.dart similarity index 99% rename from packages/flutter_sprites/lib/constraint.dart rename to packages/flutter_sprites/lib/src/constraint.dart index 2edb9b0c84..99296cf1d3 100644 --- a/packages/flutter_sprites/lib/constraint.dart +++ b/packages/flutter_sprites/lib/src/constraint.dart @@ -1,4 +1,4 @@ -part of skysprites; +part of flutter_sprites; /// A constraint limits or otherwise controls a [Node]'s properties, such as /// position or rotation. Add a list of constraints by setting the [Node]'s diff --git a/packages/flutter_sprites/lib/effect_line.dart b/packages/flutter_sprites/lib/src/effect_line.dart similarity index 99% rename from packages/flutter_sprites/lib/effect_line.dart rename to packages/flutter_sprites/lib/src/effect_line.dart index 91f0bb67fc..6a48d36030 100644 --- a/packages/flutter_sprites/lib/effect_line.dart +++ b/packages/flutter_sprites/lib/src/effect_line.dart @@ -1,4 +1,4 @@ -part of skysprites; +part of flutter_sprites; enum EffectLineWidthMode { linear, diff --git a/packages/flutter_sprites/lib/image_map.dart b/packages/flutter_sprites/lib/src/image_map.dart similarity index 96% rename from packages/flutter_sprites/lib/image_map.dart rename to packages/flutter_sprites/lib/src/image_map.dart index 6392204ddf..f72fe33941 100644 --- a/packages/flutter_sprites/lib/image_map.dart +++ b/packages/flutter_sprites/lib/src/image_map.dart @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -part of skysprites; +part of flutter_sprites; class ImageMap { ImageMap(AssetBundle bundle) : _bundle = bundle; diff --git a/packages/flutter_sprites/lib/label.dart b/packages/flutter_sprites/lib/src/label.dart similarity index 98% rename from packages/flutter_sprites/lib/label.dart rename to packages/flutter_sprites/lib/src/label.dart index b428c1042c..8f061924c4 100644 --- a/packages/flutter_sprites/lib/label.dart +++ b/packages/flutter_sprites/lib/src/label.dart @@ -1,4 +1,4 @@ -part of skysprites; +part of flutter_sprites; /// Labels are used to display a string of text in a the node tree. To align /// the label, the textAlign property of the [TextStyle] can be set. diff --git a/packages/flutter_sprites/lib/layer.dart b/packages/flutter_sprites/lib/src/layer.dart similarity index 98% rename from packages/flutter_sprites/lib/layer.dart rename to packages/flutter_sprites/lib/src/layer.dart index 3d8b08543c..c1c578fb0a 100644 --- a/packages/flutter_sprites/lib/layer.dart +++ b/packages/flutter_sprites/lib/src/layer.dart @@ -1,4 +1,4 @@ -part of skysprites; +part of flutter_sprites; /// A [Node] that provides an intermediate rendering surface in the sprite /// rendering tree. A [Layer] can be used to change the opacity, color, or to diff --git a/packages/flutter_sprites/lib/node.dart b/packages/flutter_sprites/lib/src/node.dart similarity index 99% rename from packages/flutter_sprites/lib/node.dart rename to packages/flutter_sprites/lib/src/node.dart index 0896b9c123..e3151585a7 100644 --- a/packages/flutter_sprites/lib/node.dart +++ b/packages/flutter_sprites/lib/src/node.dart @@ -1,4 +1,4 @@ -part of skysprites; +part of flutter_sprites; double convertDegrees2Radians(double degrees) => degrees * math.PI/180.8; diff --git a/packages/flutter_sprites/lib/node3d.dart b/packages/flutter_sprites/lib/src/node3d.dart similarity index 98% rename from packages/flutter_sprites/lib/node3d.dart rename to packages/flutter_sprites/lib/src/node3d.dart index c3e26b09a1..40fb629c28 100644 --- a/packages/flutter_sprites/lib/node3d.dart +++ b/packages/flutter_sprites/lib/src/node3d.dart @@ -1,4 +1,4 @@ -part of skysprites; +part of flutter_sprites; /// An node that transforms its children using a 3D perspective projection. This /// node type can be used to create 3D flips and other similar effects. diff --git a/packages/flutter_sprites/lib/node_with_size.dart b/packages/flutter_sprites/lib/src/node_with_size.dart similarity index 98% rename from packages/flutter_sprites/lib/node_with_size.dart rename to packages/flutter_sprites/lib/src/node_with_size.dart index 8c7371b834..3380a44037 100644 --- a/packages/flutter_sprites/lib/node_with_size.dart +++ b/packages/flutter_sprites/lib/src/node_with_size.dart @@ -1,4 +1,4 @@ -part of skysprites; +part of flutter_sprites; /// The super class of any [Node] that has a size. /// diff --git a/packages/flutter_sprites/lib/particle_system.dart b/packages/flutter_sprites/lib/src/particle_system.dart similarity index 99% rename from packages/flutter_sprites/lib/particle_system.dart rename to packages/flutter_sprites/lib/src/particle_system.dart index e7b8d1d458..c3b256dc14 100644 --- a/packages/flutter_sprites/lib/particle_system.dart +++ b/packages/flutter_sprites/lib/src/particle_system.dart @@ -1,4 +1,4 @@ -part of skysprites; +part of flutter_sprites; class _Particle { Vector2 pos; diff --git a/packages/flutter_sprites/lib/physics_body.dart b/packages/flutter_sprites/lib/src/physics_body.dart similarity index 99% rename from packages/flutter_sprites/lib/physics_body.dart rename to packages/flutter_sprites/lib/src/physics_body.dart index 40ee242c0f..0517d7b702 100644 --- a/packages/flutter_sprites/lib/physics_body.dart +++ b/packages/flutter_sprites/lib/src/physics_body.dart @@ -1,4 +1,4 @@ -part of skysprites; +part of flutter_sprites; enum PhysicsBodyType { static, diff --git a/packages/flutter_sprites/lib/physics_joint.dart b/packages/flutter_sprites/lib/src/physics_joint.dart similarity index 99% rename from packages/flutter_sprites/lib/physics_joint.dart rename to packages/flutter_sprites/lib/src/physics_joint.dart index f71ae5414d..262bb227c9 100644 --- a/packages/flutter_sprites/lib/physics_joint.dart +++ b/packages/flutter_sprites/lib/src/physics_joint.dart @@ -1,4 +1,4 @@ -part of skysprites; +part of flutter_sprites; typedef void PhysicsJointBreakCallback(PhysicsJoint joint); diff --git a/packages/flutter_sprites/lib/physics_node.dart b/packages/flutter_sprites/lib/src/physics_node.dart similarity index 99% rename from packages/flutter_sprites/lib/physics_node.dart rename to packages/flutter_sprites/lib/src/physics_node.dart index 5496662f9b..2f0a43acfc 100644 --- a/packages/flutter_sprites/lib/physics_node.dart +++ b/packages/flutter_sprites/lib/src/physics_node.dart @@ -1,4 +1,4 @@ -part of skysprites; +part of flutter_sprites; enum PhysicsContactType { preSolve, diff --git a/packages/flutter_sprites/lib/physics_shape.dart b/packages/flutter_sprites/lib/src/physics_shape.dart similarity index 98% rename from packages/flutter_sprites/lib/physics_shape.dart rename to packages/flutter_sprites/lib/src/physics_shape.dart index 657b85d1ec..4a98d39eec 100644 --- a/packages/flutter_sprites/lib/physics_shape.dart +++ b/packages/flutter_sprites/lib/src/physics_shape.dart @@ -1,4 +1,4 @@ -part of skysprites; +part of flutter_sprites; abstract class PhysicsShape { diff --git a/packages/flutter_sprites/lib/sound.dart b/packages/flutter_sprites/lib/src/sound.dart similarity index 99% rename from packages/flutter_sprites/lib/sound.dart rename to packages/flutter_sprites/lib/src/sound.dart index 902bbb5ee6..378f87c533 100644 --- a/packages/flutter_sprites/lib/sound.dart +++ b/packages/flutter_sprites/lib/src/sound.dart @@ -1,4 +1,4 @@ -part of skysprites; +part of flutter_sprites; // TODO: The sound effects should probably use Android's SoundPool instead of // MediaPlayer as it is more efficient and flexible for playing back sound effects diff --git a/packages/flutter_sprites/lib/sound_manager.dart b/packages/flutter_sprites/lib/src/sound_manager.dart similarity index 99% rename from packages/flutter_sprites/lib/sound_manager.dart rename to packages/flutter_sprites/lib/src/sound_manager.dart index 4c0b328686..01bd5b0cbd 100644 --- a/packages/flutter_sprites/lib/sound_manager.dart +++ b/packages/flutter_sprites/lib/src/sound_manager.dart @@ -1,4 +1,4 @@ -part of skysprites; +part of flutter_sprites; enum SoundFadeMode { crossFade, diff --git a/packages/flutter_sprites/lib/sprite.dart b/packages/flutter_sprites/lib/src/sprite.dart similarity index 99% rename from packages/flutter_sprites/lib/sprite.dart rename to packages/flutter_sprites/lib/src/sprite.dart index f1d30a63db..3a532f42dc 100644 --- a/packages/flutter_sprites/lib/sprite.dart +++ b/packages/flutter_sprites/lib/src/sprite.dart @@ -1,4 +1,4 @@ -part of skysprites; +part of flutter_sprites; /// A Sprite is a [Node] that renders a bitmap image to the screen. class Sprite extends NodeWithSize with SpritePaint { diff --git a/packages/flutter_sprites/lib/sprite_box.dart b/packages/flutter_sprites/lib/src/sprite_box.dart similarity index 99% rename from packages/flutter_sprites/lib/sprite_box.dart rename to packages/flutter_sprites/lib/src/sprite_box.dart index 8c1d06be33..18b2b8b326 100644 --- a/packages/flutter_sprites/lib/sprite_box.dart +++ b/packages/flutter_sprites/lib/src/sprite_box.dart @@ -1,4 +1,4 @@ -part of skysprites; +part of flutter_sprites; /// Options for setting up a [SpriteBox]. /// diff --git a/packages/flutter_sprites/lib/sprite_widget.dart b/packages/flutter_sprites/lib/src/sprite_widget.dart similarity index 98% rename from packages/flutter_sprites/lib/sprite_widget.dart rename to packages/flutter_sprites/lib/src/sprite_widget.dart index a1068f5044..4c71605831 100644 --- a/packages/flutter_sprites/lib/sprite_widget.dart +++ b/packages/flutter_sprites/lib/src/sprite_widget.dart @@ -1,4 +1,4 @@ -part of skysprites; +part of flutter_sprites; /// A widget that uses a [SpriteBox] to render a sprite node tree to the screen. class SpriteWidget extends OneChildRenderObjectWidget { diff --git a/packages/flutter_sprites/lib/spritesheet.dart b/packages/flutter_sprites/lib/src/spritesheet.dart similarity index 98% rename from packages/flutter_sprites/lib/spritesheet.dart rename to packages/flutter_sprites/lib/src/spritesheet.dart index cbf3b50701..3fb116a9e5 100644 --- a/packages/flutter_sprites/lib/spritesheet.dart +++ b/packages/flutter_sprites/lib/src/spritesheet.dart @@ -1,4 +1,4 @@ -part of skysprites; +part of flutter_sprites; /// A sprite sheet packs a number of smaller images into a single large image. /// diff --git a/packages/flutter_sprites/lib/texture.dart b/packages/flutter_sprites/lib/src/texture.dart similarity index 99% rename from packages/flutter_sprites/lib/texture.dart rename to packages/flutter_sprites/lib/src/texture.dart index f690ae2f28..129bb9830e 100644 --- a/packages/flutter_sprites/lib/texture.dart +++ b/packages/flutter_sprites/lib/src/texture.dart @@ -1,4 +1,4 @@ -part of skysprites; +part of flutter_sprites; /// A texture represents a rectangular area of an image and is typically used to draw a sprite to the screen. /// diff --git a/packages/flutter_sprites/lib/textured_line.dart b/packages/flutter_sprites/lib/src/textured_line.dart similarity index 99% rename from packages/flutter_sprites/lib/textured_line.dart rename to packages/flutter_sprites/lib/src/textured_line.dart index d35d960b4b..3bf96404ce 100644 --- a/packages/flutter_sprites/lib/textured_line.dart +++ b/packages/flutter_sprites/lib/src/textured_line.dart @@ -1,4 +1,4 @@ -part of skysprites; +part of flutter_sprites; class TexturedLine extends Node { TexturedLine(List points, List colors, List widths, [Texture texture, List textureStops]) { diff --git a/packages/flutter_sprites/lib/util.dart b/packages/flutter_sprites/lib/src/util.dart similarity index 99% rename from packages/flutter_sprites/lib/util.dart rename to packages/flutter_sprites/lib/src/util.dart index 0cb740cd7e..5dbd940385 100644 --- a/packages/flutter_sprites/lib/util.dart +++ b/packages/flutter_sprites/lib/src/util.dart @@ -1,4 +1,4 @@ -part of skysprites; +part of flutter_sprites; math.Random _random = new math.Random(); diff --git a/packages/flutter_sprites/lib/virtual_joystick.dart b/packages/flutter_sprites/lib/src/virtual_joystick.dart similarity index 98% rename from packages/flutter_sprites/lib/virtual_joystick.dart rename to packages/flutter_sprites/lib/src/virtual_joystick.dart index 1977f9f863..c08495e440 100644 --- a/packages/flutter_sprites/lib/virtual_joystick.dart +++ b/packages/flutter_sprites/lib/src/virtual_joystick.dart @@ -1,4 +1,4 @@ -part of skysprites; +part of flutter_sprites; class VirtualJoystick extends NodeWithSize { VirtualJoystick() : super(new Size(160.0, 160.0)) { From 6529f54c0897c905a7bdae15ede9b47d4bf9a6ba Mon Sep 17 00:00:00 2001 From: Adam Barth Date: Tue, 13 Oct 2015 16:52:01 -0700 Subject: [PATCH 06/13] Rev pub packages --- packages/flutter/pubspec.yaml | 8 ++++---- packages/flutter_sprites/pubspec.yaml | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/flutter/pubspec.yaml b/packages/flutter/pubspec.yaml index a90aa09089..293b5ce561 100644 --- a/packages/flutter/pubspec.yaml +++ b/packages/flutter/pubspec.yaml @@ -1,5 +1,5 @@ name: flutter -version: 0.0.3 +version: 0.0.4 author: Flutter Authors description: A framework for writing Flutter applications homepage: http://flutter.io @@ -9,9 +9,9 @@ dependencies: mojo_services: '>=0.2.0 <0.3.0' mojo: '>=0.2.0 <0.3.0' newton: '>=0.1.4 <0.2.0' - sky_engine: '>=0.0.34 <0.1.0' - sky_services: '>=0.0.34 <0.1.0' - sky_tools: '>=0.0.18 <0.1.0' + sky_engine: '>=0.0.35 <0.1.0' + sky_services: '>=0.0.35 <0.1.0' + sky_tools: '>=0.0.20 <0.1.0' vector_math: '>=1.4.3 <2.0.0' intl: '>=0.12.4+2 <0.13.0' environment: diff --git a/packages/flutter_sprites/pubspec.yaml b/packages/flutter_sprites/pubspec.yaml index 4e1035b28e..a95f819395 100644 --- a/packages/flutter_sprites/pubspec.yaml +++ b/packages/flutter_sprites/pubspec.yaml @@ -4,6 +4,6 @@ version: 0.0.2 author: Flutter Authors homepage: http://flutter.io dependencies: - flutter: ">=0.0.3 <0.1.0" - sky_tools: ">=0.0.18 <0.1.0" + flutter: ">=0.0.4 <0.1.0" + sky_tools: ">=0.0.20 <0.1.0" box2d: ">=0.2.0 <0.3.0" From 9f74a178fd81272693abced6cce0a0fff08bf3c8 Mon Sep 17 00:00:00 2001 From: Kris Giesing Date: Tue, 13 Oct 2015 16:57:40 -0700 Subject: [PATCH 07/13] Address comments --- packages/flutter/lib/src/gestures/events.dart | 136 +++++++++--------- .../lib/src/gestures/pointer_router.dart | 2 +- .../flutter/lib/src/rendering/binding.dart | 2 +- packages/unit/test/gestures/scale_test.dart | 24 ++-- 4 files changed, 83 insertions(+), 81 deletions(-) diff --git a/packages/flutter/lib/src/gestures/events.dart b/packages/flutter/lib/src/gestures/events.dart index 664a519b52..30298389e4 100644 --- a/packages/flutter/lib/src/gestures/events.dart +++ b/packages/flutter/lib/src/gestures/events.dart @@ -1,25 +1,27 @@ import 'dart:ui' as ui; -/// Dart-layer version of ui.Event +/// Base class for input events. class InputEvent { - InputEvent({ this.type }) : timeStamp = 0.0; + const InputEvent({ this.type, this.timeStamp: 0.0 }); - factory InputEvent.fromSkyEvent(ui.Event event) { + factory InputEvent.fromUiEvent(ui.Event event) { if (event is ui.PointerEvent) return new PointerInputEvent.fromUiEvent(event); // Default event - InputEvent result = new InputEvent(); - result.type = event.type; - result.timeStamp = event.timeStamp; + return new InputEvent( + type: event.type, + timeStamp: event.timeStamp + ); } - String type; - double timeStamp; + final String type; + final double timeStamp; + } -/// Dart-layer version of ui.PointerInputEvent +/// Input event class PointerInputEvent extends InputEvent { // Map actual input pointer value to a unique value @@ -27,8 +29,9 @@ class PointerInputEvent extends InputEvent { static Map _pointerMap = new Map(); static int _pointerCount = 0; - PointerInputEvent({ + const PointerInputEvent({ String type, + double timeStamp: 0.0, this.pointer, this.kind, this.x, @@ -51,64 +54,63 @@ class PointerInputEvent extends InputEvent { this.radiusMax, this.orientation, this.tilt - }) : super(type: type); - - PointerInputEvent.fromUiEvent(ui.PointerEvent event) { - type = event.type; - timeStamp = event.timeStamp; - - if (type == 'pointerdown') { - pointer = _pointerCount; - _pointerMap[event.pointer] = _pointerCount; - _pointerCount++; - } else { - pointer = _pointerMap[event.pointer]; - } - - kind = event.kind; - x = event.x; - y = event.y; - dx = event.dx; - dy = event.dy; - buttons = event.buttons; - down = event.down; - primary = event.primary; - obscured = event.obscured; - pressure = event.pressure; - pressureMin = event.pressureMin; - pressureMax = event.pressureMax; - distance = event.distance; - distanceMin = event.distanceMin; - distanceMax = event.distanceMax; - radiusMajor = event.radiusMajor; - radiusMinor = event.radiusMinor; - radiusMin = event.radiusMin; - radiusMax = event.radiusMax; - orientation = event.orientation; - tilt = event.tilt; + }) : super(type: type, timeStamp: timeStamp); + factory PointerInputEvent.fromUiEvent(ui.PointerEvent event) { + PointerInputEvent result = new PointerInputEvent( + type: event.type, + timeStamp: event.timeStamp, + pointer: (event.type == 'pointerDown') ? _pointerCount : _pointerMap[event.pointer], + kind: event.kind, + x: event.x, + y: event.y, + dx: event.dx, + dy: event.dy, + buttons: event.buttons, + down: event.down, + primary: event.primary, + obscured: event.obscured, + pressure: event.pressure, + pressureMin: event.pressureMin, + pressureMax: event.pressureMax, + distance: event.distance, + distanceMin: event.distanceMin, + distanceMax: event.distanceMax, + radiusMajor: event.radiusMajor, + radiusMinor: event.radiusMinor, + radiusMin: event.radiusMin, + radiusMax: event.radiusMax, + orientation: event.orientation, + tilt: event.tilt + ); + if (event.type == 'pointerdown') { + _pointerMap[event.pointer] = _pointerCount; + _pointerCount++; + } + return result; } - int pointer; - String kind; - double x; - double y; - double dx; - double dy; - int buttons; - bool down; - bool primary; - bool obscured; - double pressure; - double pressureMin; - double pressureMax; - double distance; - double distanceMin; - double distanceMax; - double radiusMajor; - double radiusMinor; - double radiusMin; - double radiusMax; - double orientation; - double tilt; + final int pointer; + final String kind; + final double x; + final double y; + final double dx; + final double dy; + final int buttons; + final bool down; + final bool primary; + final bool obscured; + final double pressure; + final double pressureMin; + final double pressureMax; + final double distance; + final double distanceMin; + final double distanceMax; + final double radiusMajor; + final double radiusMinor; + final double radiusMin; + final double radiusMax; + final double orientation; + final double tilt; + } diff --git a/packages/flutter/lib/src/gestures/pointer_router.dart b/packages/flutter/lib/src/gestures/pointer_router.dart index 7af85a24c4..4e8ab17d82 100644 --- a/packages/flutter/lib/src/gestures/pointer_router.dart +++ b/packages/flutter/lib/src/gestures/pointer_router.dart @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:flutter/src/gestures/events.dart'; +import 'events.dart'; /// A callback that receives a [PointerInputEvent] typedef void PointerRoute(PointerInputEvent event); diff --git a/packages/flutter/lib/src/rendering/binding.dart b/packages/flutter/lib/src/rendering/binding.dart index f34caaa50a..99685d3d34 100644 --- a/packages/flutter/lib/src/rendering/binding.dart +++ b/packages/flutter/lib/src/rendering/binding.dart @@ -95,7 +95,7 @@ class FlutterBinding extends HitTestTarget { bool removeEventListener(EventListener listener) => _eventListeners.remove(listener); void _handleEvent(ui.Event event) { - InputEvent ourEvent = new InputEvent.fromSkyEvent(event); + InputEvent ourEvent = new InputEvent.fromUiEvent(event); if (ourEvent is PointerInputEvent) { _handlePointerInputEvent(ourEvent); } else { diff --git a/packages/unit/test/gestures/scale_test.dart b/packages/unit/test/gestures/scale_test.dart index 473d0235ca..149d14be0a 100644 --- a/packages/unit/test/gestures/scale_test.dart +++ b/packages/unit/test/gestures/scale_test.dart @@ -36,7 +36,7 @@ void main() { TestPointer pointer1 = new TestPointer(1); - PointerInputEvent down = pointer1.down(new ui.Point(10.0, 10.0)); + PointerInputEvent down = pointer1.down(new Point(10.0, 10.0)); scale.addPointer(down); tap.addPointer(down); @@ -55,7 +55,7 @@ void main() { expect(didEndScale, isFalse); expect(didTap, isFalse); - router.route(pointer1.move(new ui.Point(20.0, 30.0))); + router.route(pointer1.move(new Point(20.0, 30.0))); expect(didStartScale, isTrue); didStartScale = false; expect(updatedFocalPoint, new ui.Point(20.0, 30.0)); @@ -67,7 +67,7 @@ void main() { // Two-finger scaling TestPointer pointer2 = new TestPointer(2); - PointerInputEvent down2 = pointer2.down(new ui.Point(10.0, 20.0)); + PointerInputEvent down2 = pointer2.down(new Point(10.0, 20.0)); scale.addPointer(down2); tap.addPointer(down2); GestureArena.instance.close(2); @@ -80,7 +80,7 @@ void main() { expect(didStartScale, isFalse); // Zoom in - router.route(pointer2.move(new ui.Point(0.0, 10.0))); + router.route(pointer2.move(new Point(0.0, 10.0))); expect(didStartScale, isTrue); didStartScale = false; expect(updatedFocalPoint, new ui.Point(10.0, 20.0)); @@ -91,7 +91,7 @@ void main() { expect(didTap, isFalse); // Zoom out - router.route(pointer2.move(new ui.Point(15.0, 25.0))); + router.route(pointer2.move(new Point(15.0, 25.0))); expect(updatedFocalPoint, new ui.Point(17.5, 27.5)); updatedFocalPoint = null; expect(updatedScale, 0.5); @@ -100,7 +100,7 @@ void main() { // Three-finger scaling TestPointer pointer3 = new TestPointer(3); - PointerInputEvent down3 = pointer3.down(new ui.Point(25.0, 35.0)); + PointerInputEvent down3 = pointer3.down(new Point(25.0, 35.0)); scale.addPointer(down3); tap.addPointer(down3); GestureArena.instance.close(3); @@ -113,7 +113,7 @@ void main() { expect(didStartScale, isFalse); // Zoom in - router.route(pointer3.move(new ui.Point(55.0, 65.0))); + router.route(pointer3.move(new Point(55.0, 65.0))); expect(didStartScale, isTrue); didStartScale = false; expect(updatedFocalPoint, new ui.Point(30.0, 40.0)); @@ -124,9 +124,9 @@ void main() { expect(didTap, isFalse); // Return to original positions but with different fingers - router.route(pointer1.move(new ui.Point(25.0, 35.0))); - router.route(pointer2.move(new ui.Point(20.0, 30.0))); - router.route(pointer3.move(new ui.Point(15.0, 25.0))); + router.route(pointer1.move(new Point(25.0, 35.0))); + router.route(pointer2.move(new Point(20.0, 30.0))); + router.route(pointer3.move(new Point(15.0, 25.0))); expect(didStartScale, isFalse); expect(updatedFocalPoint, new ui.Point(20.0, 30.0)); updatedFocalPoint = null; @@ -144,7 +144,7 @@ void main() { expect(didTap, isFalse); // Continue scaling with two fingers - router.route(pointer3.move(new ui.Point(10.0, 20.0))); + router.route(pointer3.move(new Point(10.0, 20.0))); expect(didStartScale, isTrue); didStartScale = false; expect(updatedFocalPoint, new ui.Point(15.0, 25.0)); @@ -161,7 +161,7 @@ void main() { expect(didTap, isFalse); // Continue panning with one finger - router.route(pointer3.move(new ui.Point(0.0, 0.0))); + router.route(pointer3.move(new Point(0.0, 0.0))); expect(didStartScale, isTrue); didStartScale = false; expect(updatedFocalPoint, new ui.Point(0.0, 0.0)); From 02843214839c6ba739508d164e732c6662fa7c9e Mon Sep 17 00:00:00 2001 From: Kris Giesing Date: Tue, 13 Oct 2015 17:32:04 -0700 Subject: [PATCH 08/13] Address more comments --- packages/flutter/lib/src/gestures/events.dart | 34 +++++++++++++------ packages/unit/test/gestures/scroll_test.dart | 6 ++-- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/packages/flutter/lib/src/gestures/events.dart b/packages/flutter/lib/src/gestures/events.dart index 30298389e4..031017b1f2 100644 --- a/packages/flutter/lib/src/gestures/events.dart +++ b/packages/flutter/lib/src/gestures/events.dart @@ -1,3 +1,7 @@ +// 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' as ui; /// Base class for input events. @@ -21,14 +25,9 @@ class InputEvent { } -/// Input event +/// Input event representing a touch or button. class PointerInputEvent extends InputEvent { - // Map actual input pointer value to a unique value - // Since events are serialized we can just use a counter - static Map _pointerMap = new Map(); - static int _pointerCount = 0; - const PointerInputEvent({ String type, double timeStamp: 0.0, @@ -60,7 +59,7 @@ class PointerInputEvent extends InputEvent { PointerInputEvent result = new PointerInputEvent( type: event.type, timeStamp: event.timeStamp, - pointer: (event.type == 'pointerDown') ? _pointerCount : _pointerMap[event.pointer], + pointer: _getPointerValue(event.type, event.pointer), kind: event.kind, x: event.x, y: event.y, @@ -83,13 +82,26 @@ class PointerInputEvent extends InputEvent { orientation: event.orientation, tilt: event.tilt ); - if (event.type == 'pointerdown') { - _pointerMap[event.pointer] = _pointerCount; - _pointerCount++; - } return result; } + // Map actual input pointer value to a unique value + // Since events are serialized we can just use a counter + static Map _pointerMap = new Map(); + static int _pointerCount = 0; + + static int _getPointerValue(String eventType, int pointer) { + int result; + if (eventType == 'pointerdown') { + result = pointer; + _pointerMap[pointer] = _pointerCount; + _pointerCount++; + } else { + result = _pointerMap[pointer]; + } + return result; + } + final int pointer; final String kind; final double x; diff --git a/packages/unit/test/gestures/scroll_test.dart b/packages/unit/test/gestures/scroll_test.dart index 0fe4f5b04e..09a6ccd72d 100644 --- a/packages/unit/test/gestures/scroll_test.dart +++ b/packages/unit/test/gestures/scroll_test.dart @@ -32,7 +32,7 @@ void main() { }; TestPointer pointer = new TestPointer(5); - PointerInputEvent down = pointer.down(new ui.Point(10.0, 10.0)); + PointerInputEvent down = pointer.down(new Point(10.0, 10.0)); pan.addPointer(down); tap.addPointer(down); GestureArena.instance.close(5); @@ -47,7 +47,7 @@ void main() { expect(didEndPan, isFalse); expect(didTap, isFalse); - router.route(pointer.move(new ui.Point(20.0, 20.0))); + router.route(pointer.move(new Point(20.0, 20.0))); expect(didStartPan, isTrue); didStartPan = false; expect(updatedScrollDelta, new ui.Offset(10.0, 10.0)); @@ -55,7 +55,7 @@ void main() { expect(didEndPan, isFalse); expect(didTap, isFalse); - router.route(pointer.move(new ui.Point(20.0, 25.0))); + router.route(pointer.move(new Point(20.0, 25.0))); expect(didStartPan, isFalse); expect(updatedScrollDelta, new ui.Offset(0.0, 5.0)); updatedScrollDelta = null; From 921d432092156058f0ed4421acbb730ac896e019 Mon Sep 17 00:00:00 2001 From: Hans Muller Date: Tue, 13 Oct 2015 09:42:39 -0700 Subject: [PATCH 09/13] Added Painter, ScrollingListPainter, MaterialScrollbarPainter Enabled displaying a scrollbar in ScrollingLists. The scrollbar is painted as an "overlay", i.e. it's painted on top of the scrolling list's visible children. Added an abstract Painter base class that encapsulates a paint method and the renderer that it's attached to. RenderBlockViewport and HomogenousViewport now support an overlayPainter property. If specified, RenderBlockViewport attaches itself to the overlayPainter when it's attached to the rendering tree. RenderBlockViewport now calls overlayPainter.paint() after it has painted its children. Added an abstract ScrollingListPainter class that exposes ScrollingList's state which might be needed for painting. Like its scroll direction and scrollOffset. The ScrollingListPainter is notified when a scroll starts and ends. Defined a Material-specific ScrollingListPainter that renders a scrollbar. The scrollbar thumb is faded in/out when the scroll starts/ends. Added onScrollStart and onScrollEnd listeners to Scrollable. --- examples/widgets/scrollbar.dart | 67 ++++++++++ packages/flutter/lib/material.dart | 1 + .../lib/src/material/scrollbar_painter.dart | 82 ++++++++++++ packages/flutter/lib/src/rendering/block.dart | 27 ++++ .../flutter/lib/src/rendering/object.dart | 21 +++ .../lib/src/widgets/homogeneous_viewport.dart | 7 +- .../flutter/lib/src/widgets/scrollable.dart | 120 ++++++++++++++++-- 7 files changed, 315 insertions(+), 10 deletions(-) create mode 100644 examples/widgets/scrollbar.dart create mode 100644 packages/flutter/lib/src/material/scrollbar_painter.dart diff --git a/examples/widgets/scrollbar.dart b/examples/widgets/scrollbar.dart new file mode 100644 index 0000000000..b488467a24 --- /dev/null +++ b/examples/widgets/scrollbar.dart @@ -0,0 +1,67 @@ +// 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 'package:intl/intl.dart'; +import 'package:flutter/material.dart'; + +class ScrollbarApp extends StatefulComponent { + ScrollbarApp({ this.navigator }); + + final NavigatorState navigator; + + ScrollbarAppState createState() => new ScrollbarAppState(); +} + +class ScrollbarAppState extends State { + final int _itemCount = 20; + final double _itemExtent = 50.0; + final ScrollbarPainter _scrollbarPainter = new ScrollbarPainter(); + + Widget _buildMenu(BuildContext context) { + NumberFormat dd = new NumberFormat("00", "en_US"); + return new ScrollableList( + items: new List.generate(_itemCount, (int i) => i), + itemExtent: _itemExtent, + itemBuilder: (BuildContext _, int i) => new Text('Item ${dd.format(i)}', style: Theme.of(context).text.title), + scrollableListPainter: _scrollbarPainter + ); + } + + Widget build(BuildContext context) { + Widget scrollable = new Container( + margin: new EdgeDims.symmetric(horizontal: 6.0), // TODO(hansmuller) 6.0 should be based on _kScrollbarThumbWidth + child: new Center( + shrinkWrap: ShrinkWrap.both, + child: new Container( + width: 80.0, + height: _itemExtent * 5.0, + child: _buildMenu(context) + ) + ) + ); + + return new Scaffold( + toolBar: new ToolBar(center: new Text('Scrollbar Demo')), + body: new Container( + decoration: new BoxDecoration(backgroundColor: Theme.of(context).primarySwatch[50]), + padding: new EdgeDims.all(12.0), + child: new Center(child: new Card(child: scrollable)) + ) + ); + } +} + +void main() { + runApp(new MaterialApp( + title: 'ScrollbarApp', + theme: new ThemeData( + brightness: ThemeBrightness.light, + primarySwatch: Colors.blue, + accentColor: Colors.redAccent[200] + ), + routes: { + '/': (RouteArguments args) => new ScrollbarApp(navigator: args.navigator), + } + )); +} diff --git a/packages/flutter/lib/material.dart b/packages/flutter/lib/material.dart index e2e50c720c..88adadfc68 100644 --- a/packages/flutter/lib/material.dart +++ b/packages/flutter/lib/material.dart @@ -33,6 +33,7 @@ export 'src/material/progress_indicator.dart'; export 'src/material/radio.dart'; export 'src/material/raised_button.dart'; export 'src/material/scaffold.dart'; +export 'src/material/scrollbar_painter.dart'; export 'src/material/shadows.dart'; export 'src/material/snack_bar.dart'; export 'src/material/switch.dart'; diff --git a/packages/flutter/lib/src/material/scrollbar_painter.dart b/packages/flutter/lib/src/material/scrollbar_painter.dart new file mode 100644 index 0000000000..16b2175553 --- /dev/null +++ b/packages/flutter/lib/src/material/scrollbar_painter.dart @@ -0,0 +1,82 @@ +// 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:async'; +import 'dart:ui' as ui; + +import 'package:flutter/animation.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter/widgets.dart'; + +const double _kMinScrollbarThumbLength = 18.0; +const double _kScrollbarThumbGirth = 6.0; +const Duration _kScrollbarThumbFadeDuration = const Duration(milliseconds: 300); + +class ScrollbarPainter extends ScrollableListPainter { + + double _opacity = 0.0; + int get _alpha => (_opacity * 0xFF).round(); + + // TODO(hansmuller): thumb color should come from ThemeData. + Color get thumbColor => const Color(0xFF9E9E9E); + + void paintThumb(PaintingContext context, Rect thumbBounds) { + final Paint paint = new Paint()..color = thumbColor.withAlpha(_alpha); + context.canvas.drawRect(thumbBounds, paint); + } + + void paintScrollbar(PaintingContext context, Offset offset) { + final Rect viewportBounds = offset & viewportSize; + Point thumbOrigin; + Size thumbSize; + + if (isVertical) { + double thumbHeight = viewportBounds.height * viewportBounds.height / contentExtent; + thumbHeight = thumbHeight.clamp(_kMinScrollbarThumbLength, viewportBounds.height); + final double maxThumbTop = viewportBounds.height - thumbHeight; + double thumbTop = (scrollOffset / (contentExtent - viewportBounds.height)) * maxThumbTop; + thumbTop = viewportBounds.top + thumbTop.clamp(0.0, maxThumbTop); + thumbOrigin = new Point(viewportBounds.right - _kScrollbarThumbGirth, thumbTop); + thumbSize = new Size(_kScrollbarThumbGirth, thumbHeight); + } else { + double thumbWidth = viewportBounds.width * viewportBounds.width / contentExtent; + thumbWidth = thumbWidth.clamp(_kMinScrollbarThumbLength, viewportBounds.width); + final double maxThumbLeft = viewportBounds.width - thumbWidth; + double thumbLeft = (scrollOffset / (contentExtent - viewportBounds.width)) * maxThumbLeft; + thumbLeft = viewportBounds.left + thumbLeft.clamp(0.0, maxThumbLeft); + thumbOrigin = new Point(thumbLeft, viewportBounds.height - _kScrollbarThumbGirth); + thumbSize = new Size(thumbWidth, _kScrollbarThumbGirth); + } + + paintThumb(context, thumbOrigin & thumbSize); + } + + void paint(PaintingContext context, Offset offset) { + if (_alpha == 0) + return; + paintScrollbar(context, offset); + } + + ValuePerformance _fade; + + Future scrollStarted() { + _fade ??= new ValuePerformance() + ..duration = _kScrollbarThumbFadeDuration + ..variable = new AnimatedValue(0.0, end: 1.0, curve: ease) + ..addListener(() { + _opacity = _fade.value; + renderer?.markNeedsPaint(); + }); + return _fade.forward(); + } + + Future scrollEnded() { + return _fade.reverse(); + } + + void detach() { + super.detach(); + _fade?.stop(); + } +} diff --git a/packages/flutter/lib/src/rendering/block.dart b/packages/flutter/lib/src/rendering/block.dart index 18745490dc..edbc0eae43 100644 --- a/packages/flutter/lib/src/rendering/block.dart +++ b/packages/flutter/lib/src/rendering/block.dart @@ -237,6 +237,7 @@ class RenderBlockViewport extends RenderBlockBase { ExtentCallback totalExtentCallback, ExtentCallback maxCrossAxisDimensionCallback, ExtentCallback minCrossAxisDimensionCallback, + Painter overlayPainter, BlockDirection direction: BlockDirection.vertical, double itemExtent, double minExtent: 0.0, @@ -246,6 +247,7 @@ class RenderBlockViewport extends RenderBlockBase { _totalExtentCallback = totalExtentCallback, _maxCrossAxisExtentCallback = maxCrossAxisDimensionCallback, _minCrossAxisExtentCallback = minCrossAxisDimensionCallback, + _overlayPainter = overlayPainter, _startOffset = startOffset, super(children: children, direction: direction, itemExtent: itemExtent, minExtent: minExtent); @@ -298,6 +300,27 @@ class RenderBlockViewport extends RenderBlockBase { markNeedsLayout(); } + Painter get overlayPainter => _overlayPainter; + Painter _overlayPainter; + void set overlayPainter(Painter value) { + if (_overlayPainter == value) + return; + _overlayPainter?.detach(); + _overlayPainter = value; + _overlayPainter?.attach(this); + markNeedsPaint(); + } + + void attach() { + super.attach(); + _overlayPainter?.attach(this); + } + + void detach() { + super.detach(); + _overlayPainter?.detach(); + } + /// The offset at which to paint the first child /// /// Note: you can modify this property from within [callback], if necessary. @@ -377,11 +400,15 @@ class RenderBlockViewport extends RenderBlockBase { void paint(PaintingContext context, Offset offset) { context.canvas.save(); + context.canvas.clipRect(offset & size); if (isVertical) defaultPaint(context, offset.translate(0.0, startOffset)); else defaultPaint(context, offset.translate(startOffset, 0.0)); + + overlayPainter?.paint(context, offset); + context.canvas.restore(); } diff --git a/packages/flutter/lib/src/rendering/object.dart b/packages/flutter/lib/src/rendering/object.dart index 7b9c0a1b3d..243779648b 100644 --- a/packages/flutter/lib/src/rendering/object.dart +++ b/packages/flutter/lib/src/rendering/object.dart @@ -394,6 +394,27 @@ class PaintingContext { } +/// An encapsulation of a renderer and a paint() method. +/// +/// A renderer may allow its paint() method to be augmented or redefined by +/// providing a Painter. See for example overlayPainter in BlockViewport. +abstract class Painter { + RenderObject get renderObject => _renderObject; + RenderObject _renderObject; + + void attach(RenderObject renderObject) { + assert(_renderObject == null); + _renderObject = renderObject; + } + + void detach() { + assert(_renderObject != null); + _renderObject = null; + } + + void paint(PaintingContext context, Offset offset); +} + /// An abstract set of layout constraints /// /// Concrete layout models (such as box) will create concrete subclasses to diff --git a/packages/flutter/lib/src/widgets/homogeneous_viewport.dart b/packages/flutter/lib/src/widgets/homogeneous_viewport.dart index 54f33506a2..3ee2735afa 100644 --- a/packages/flutter/lib/src/widgets/homogeneous_viewport.dart +++ b/packages/flutter/lib/src/widgets/homogeneous_viewport.dart @@ -18,7 +18,8 @@ class HomogeneousViewport extends RenderObjectWidget { this.itemExtent, // required this.itemCount, // optional, but you cannot shrink-wrap this class or otherwise use its intrinsic dimensions if you don't specify it this.direction: ScrollDirection.vertical, - this.startOffset: 0.0 + this.startOffset: 0.0, + this.overlayPainter }) : super(key: key) { assert(itemExtent != null); } @@ -29,6 +30,7 @@ class HomogeneousViewport extends RenderObjectWidget { final int itemCount; final ScrollDirection direction; final double startOffset; + final Painter overlayPainter; _HomogeneousViewportElement createElement() => new _HomogeneousViewportElement(this); @@ -70,6 +72,7 @@ class _HomogeneousViewportElement extends RenderObjectElement extends State { return _scrollBehavior; } + GestureDragStartCallback _getDragStartHandler(ScrollDirection direction) { + if (config.scrollDirection != direction || !scrollBehavior.isScrollable) + return null; + return _handleDragStart; + } + GestureDragUpdateCallback _getDragUpdateHandler(ScrollDirection direction) { if (config.scrollDirection != direction || !scrollBehavior.isScrollable) return null; @@ -88,8 +98,10 @@ abstract class ScrollableState extends State { Widget build(BuildContext context) { return new GestureDetector( + onVerticalDragStart: _getDragStartHandler(ScrollDirection.vertical), onVerticalDragUpdate: _getDragUpdateHandler(ScrollDirection.vertical), onVerticalDragEnd: _getDragEndHandler(ScrollDirection.vertical), + onHorizontalDragStart: _getDragStartHandler(ScrollDirection.horizontal), onHorizontalDragUpdate: _getDragUpdateHandler(ScrollDirection.horizontal), onHorizontalDragEnd: _getDragEndHandler(ScrollDirection.horizontal), child: new Listener( @@ -199,12 +211,22 @@ abstract class ScrollableState extends State { return _startToEndAnimation(); } + void dispatchOnScrollStart() { + if (config.onScrollStart != null) + config.onScrollStart(_scrollOffset); + } + // Derived classes can override this method and call super.dispatchOnScroll() void dispatchOnScroll() { if (config.onScroll != null) config.onScroll(_scrollOffset); } + void dispatchOnScrollEnd() { + if (config.onScrollEnd != null) + config.onScrollEnd(_scrollOffset); + } + double _scrollVelocity(ui.Offset velocity) { double scrollVelocity = config.scrollDirection == ScrollDirection.horizontal ? -velocity.dx @@ -216,14 +238,20 @@ abstract class ScrollableState extends State { _animation.stop(); } + void _handleDragStart() { + scheduleMicrotask(dispatchOnScrollStart); + } + void _handleDragUpdate(double delta) { // We negate the delta here because a positive scroll offset moves the // the content up (or to the left) rather than down (or the right). scrollBy(-delta); } - void _handleDragEnd(Offset velocity) { - fling(velocity); + Future _handleDragEnd(Offset velocity) { + return fling(velocity).then((_) { + dispatchOnScrollEnd(); + }); } } @@ -379,6 +407,52 @@ class Block extends StatelessComponent { } } +abstract class ScrollableListPainter extends Painter { + void attach(RenderObject renderObject) { + assert(renderObject is RenderBlockViewport); + super.attach(renderObject); + } + + RenderBlockViewport get renderer => renderObject; + + bool get isVertical => renderer.isVertical; + + Size get viewportSize => renderer.size; + + double get contentExtent => _contentExtent; + double _contentExtent = 0.0; + void set contentExtent (double value) { + assert(value != null); + assert(value >= 0.0); + if (_contentExtent == value) + return; + _contentExtent = value; + renderer?.markNeedsPaint(); + } + + double get scrollOffset => _scrollOffset; + double _scrollOffset = 0.0; + void set scrollOffset (double value) { + assert(value != null); + assert(value >= 0.0 && value <= 1.0); + if (_scrollOffset == value) + return; + _scrollOffset = value; + renderer?.markNeedsPaint(); + } + + /// Called when a scroll starts. Subclasses may override this method to + /// initialize some state or to play an animation. The returned Future should + /// complete when the computation triggered by this method has finished. + Future scrollStarted() => new Future.value(); + + + /// Similar to scrollStarted(). Called when a scroll ends. For fling scrolls + /// "ended" means that the scroll animation either stopped of its own accord + /// or was canceled by the user. + Future scrollEnded() => new Future.value(); +} + /// An optimized scrollable widget for a large number of children that are all /// the same size (extent) in the scrollDirection. For example for /// ScrollDirection.vertical itemExtent is the height of each item. Use this @@ -394,7 +468,8 @@ abstract class ScrollableWidgetList extends Scrollable { double snapAlignmentOffset: 0.0, this.itemsWrap: false, this.itemExtent, - this.padding + this.padding, + this.scrollableListPainter }) : super( key: key, initialScrollOffset: initialScrollOffset, @@ -409,6 +484,7 @@ abstract class ScrollableWidgetList extends Scrollable { final bool itemsWrap; final double itemExtent; final EdgeDims padding; + final ScrollableListPainter scrollableListPainter; } abstract class ScrollableWidgetListState extends ScrollableState { @@ -480,18 +556,40 @@ abstract class ScrollableWidgetListState extends return new EdgeDims.only(top: padding.top, bottom: padding.bottom); } - void _updateScrollBehavior() { - // if you don't call this from build(), you must call it from setState(). + double get _contentExtent { double contentExtent = config.itemExtent * itemCount; if (config.padding != null) contentExtent += _leadingPadding + _trailingPadding; + return contentExtent; + } + + void _updateScrollBehavior() { + // if you don't call this from build(), you must call it from setState(). + if (config.scrollableListPainter != null) + config.scrollableListPainter.contentExtent = _contentExtent; scrollTo(scrollBehavior.updateExtents( - contentExtent: contentExtent, + contentExtent: _contentExtent, containerExtent: _containerExtent, scrollOffset: scrollOffset )); } + void dispatchOnScrollStart() { + super.dispatchOnScrollStart(); + config.scrollableListPainter?.scrollStarted(); + } + + void dispatchOnScroll() { + super.dispatchOnScroll(); + if (config.scrollableListPainter != null) + config.scrollableListPainter.scrollOffset = scrollOffset; + } + + void dispatchOnScrollEnd() { + super.dispatchOnScrollEnd(); + config.scrollableListPainter?.scrollEnded(); + } + Widget buildContent(BuildContext context) { if (itemCount != _previousItemCount) { _previousItemCount = itemCount; @@ -508,7 +606,8 @@ abstract class ScrollableWidgetListState extends itemExtent: config.itemExtent, itemCount: itemCount, direction: config.scrollDirection, - startOffset: scrollOffset - _leadingPadding + startOffset: scrollOffset - _leadingPadding, + overlayPainter: config.scrollableListPainter ) ) ); @@ -541,7 +640,8 @@ class ScrollableList extends ScrollableWidgetList { this.itemBuilder, itemsWrap: false, double itemExtent, - EdgeDims padding + EdgeDims padding, + ScrollableListPainter scrollableListPainter }) : super( key: key, initialScrollOffset: initialScrollOffset, @@ -551,7 +651,9 @@ class ScrollableList extends ScrollableWidgetList { snapAlignmentOffset: snapAlignmentOffset, itemsWrap: itemsWrap, itemExtent: itemExtent, - padding: padding); + padding: padding, + scrollableListPainter: scrollableListPainter + ); final List items; final ItemBuilder itemBuilder; From 7946dc3a3485ee1b044e697d41830e67edc1aa79 Mon Sep 17 00:00:00 2001 From: Hixie Date: Fri, 9 Oct 2015 11:08:13 -0700 Subject: [PATCH 10/13] Write down some unwritten rules of Flutter development. --- examples/widgets/README | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 examples/widgets/README diff --git a/examples/widgets/README b/examples/widgets/README new file mode 100644 index 0000000000..54c151f8bb --- /dev/null +++ b/examples/widgets/README @@ -0,0 +1,12 @@ +Small examples of the Flutter widget framework +============================================== + +To run these, open a terminal in this directory and use the following +command: + +```bash +pub global activate flutter +flutter start --checked -t foo.dart +``` + +...where `foo.dart` is the file you want to run. From 1beda0d6bf9c261841bb2df9c35aebb808a541a3 Mon Sep 17 00:00:00 2001 From: Jason Simmons Date: Wed, 14 Oct 2015 12:20:58 -0700 Subject: [PATCH 11/13] Update the package versions of flutter and flutter_sprites --- packages/flutter/pubspec.yaml | 6 +++--- packages/flutter_sprites/pubspec.yaml | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/flutter/pubspec.yaml b/packages/flutter/pubspec.yaml index fbba750a87..4ea141a4e7 100644 --- a/packages/flutter/pubspec.yaml +++ b/packages/flutter/pubspec.yaml @@ -1,5 +1,5 @@ name: flutter -version: 0.0.4 +version: 0.0.5 author: Flutter Authors description: A framework for writing Flutter applications homepage: http://flutter.io @@ -9,8 +9,8 @@ dependencies: mojo_services: '>=0.3.0 <0.4.0' mojo: '>=0.2.0 <0.3.0' newton: '>=0.1.4 <0.2.0' - sky_engine: '>=0.0.35 <0.1.0' - sky_services: '>=0.0.35 <0.1.0' + sky_engine: 0.0.36 + sky_services: 0.0.36 sky_tools: '>=0.0.20 <0.1.0' vector_math: '>=1.4.3 <2.0.0' intl: '>=0.12.4+2 <0.13.0' diff --git a/packages/flutter_sprites/pubspec.yaml b/packages/flutter_sprites/pubspec.yaml index a95f819395..b1afc598c5 100644 --- a/packages/flutter_sprites/pubspec.yaml +++ b/packages/flutter_sprites/pubspec.yaml @@ -1,9 +1,9 @@ name: flutter_sprites description: A sprite toolkit built on top of Flutter -version: 0.0.2 +version: 0.0.3 author: Flutter Authors homepage: http://flutter.io dependencies: - flutter: ">=0.0.4 <0.1.0" + flutter: ">=0.0.5 <0.1.0" sky_tools: ">=0.0.20 <0.1.0" box2d: ">=0.2.0 <0.3.0" From 29f2a0f2270955b34502e471b82c53b81e291736 Mon Sep 17 00:00:00 2001 From: Viktor Lidholt Date: Wed, 14 Oct 2015 12:58:47 -0700 Subject: [PATCH 12/13] Adds missing sprite physics shapes --- .../lib/src/physics_shape.dart | 76 ++++++++++++++++++- 1 file changed, 75 insertions(+), 1 deletion(-) diff --git a/packages/flutter_sprites/lib/src/physics_shape.dart b/packages/flutter_sprites/lib/src/physics_shape.dart index 4a98d39eec..2669aeb2be 100644 --- a/packages/flutter_sprites/lib/src/physics_shape.dart +++ b/packages/flutter_sprites/lib/src/physics_shape.dart @@ -32,7 +32,6 @@ class PhysicsShapeCircle extends PhysicsShape { } class PhysicsShapePolygon extends PhysicsShape { - PhysicsShapePolygon(this.points); final List points; @@ -53,6 +52,81 @@ class PhysicsShapePolygon extends PhysicsShape { } } +class PhysicsShapeBox extends PhysicsShape { + PhysicsShapeBox( + this.width, + this.height, [ + this.center = Point.origin, + this.rotation = 0.0 + ]); + + final double width; + final double height; + final Point center; + final double rotation; + + box2d.Shape _createB2Shape(PhysicsNode node) { + box2d.PolygonShape shape = new box2d.PolygonShape(); + shape.setAsBox( + width / node.b2WorldToNodeConversionFactor, + height / node.b2WorldToNodeConversionFactor, + new Vector2( + center.x / node.b2WorldToNodeConversionFactor, + center.y / node.b2WorldToNodeConversionFactor + ), + radians(rotation) + ); + return shape; + } +} + +class PhysicsShapeChain extends PhysicsShape { + PhysicsShapeChain(this.points, [this.loop=false]); + + final List points; + final bool loop; + + box2d.Shape _createB2Shape(PhysicsNode node) { + List vectors = []; + for (Point point in points) { + Vector2 vec = new Vector2( + point.x / node.b2WorldToNodeConversionFactor, + point.y / node.b2WorldToNodeConversionFactor + ); + vectors.add(vec); + } + + box2d.ChainShape shape = new box2d.ChainShape(); + if (loop) + shape.createLoop(vectors, vectors.length); + else + shape.createChain(vectors, vectors.length); + return shape; + } +} + +class PhysicsShapeEdge extends PhysicsShape { + PhysicsShapeEdge(this.pointA, this.pointB); + + final Point pointA; + final Point pointB; + + box2d.Shape _createB2Shape(PhysicsNode node) { + box2d.EdgeShape shape = new box2d.EdgeShape(); + shape.set( + new Vector2( + pointA.x / node.b2WorldToNodeConversionFactor, + pointA.y / node.b2WorldToNodeConversionFactor + ), + new Vector2( + pointB.x / node.b2WorldToNodeConversionFactor, + pointB.y / node.b2WorldToNodeConversionFactor + ) + ); + return shape; + } +} + class PhysicsShapeGroup extends PhysicsShape { PhysicsShapeGroup(this.shapes); From 52c1fe5105030458851d5cd475dd14f5ab4ee5e2 Mon Sep 17 00:00:00 2001 From: Kris Giesing Date: Wed, 14 Oct 2015 13:09:51 -0700 Subject: [PATCH 13/13] Refactor to move conversion into the binding class --- packages/flutter/lib/src/gestures/events.dart | 62 +-------- .../flutter/lib/src/rendering/binding.dart | 120 ++++++++++++++---- 2 files changed, 100 insertions(+), 82 deletions(-) diff --git a/packages/flutter/lib/src/gestures/events.dart b/packages/flutter/lib/src/gestures/events.dart index 031017b1f2..722b9984a9 100644 --- a/packages/flutter/lib/src/gestures/events.dart +++ b/packages/flutter/lib/src/gestures/events.dart @@ -2,25 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'dart:ui' as ui; - /// Base class for input events. class InputEvent { const InputEvent({ this.type, this.timeStamp: 0.0 }); - factory InputEvent.fromUiEvent(ui.Event event) { - if (event is ui.PointerEvent) - return new PointerInputEvent.fromUiEvent(event); - - // Default event - return new InputEvent( - type: event.type, - timeStamp: event.timeStamp - ); - } - 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; } @@ -55,53 +44,6 @@ class PointerInputEvent extends InputEvent { this.tilt }) : super(type: type, timeStamp: timeStamp); - factory PointerInputEvent.fromUiEvent(ui.PointerEvent event) { - PointerInputEvent result = new PointerInputEvent( - type: event.type, - timeStamp: event.timeStamp, - pointer: _getPointerValue(event.type, event.pointer), - kind: event.kind, - x: event.x, - y: event.y, - dx: event.dx, - dy: event.dy, - buttons: event.buttons, - down: event.down, - primary: event.primary, - obscured: event.obscured, - pressure: event.pressure, - pressureMin: event.pressureMin, - pressureMax: event.pressureMax, - distance: event.distance, - distanceMin: event.distanceMin, - distanceMax: event.distanceMax, - radiusMajor: event.radiusMajor, - radiusMinor: event.radiusMinor, - radiusMin: event.radiusMin, - radiusMax: event.radiusMax, - orientation: event.orientation, - tilt: event.tilt - ); - return result; - } - - // Map actual input pointer value to a unique value - // Since events are serialized we can just use a counter - static Map _pointerMap = new Map(); - static int _pointerCount = 0; - - static int _getPointerValue(String eventType, int pointer) { - int result; - if (eventType == 'pointerdown') { - result = pointer; - _pointerMap[pointer] = _pointerCount; - _pointerCount++; - } else { - result = _pointerMap[pointer]; - } - return result; - } - final int pointer; final String kind; final double x; diff --git a/packages/flutter/lib/src/rendering/binding.dart b/packages/flutter/lib/src/rendering/binding.dart index 99685d3d34..3484b40469 100644 --- a/packages/flutter/lib/src/rendering/binding.dart +++ b/packages/flutter/lib/src/rendering/binding.dart @@ -23,12 +23,6 @@ int _hammingWeight(int value) { return weight; } -class _PointerState { - _PointerState({ this.result, this.lastPosition }); - HitTestResult result; - Point lastPosition; -} - typedef void EventListener(InputEvent event); /// A hit test entry used by [FlutterBinding] @@ -39,6 +33,93 @@ class BindingHitTestEntry extends HitTestEntry { final HitTestResult result; } +/// State used in converting ui.Event to InputEvent +class _PointerState { + _PointerState({ this.pointer, this.lastPosition }); + int pointer; + Point lastPosition; +} + +class _UiEventConverter { + static InputEvent convert(ui.Event event) { + if (event is ui.PointerEvent) + return convertPointerEvent(event); + + // Default event + return new InputEvent( + type: event.type, + timeStamp: event.timeStamp + ); + } + + // Map actual input pointer value to a unique value + // Since events are serialized we can just use a counter + static Map _stateForPointer = new Map(); + static int _pointerCount = 0; + + static PointerInputEvent convertPointerEvent(ui.PointerEvent event) { + Point position = new Point(event.x, event.y); + + _PointerState state = _stateForPointer[event.pointer]; + double dx, dy; + switch (event.type) { + case 'pointerdown': + if (state == null) { + state = new _PointerState(lastPosition: position); + _stateForPointer[event.pointer] = state; + } + state.pointer = _pointerCount; + _pointerCount++; + break; + case 'pointermove': + // state == null means the pointer is hovering + if (state != null) { + dx = position.x - state.lastPosition.x; + dy = position.y - state.lastPosition.y; + state.lastPosition = position; + } + break; + case 'pointerup': + case 'pointercancel': + // state == null indicates spurious events + if (state != null) { + // Only remove the pointer state when the last button has been released. + if (_hammingWeight(event.buttons) <= 1) + _stateForPointer.remove(event.pointer); + } + break; + } + + return new PointerInputEvent( + type: event.type, + timeStamp: event.timeStamp, + pointer: state.pointer, + kind: event.kind, + x: event.x, + y: event.y, + dx: dx, + dy: dy, + buttons: event.buttons, + down: event.down, + primary: event.primary, + obscured: event.obscured, + pressure: event.pressure, + pressureMin: event.pressureMin, + pressureMax: event.pressureMax, + distance: event.distance, + distanceMin: event.distanceMin, + distanceMax: event.distanceMax, + radiusMajor: event.radiusMajor, + radiusMinor: event.radiusMinor, + radiusMin: event.radiusMin, + radiusMax: event.radiusMax, + orientation: event.orientation, + tilt: event.tilt + ); + } + +} + /// The glue between the render tree and the Flutter engine class FlutterBinding extends HitTestTarget { @@ -95,7 +176,7 @@ class FlutterBinding extends HitTestTarget { bool removeEventListener(EventListener listener) => _eventListeners.remove(listener); void _handleEvent(ui.Event event) { - InputEvent ourEvent = new InputEvent.fromUiEvent(event); + InputEvent ourEvent = _UiEventConverter.convert(event); if (ourEvent is PointerInputEvent) { _handlePointerInputEvent(ourEvent); } else { @@ -110,41 +191,36 @@ class FlutterBinding extends HitTestTarget { /// State for all pointers which are currently down. /// We do not track the state of hovering pointers because we need /// to hit-test them on each movement. - Map _stateForPointer = new Map(); + Map _resultForPointer = new Map(); void _handlePointerInputEvent(PointerInputEvent event) { - Point position = new Point(event.x, event.y); - - _PointerState state = _stateForPointer[event.pointer]; + HitTestResult result = _resultForPointer[event.pointer]; switch (event.type) { case 'pointerdown': - if (state == null) { - state = new _PointerState(result: hitTest(position), lastPosition: position); - _stateForPointer[event.pointer] = state; + if (result == null) { + result = hitTest(new Point(event.x, event.y)); + _resultForPointer[event.pointer] = result; } break; case 'pointermove': - if (state == null) { + if (result == null) { // The pointer is hovering, ignore it for now since we don't // know what to do with it yet. return; } - event.dx = position.x - state.lastPosition.x; - event.dy = position.y - state.lastPosition.y; - state.lastPosition = position; break; case 'pointerup': case 'pointercancel': - if (state == null) { + if (result == null) { // This seems to be a spurious event. Ignore it. return; } - // Only remove the pointer state when the last button has been released. + // Only remove the hit test result when the last button has been released. if (_hammingWeight(event.buttons) <= 1) - _stateForPointer.remove(event.pointer); + _resultForPointer.remove(event.pointer); break; } - dispatchEvent(event, state.result); + dispatchEvent(event, result); } /// Determine which [HitTestTarget] objects are located at a given position