| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 import '../animation/fling_curve.dart'; | 5 import '../animation/fling_curve.dart'; |
| 6 import '../animation/scroll_curve.dart'; |
| 6 import '../fn.dart'; | 7 import '../fn.dart'; |
| 7 import 'dart:sky' as sky; | 8 import 'dart:sky' as sky; |
| 8 | 9 |
| 9 abstract class Scrollable extends Component { | 10 abstract class Scrollable extends Component { |
| 10 double minOffset; | 11 ScrollCurve scrollCurve; |
| 11 double maxOffset; | |
| 12 | |
| 13 double get scrollOffset => _scrollOffset; | 12 double get scrollOffset => _scrollOffset; |
| 14 | 13 |
| 15 double _scrollOffset = 0.0; | 14 double _scrollOffset = 0.0; |
| 16 FlingCurve _flingCurve; | 15 FlingCurve _flingCurve; |
| 17 int _flingAnimationId; | 16 int _flingAnimationId; |
| 18 | 17 |
| 19 Scrollable({ | 18 Scrollable({Object key, this.scrollCurve}) : super(key: key) { |
| 20 Object key, | |
| 21 this.minOffset, | |
| 22 this.maxOffset | |
| 23 }) : super(key: key) { | |
| 24 events.listen('gestureflingstart', _handleFlingStart); | 19 events.listen('gestureflingstart', _handleFlingStart); |
| 25 events.listen('gestureflingcancel', _handleFlingCancel); | 20 events.listen('gestureflingcancel', _handleFlingCancel); |
| 26 events.listen('gesturescrollupdate', _handleScrollUpdate); | 21 events.listen('gesturescrollupdate', _handleScrollUpdate); |
| 27 events.listen('wheel', _handleWheel); | 22 events.listen('wheel', _handleWheel); |
| 28 } | 23 } |
| 29 | 24 |
| 30 void didUnmount() { | 25 void didUnmount() { |
| 31 super.didUnmount(); | 26 super.didUnmount(); |
| 32 _stopFling(); | 27 _stopFling(); |
| 33 } | 28 } |
| 34 | 29 |
| 35 bool scrollBy(double scrollDelta) { | 30 bool scrollBy(double scrollDelta) { |
| 36 var newScrollOffset = _scrollOffset + scrollDelta; | 31 var newScrollOffset = scrollCurve.apply(_scrollOffset, scrollDelta); |
| 37 if (minOffset != null && newScrollOffset < minOffset) | |
| 38 newScrollOffset = minOffset; | |
| 39 else if (maxOffset != null && newScrollOffset > maxOffset) | |
| 40 newScrollOffset = maxOffset; | |
| 41 | |
| 42 if (newScrollOffset == _scrollOffset) | 32 if (newScrollOffset == _scrollOffset) |
| 43 return false; | 33 return false; |
| 44 | |
| 45 setState(() { | 34 setState(() { |
| 46 _scrollOffset = newScrollOffset; | 35 _scrollOffset = newScrollOffset; |
| 47 }); | 36 }); |
| 48 return true; | 37 return true; |
| 49 } | 38 } |
| 50 | 39 |
| 51 void _scheduleFlingUpdate() { | 40 void _scheduleFlingUpdate() { |
| 52 _flingAnimationId = sky.window.requestAnimationFrame(_updateFling); | 41 _flingAnimationId = sky.window.requestAnimationFrame(_updateFling); |
| 53 } | 42 } |
| 54 | 43 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 79 } | 68 } |
| 80 | 69 |
| 81 void _handleFlingCancel(sky.GestureEvent event) { | 70 void _handleFlingCancel(sky.GestureEvent event) { |
| 82 _stopFling(); | 71 _stopFling(); |
| 83 } | 72 } |
| 84 | 73 |
| 85 void _handleWheel(sky.WheelEvent event) { | 74 void _handleWheel(sky.WheelEvent event) { |
| 86 scrollBy(-event.offsetY); | 75 scrollBy(-event.offsetY); |
| 87 } | 76 } |
| 88 } | 77 } |
| OLD | NEW |