| 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 'package:sky/editing/input.dart'; | 5 import 'package:sky/editing/input.dart'; |
| 6 import 'package:sky/animation/animation_performance.dart'; |
| 7 import 'package:sky/widgets/animated_component.dart'; |
| 8 import 'package:sky/widgets/animated_container.dart'; |
| 6 import 'package:sky/widgets/basic.dart'; | 9 import 'package:sky/widgets/basic.dart'; |
| 7 import 'package:sky/widgets/drawer.dart'; | 10 import 'package:sky/widgets/drawer.dart'; |
| 8 import 'package:sky/widgets/drawer_header.dart'; | 11 import 'package:sky/widgets/drawer_header.dart'; |
| 9 import 'package:sky/widgets/floating_action_button.dart'; | 12 import 'package:sky/widgets/floating_action_button.dart'; |
| 10 import 'package:sky/widgets/icon.dart'; | 13 import 'package:sky/widgets/icon.dart'; |
| 11 import 'package:sky/widgets/icon_button.dart'; | 14 import 'package:sky/widgets/icon_button.dart'; |
| 12 import 'package:sky/widgets/menu_divider.dart'; | 15 import 'package:sky/widgets/menu_divider.dart'; |
| 13 import 'package:sky/widgets/menu_item.dart'; | 16 import 'package:sky/widgets/menu_item.dart'; |
| 14 import 'package:sky/widgets/modal_overlay.dart'; | 17 import 'package:sky/widgets/modal_overlay.dart'; |
| 15 import 'package:sky/widgets/navigator.dart'; | 18 import 'package:sky/widgets/navigator.dart'; |
| 16 import 'package:sky/widgets/popup_menu.dart'; | 19 import 'package:sky/widgets/popup_menu.dart'; |
| 17 import 'package:sky/widgets/radio.dart'; | 20 import 'package:sky/widgets/radio.dart'; |
| 18 import 'package:sky/widgets/snack_bar.dart'; | 21 import 'package:sky/widgets/snack_bar.dart'; |
| 19 import 'package:sky/widgets/scaffold.dart'; | 22 import 'package:sky/widgets/scaffold.dart'; |
| 20 import 'package:sky/widgets/tabs.dart'; | 23 import 'package:sky/widgets/tabs.dart'; |
| 21 import 'package:sky/widgets/theme.dart'; | 24 import 'package:sky/widgets/theme.dart'; |
| 22 import 'package:sky/widgets/tool_bar.dart'; | 25 import 'package:sky/widgets/tool_bar.dart'; |
| 23 import 'package:sky/widgets/widget.dart'; | 26 import 'package:sky/widgets/widget.dart'; |
| 24 | 27 |
| 25 import 'stock_data.dart'; | 28 import 'stock_data.dart'; |
| 26 import 'stock_list.dart'; | 29 import 'stock_list.dart'; |
| 27 import 'stock_menu.dart'; | 30 import 'stock_menu.dart'; |
| 28 import 'stock_types.dart'; | 31 import 'stock_types.dart'; |
| 29 | 32 |
| 30 typedef void ModeUpdater(StockMode mode); | 33 typedef void ModeUpdater(StockMode mode); |
| 31 | 34 |
| 32 class StockHome extends StatefulComponent { | 35 const Duration _kSnackbarSlideDuration = const Duration(milliseconds: 200); |
| 36 |
| 37 class StockHome extends AnimatedComponent { |
| 33 | 38 |
| 34 StockHome(this.navigator, this.stocks, this.stockMode, this.modeUpdater) { | 39 StockHome(this.navigator, this.stocks, this.stockMode, this.modeUpdater) { |
| 35 // if (debug) | 40 // if (debug) |
| 36 // new Timer(new Duration(seconds: 1), dumpState); | 41 // new Timer(new Duration(seconds: 1), dumpState); |
| 37 _drawerController = new DrawerController(_handleDrawerStatusChanged); | 42 _drawerController = new DrawerController(_handleDrawerStatusChanged); |
| 38 } | 43 } |
| 39 | 44 |
| 40 Navigator navigator; | 45 Navigator navigator; |
| 41 List<Stock> stocks; | 46 List<Stock> stocks; |
| 42 StockMode stockMode; | 47 StockMode stockMode; |
| 43 ModeUpdater modeUpdater; | 48 ModeUpdater modeUpdater; |
| 44 | 49 |
| 45 void syncFields(StockHome source) { | 50 void syncFields(StockHome source) { |
| 46 navigator = source.navigator; | 51 navigator = source.navigator; |
| 47 stocks = source.stocks; | 52 stocks = source.stocks; |
| 48 stockMode = source.stockMode; | 53 stockMode = source.stockMode; |
| 49 modeUpdater = source.modeUpdater; | 54 modeUpdater = source.modeUpdater; |
| 50 } | 55 } |
| 51 | 56 |
| 52 bool _isSearching = false; | 57 bool _isSearching = false; |
| 53 String _searchQuery; | 58 String _searchQuery; |
| 54 | 59 |
| 55 bool _isShowingSnackBar = false; | 60 AnimatedContainer _snackbarTransform; |
| 56 | 61 |
| 57 void _handleSearchBegin() { | 62 void _handleSearchBegin() { |
| 58 setState(() { | 63 setState(() { |
| 59 _isSearching = true; | 64 _isSearching = true; |
| 60 }); | 65 }); |
| 61 } | 66 } |
| 62 | 67 |
| 63 void _handleSearchEnd() { | 68 void _handleSearchEnd() { |
| 64 setState(() { | 69 setState(() { |
| 65 _isSearching = false; | 70 _isSearching = false; |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 241 center: new Input( | 246 center: new Input( |
| 242 focused: true, | 247 focused: true, |
| 243 placeholder: 'Search stocks', | 248 placeholder: 'Search stocks', |
| 244 onChanged: _handleSearchQueryChanged), | 249 onChanged: _handleSearchQueryChanged), |
| 245 backgroundColor: Theme.of(this).canvasColor | 250 backgroundColor: Theme.of(this).canvasColor |
| 246 ); | 251 ); |
| 247 } | 252 } |
| 248 | 253 |
| 249 void _handleUndo() { | 254 void _handleUndo() { |
| 250 setState(() { | 255 setState(() { |
| 251 _isShowingSnackBar = false; | 256 _snackbarTransform = null; |
| 252 }); | 257 }); |
| 253 } | 258 } |
| 254 | 259 |
| 255 Widget buildSnackBar() { | 260 Widget buildSnackBar() { |
| 256 if (!_isShowingSnackBar) | 261 if (_snackbarTransform == null) |
| 257 return null; | 262 return null; |
| 258 return new SnackBar( | 263 return _snackbarTransform.build( |
| 259 content: new Text("Stock purchased!"), | 264 new SnackBar( |
| 260 actions: [new SnackBarAction(label: "UNDO", onPressed: _handleUndo)] | 265 content: new Text("Stock purchased!"), |
| 261 ); | 266 actions: [new SnackBarAction(label: "UNDO", onPressed: _handleUndo)] |
| 267 )); |
| 262 } | 268 } |
| 263 | 269 |
| 264 void _handleStockPurchased() { | 270 void _handleStockPurchased() { |
| 265 setState(() { | 271 setState(() { |
| 266 _isShowingSnackBar = true; | 272 _snackbarTransform = new AnimatedContainer() |
| 273 ..position = new AnimatedType<Point>(const Point(0.0, 45.0), end: Point.
origin); |
| 274 var performance = _snackbarTransform.createPerformance( |
| 275 _snackbarTransform.position, duration: _kSnackbarSlideDuration); |
| 276 watchPerformance(performance); |
| 277 performance.play(); |
| 267 }); | 278 }); |
| 268 } | 279 } |
| 269 | 280 |
| 270 Widget buildFloatingActionButton() { | 281 Widget buildFloatingActionButton() { |
| 271 return new FloatingActionButton( | 282 var widget = new FloatingActionButton( |
| 272 child: new Icon(type: 'content/add_white', size: 24), | 283 child: new Icon(type: 'content/add_white', size: 24), |
| 273 onPressed: _handleStockPurchased | 284 onPressed: _handleStockPurchased |
| 274 ); | 285 ); |
| 286 if (_snackbarTransform != null) |
| 287 widget = _snackbarTransform.build(widget); |
| 288 return widget; |
| 275 } | 289 } |
| 276 | 290 |
| 277 void addMenuToOverlays(List<Widget> overlays) { | 291 void addMenuToOverlays(List<Widget> overlays) { |
| 278 if (_menuController == null) | 292 if (_menuController == null) |
| 279 return; | 293 return; |
| 280 overlays.add(new ModalOverlay( | 294 overlays.add(new ModalOverlay( |
| 281 children: [new StockMenu( | 295 children: [new StockMenu( |
| 282 controller: _menuController, | 296 controller: _menuController, |
| 283 autorefresh: _autorefresh, | 297 autorefresh: _autorefresh, |
| 284 onAutorefreshChanged: _handleAutorefreshChanged | 298 onAutorefreshChanged: _handleAutorefreshChanged |
| 285 )], | 299 )], |
| 286 onDismiss: _handleMenuHide)); | 300 onDismiss: _handleMenuHide)); |
| 287 } | 301 } |
| 288 | 302 |
| 289 Widget build() { | 303 Widget build() { |
| 290 List<Widget> overlays = [ | 304 List<Widget> overlays = [ |
| 291 new Scaffold( | 305 new Scaffold( |
| 292 toolbar: _isSearching ? buildSearchBar() : buildToolBar(), | 306 toolbar: _isSearching ? buildSearchBar() : buildToolBar(), |
| 293 body: buildTabNavigator(), | 307 body: buildTabNavigator(), |
| 294 snackBar: buildSnackBar(), | 308 snackBar: buildSnackBar(), |
| 295 floatingActionButton: buildFloatingActionButton(), | 309 floatingActionButton: buildFloatingActionButton(), |
| 296 drawer: _drawerShowing ? buildDrawer() : null | 310 drawer: _drawerShowing ? buildDrawer() : null |
| 297 ), | 311 ), |
| 298 ]; | 312 ]; |
| 299 addMenuToOverlays(overlays); | 313 addMenuToOverlays(overlays); |
| 300 return new Stack(overlays); | 314 return new Stack(overlays); |
| 301 } | 315 } |
| 302 } | 316 } |
| OLD | NEW |