diff --git a/build/symlink.py b/build/symlink.py index aade2f865c7a1..1c5d3ddf183a6 100755 --- a/build/symlink.py +++ b/build/symlink.py @@ -2,43 +2,38 @@ # Copyright (c) 2013 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. - """Make a symlink and optionally touch a file (to handle dependencies).""" - - import errno import optparse import os.path +import shutil import sys - - def Main(argv): parser = optparse.OptionParser() parser.add_option('-f', '--force', action='store_true') parser.add_option('--touch') - options, args = parser.parse_args(argv[1:]) if len(args) < 2: parser.error('at least two arguments required.') - target = args[-1] sources = args[:-1] for s in sources: t = os.path.join(target, os.path.basename(s)) + if len(sources) == 1 and not os.path.isdir(target): + t = target try: os.symlink(s, t) except OSError, e: if e.errno == errno.EEXIST and options.force: - os.remove(t) + if os.path.isdir(t): + shutil.rmtree(t, ignore_errors=True) + else: + os.remove(t) os.symlink(s, t) else: raise - - if options.touch: with open(options.touch, 'w') as f: pass - - if __name__ == '__main__': sys.exit(Main(sys.argv)) diff --git a/sky/sdk/example/stocks/lib/stock_home.dart b/sky/sdk/example/stocks/lib/stock_home.dart index b7a314c160ac9..9fcfdec7749c9 100644 --- a/sky/sdk/example/stocks/lib/stock_home.dart +++ b/sky/sdk/example/stocks/lib/stock_home.dart @@ -5,6 +5,7 @@ import 'package:sky/editing/input.dart'; import 'package:sky/animation/animation_performance.dart'; import 'package:sky/widgets/animated_component.dart'; +import 'package:sky/widgets/animated_container.dart'; import 'package:sky/widgets/animation_builder.dart'; import 'package:sky/theme/colors.dart' as colors; import 'package:sky/widgets/basic.dart'; @@ -25,6 +26,8 @@ import 'package:sky/widgets/tabs.dart'; import 'package:sky/widgets/theme.dart'; import 'package:sky/widgets/tool_bar.dart'; import 'package:sky/widgets/widget.dart'; +import 'package:vector_math/vector_math.dart'; +import 'package:sky/animation/curves.dart'; import 'stock_data.dart'; import 'stock_list.dart'; @@ -35,7 +38,7 @@ typedef void ModeUpdater(StockMode mode); const Duration _kSnackbarSlideDuration = const Duration(milliseconds: 200); -class StockHome extends AnimatedComponent { +class StockHome extends StatefulComponent { StockHome(this.navigator, this.stocks, this.stockMode, this.modeUpdater); @@ -54,7 +57,7 @@ class StockHome extends AnimatedComponent { bool _isSearching = false; String _searchQuery; - AnimationBuilder _snackbarTransform; + Matrix4 _snackbarPosition = new Matrix4.identity(); void _handleSearchBegin() { navigator.pushState(this, (_) { @@ -263,28 +266,34 @@ class StockHome extends AnimatedComponent { void _handleUndo() { setState(() { - _snackbarTransform = null; + // TODO(mpcomplete): ideally this will continue showing the snackbar + // until the animation is finished, but we have no notification of that. + _isSnackbarShowing = false; + _snackbarPosition = new Matrix4.identity(); }); } + bool _isSnackbarShowing = false; Widget buildSnackBar() { - if (_snackbarTransform == null) - return null; - return _snackbarTransform.build( - new SnackBar( + var widget = null; + if (_isSnackbarShowing) { + widget = new SnackBar( content: new Text("Stock purchased!"), actions: [new SnackBarAction(label: "UNDO", onPressed: _handleUndo)] - )); + ); + } + return new AnimatedContainer( + duration: _kSnackbarSlideDuration, + transform: _snackbarPosition, + child: widget + ); } void _handleStockPurchased() { setState(() { - _snackbarTransform = new AnimationBuilder() - ..position = new AnimatedType(const Point(0.0, 45.0), end: Point.origin); - var performance = _snackbarTransform.createPerformance( - [_snackbarTransform.position], duration: _kSnackbarSlideDuration); - watch(performance); - performance.play(); + _isSnackbarShowing = true; + // TODO(mpcomplete): should use actual snackbar height somehow. + _snackbarPosition = new Matrix4.identity()..translate(0.0, -50.0); }); } @@ -294,8 +303,7 @@ class StockHome extends AnimatedComponent { backgroundColor: colors.RedAccent[200], onPressed: _handleStockPurchased ); - if (_snackbarTransform != null) - widget = _snackbarTransform.build(widget); + widget = new AnimatedContainer(duration: _kSnackbarSlideDuration, transform: _snackbarPosition, child: widget); return widget; } diff --git a/sky/sdk/lib/animation/timeline.dart b/sky/sdk/lib/animation/timeline.dart index 680130d76bc43..fa8a2f3c68204 100644 --- a/sky/sdk/lib/animation/timeline.dart +++ b/sky/sdk/lib/animation/timeline.dart @@ -15,7 +15,7 @@ class TweenSimulation extends Simulation { TweenSimulation(Duration duration, this.begin, this.end) : _durationInSeconds = duration.inMilliseconds / 1000.0 { - assert(_durationInSeconds > 0.0); +// assert(_durationInSeconds > 0.0); assert(begin != null && begin >= 0.0 && begin <= 1.0); assert(end != null && end >= 0.0 && end <= 1.0); } diff --git a/sky/sdk/lib/widgets/animated_container.dart b/sky/sdk/lib/widgets/animated_container.dart index 1898664e4622f..b88383fc59a38 100644 --- a/sky/sdk/lib/widgets/animated_container.dart +++ b/sky/sdk/lib/widgets/animated_container.dart @@ -52,6 +52,21 @@ class AnimatedEdgeDimsValue extends AnimatedType { } } +class AnimatedMatrix4 extends AnimatedType { + AnimatedMatrix4(Matrix4 begin, { Matrix4 end, Curve curve: linear }) + : super(begin, end: end, curve: curve); + + void setFraction(double t) { + if (t == 1.0) { + value = end; + return; + } + // TODO(mpcomplete): lerp the whole matrix (can we just lerp each cell?). + Vector3 trans = begin.getTranslation()*(1.0 - t) + end.getTranslation() * t; + value = new Matrix4.identity()..translate(trans); + } +} + class ImplicitlyAnimatedValue { final AnimationPerformance performance = new AnimationPerformance(); final AnimatedType _variable; @@ -85,9 +100,11 @@ class AnimatedContainer extends AnimatedComponent { this.height, this.margin, this.padding, +this.debug: false, this.transform }) : super(key: key); + bool debug = false; Widget child; Duration duration; // TODO(abarth): Support separate durations for each value. BoxConstraints constraints; @@ -116,6 +133,7 @@ class AnimatedContainer extends AnimatedComponent { decoration = source.decoration; margin = source.margin; padding = source.padding; + transform = source.transform; width = source.width; height = source.height; _updateFields(); @@ -168,7 +186,7 @@ class AnimatedContainer extends AnimatedComponent { void _updateTransform() { _updateField(transform, _transform, () { - _transform = new ImplicitlyAnimatedValue(new AnimatedType(transform), duration); + _transform = new ImplicitlyAnimatedValue(new AnimatedMatrix4(transform), duration); watch(_transform.performance); }); } diff --git a/sky/sdk/lib/widgets/dismissable.dart b/sky/sdk/lib/widgets/dismissable.dart index a96612e649e77..be2977e38784f 100644 --- a/sky/sdk/lib/widgets/dismissable.dart +++ b/sky/sdk/lib/widgets/dismissable.dart @@ -13,7 +13,7 @@ import 'package:vector_math/vector_math.dart'; const Duration _kCardDismissFadeout = const Duration(milliseconds: 300); const double _kMinFlingVelocity = 700.0; const double _kMinFlingVelocityDelta = 400.0; -const double _kFlingVelocityScale = 1.0/300.0; +const double _kFlingVelocityScale = 1.0 / 300.0; const double _kDismissCardThreshold = 0.6; typedef void DismissedCallback(); diff --git a/sky/sdk/lib/widgets/drawer.dart b/sky/sdk/lib/widgets/drawer.dart index 60f3682e8263a..bb3f27264f63f 100644 --- a/sky/sdk/lib/widgets/drawer.dart +++ b/sky/sdk/lib/widgets/drawer.dart @@ -30,7 +30,7 @@ import 'package:vector_math/vector_math.dart'; const double _kWidth = 304.0; const double _kMinFlingVelocity = 365.0; -const double _kFlingVelocityScale = 1.0/300.0; +const double _kFlingVelocityScale = 1.0 / 300.0; const Duration _kBaseSettleDuration = const Duration(milliseconds: 246); const Point _kOpenPosition = Point.origin; const Point _kClosedPosition = const Point(-_kWidth, 0.0); diff --git a/sky/sdk/lib/widgets/material.dart b/sky/sdk/lib/widgets/material.dart index aa44a68b7d071..33d6f8c193f91 100644 --- a/sky/sdk/lib/widgets/material.dart +++ b/sky/sdk/lib/widgets/material.dart @@ -49,7 +49,7 @@ class Material extends Component { Widget build() { return new AnimatedContainer( - duration: const Duration(milliseconds: 1000), + duration: const Duration(milliseconds: 200), decoration: new BoxDecoration( backgroundColor: _backgroundColor, borderRadius: edges[type], diff --git a/sky/sdk/lib/widgets/scaffold.dart b/sky/sdk/lib/widgets/scaffold.dart index 524d38419082f..76fa92ac90a8a 100644 --- a/sky/sdk/lib/widgets/scaffold.dart +++ b/sky/sdk/lib/widgets/scaffold.dart @@ -117,19 +117,17 @@ class RenderScaffold extends RenderBox { assert(body.parentData is BoxParentData); body.parentData.position = new Point(0.0, bodyPosition); } - double snackBarHeight = 0.0; if (_slots[ScaffoldSlots.snackBar] != null) { RenderBox snackBar = _slots[ScaffoldSlots.snackBar]; // TODO(jackson): On tablet/desktop, minWidth = 288, maxWidth = 568 snackBar.layout(new BoxConstraints(minWidth: size.width, maxWidth: size.width, minHeight: 0.0, maxHeight: size.height), parentUsesSize: true); assert(snackBar.parentData is BoxParentData); - snackBar.parentData.position = new Point(0.0, size.height - snackBar.size.height); - snackBarHeight = snackBar.size.height; + snackBar.parentData.position = new Point(0.0, size.height); } if (_slots[ScaffoldSlots.floatingActionButton] != null) { RenderBox floatingActionButton = _slots[ScaffoldSlots.floatingActionButton]; - Size area = new Size(size.width - kButtonX, size.height - kButtonY - snackBarHeight); + Size area = new Size(size.width - kButtonX, size.height - kButtonY); floatingActionButton.layout(new BoxConstraints.loose(area), parentUsesSize: true); assert(floatingActionButton.parentData is BoxParentData); floatingActionButton.parentData.position = (area - floatingActionButton.size).toPoint();