Index: sky/sdk/lib/framework/widgets/drawer.dart |
diff --git a/sky/sdk/lib/framework/widgets/drawer.dart b/sky/sdk/lib/framework/widgets/drawer.dart |
deleted file mode 100644 |
index 19faed8c010cd9f69a7d52cd41009602e06a6dd9..0000000000000000000000000000000000000000 |
--- a/sky/sdk/lib/framework/widgets/drawer.dart |
+++ /dev/null |
@@ -1,166 +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. |
- |
-import 'dart:math' as math; |
-import 'dart:sky' as sky; |
- |
-import 'package:vector_math/vector_math.dart'; |
- |
-import '../animation/animated_value.dart'; |
-import '../animation/curves.dart'; |
-import '../theme2/colors.dart'; |
-import '../theme2/shadows.dart'; |
-import 'animated_component.dart'; |
-import 'basic.dart'; |
- |
-// TODO(eseidel): Draw width should vary based on device size: |
-// http://www.google.com/design/spec/layout/structure.html#structure-side-nav |
- |
-// Mobile: |
-// Width = Screen width − 56 dp |
-// Maximum width: 320dp |
-// Maximum width applies only when using a left nav. When using a right nav, |
-// the panel can cover the full width of the screen. |
- |
-// Desktop/Tablet: |
-// Maximum width for a left nav is 400dp. |
-// The right nav can vary depending on content. |
- |
-const double _kWidth = 304.0; |
-const double _kMinFlingVelocity = 0.4; |
-const double _kBaseSettleDurationMS = 246.0; |
-const double _kMaxSettleDurationMS = 600.0; |
-const Curve _kAnimationCurve = parabolicRise; |
- |
-typedef void DrawerStatusChangeHandler (bool showing); |
- |
-class DrawerController { |
- |
- DrawerController(this.onStatusChange) { |
- position = new AnimatedValue(-_kWidth, onChange: _checkValue); |
- } |
- final DrawerStatusChangeHandler onStatusChange; |
- AnimatedValue position; |
- |
- bool _oldClosedState = true; |
- void _checkValue() { |
- var newClosedState = isClosed; |
- if (onStatusChange != null && _oldClosedState != newClosedState) { |
- onStatusChange(!newClosedState); |
- _oldClosedState = newClosedState; |
- } |
- } |
- |
- bool get isClosed => position.value == -_kWidth; |
- bool get _isMostlyClosed => position.value <= -_kWidth / 2; |
- void toggle() => _isMostlyClosed ? _open() : _close(); |
- |
- void handleMaskTap(_) => _close(); |
- void handlePointerDown(_) => position.stop(); |
- |
- void handlePointerMove(sky.PointerEvent event) { |
- if (position.isAnimating) |
- return; |
- position.value = math.min(0.0, math.max(position.value + event.dx, -_kWidth)); |
- } |
- |
- void handlePointerUp(_) { |
- if (!position.isAnimating) |
- _settle(); |
- } |
- |
- void handlePointerCancel(_) { |
- if (!position.isAnimating) |
- _settle(); |
- } |
- |
- void _open() => _animateToPosition(0.0); |
- |
- void _close() => _animateToPosition(-_kWidth); |
- |
- void _settle() => _isMostlyClosed ? _close() : _open(); |
- |
- void _animateToPosition(double targetPosition) { |
- double distance = (targetPosition - position.value).abs(); |
- if (distance != 0) { |
- double targetDuration = distance / _kWidth * _kBaseSettleDurationMS; |
- double duration = math.min(targetDuration, _kMaxSettleDurationMS); |
- position.animateTo(targetPosition, duration, curve: _kAnimationCurve); |
- } |
- } |
- |
- void handleFlingStart(event) { |
- double direction = event.velocityX.sign; |
- double velocityX = event.velocityX.abs() / 1000; |
- if (velocityX < _kMinFlingVelocity) |
- return; |
- |
- double targetPosition = direction < 0.0 ? -_kWidth : 0.0; |
- double distance = (targetPosition - position.value).abs(); |
- double duration = distance / velocityX; |
- |
- if (distance > 0) |
- position.animateTo(targetPosition, duration, curve: linear); |
- } |
- |
-} |
- |
-class Drawer extends AnimatedComponent { |
- |
- Drawer({ |
- Object key, |
- this.controller, |
- this.children, |
- this.level: 0 |
- }) : super(key: key) { |
- animate(controller.position, (double value) { |
- _position = value; |
- }); |
- } |
- |
- List<UINode> children; |
- int level; |
- DrawerController controller; |
- |
- void syncFields(Drawer source) { |
- children = source.children; |
- level = source.level; |
- controller = source.controller; |
- super.syncFields(source); |
- } |
- |
- double _position; |
- |
- UINode build() { |
- Matrix4 transform = new Matrix4.identity(); |
- transform.translate(_position); |
- |
- double scaler = _position / _kWidth + 1; |
- Color maskColor = new Color.fromARGB((0x7F * scaler).floor(), 0, 0, 0); |
- |
- var mask = new EventListenerNode( |
- new Container(decoration: new BoxDecoration(backgroundColor: maskColor)), |
- onGestureTap: controller.handleMaskTap, |
- onGestureFlingStart: controller.handleFlingStart |
- ); |
- |
- Container content = new Container( |
- decoration: new BoxDecoration( |
- backgroundColor: Grey[50], |
- boxShadow: shadows[level]), |
- width: _kWidth, |
- transform: transform, |
- child: new Block(children) |
- ); |
- |
- return new EventListenerNode( |
- new Stack([ mask, content ]), |
- onPointerDown: controller.handlePointerDown, |
- onPointerMove: controller.handlePointerMove, |
- onPointerUp: controller.handlePointerUp, |
- onPointerCancel: controller.handlePointerCancel |
- ); |
- } |
- |
-} |