Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(109)

Side by Side Diff: sky/sdk/example/stocks/lib/stock_home.dart

Issue 1233433002: Animate the snack bar in the stocks app. (Closed) Base URL: git@github.com:/domokit/mojo.git@master
Patch Set: renmae Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | sky/sdk/lib/widgets/animated_component.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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 }
OLDNEW
« no previous file with comments | « no previous file | sky/sdk/lib/widgets/animated_component.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698