Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 import 'package:sky/painting/text_style.dart'; | |
| 6 import 'package:sky/widgets/basic.dart'; | |
| 7 import 'package:sky/widgets/drawer.dart'; | |
| 8 import 'package:sky/widgets/drawer_header.dart'; | |
| 9 import 'package:sky/widgets/floating_action_button.dart'; | |
| 10 import 'package:sky/widgets/icon.dart'; | |
| 11 import 'package:sky/widgets/icon_button.dart'; | |
| 12 import 'package:sky/widgets/material.dart'; | |
| 13 import 'package:sky/widgets/menu_divider.dart'; | |
| 14 import 'package:sky/widgets/menu_item.dart'; | |
| 15 import 'package:sky/widgets/navigator.dart'; | |
| 16 import 'package:sky/widgets/snack_bar.dart'; | |
| 17 import 'package:sky/widgets/scaffold.dart'; | |
| 18 import 'package:sky/widgets/theme.dart'; | |
| 19 import 'package:sky/widgets/tool_bar.dart'; | |
| 20 import 'package:sky/widgets/widget.dart'; | |
| 21 | |
| 22 import 'fitness_types.dart'; | |
| 23 import 'measurement.dart'; | |
| 24 | |
| 25 class HomeFragment extends StatefulComponent { | |
| 26 | |
| 27 HomeFragment(this.navigator, this.userData) { | |
| 28 // if (debug) | |
| 29 // new Timer(new Duration(seconds: 1), dumpState); | |
| 30 _drawerController = new DrawerController(_handleDrawerStatusChanged); | |
| 31 } | |
| 32 | |
| 33 Navigator navigator; | |
| 34 List<Measurement> userData; | |
| 35 | |
| 36 FitnessMode _fitnessMode = FitnessMode.measure; | |
| 37 | |
| 38 void syncFields(HomeFragment source) { | |
| 39 navigator = source.navigator; | |
| 40 userData = source.userData; | |
| 41 } | |
| 42 | |
| 43 bool _isShowingSnackBar = false; | |
| 44 bool _isRunning = false; | |
| 45 | |
| 46 DrawerController _drawerController; | |
| 47 bool _drawerShowing = false; | |
| 48 | |
| 49 void _handleDrawerStatusChanged(bool showing) { | |
| 50 if (!showing && navigator.currentRoute.name == "/drawer") { | |
| 51 navigator.pop(); | |
| 52 } | |
| 53 setState(() { | |
| 54 _drawerShowing = showing; | |
| 55 }); | |
| 56 } | |
| 57 | |
| 58 void _handleFitnessModeChange(FitnessMode value) { | |
| 59 setState(() { | |
| 60 _fitnessMode = value; | |
| 61 }); | |
| 62 assert(navigator.currentRoute.name == '/drawer'); | |
| 63 navigator.pop(); | |
| 64 } | |
| 65 | |
| 66 Drawer buildDrawer() { | |
| 67 return new Drawer( | |
| 68 controller: _drawerController, | |
| 69 level: 3, | |
| 70 children: [ | |
| 71 new DrawerHeader(children: [new Text('Fitness')]), | |
| 72 new MenuItem( | |
| 73 icon: 'action/assessment', | |
| 74 onPressed: () => _handleFitnessModeChange(FitnessMode.measure), | |
| 75 selected: _fitnessMode == FitnessMode.measure, | |
| 76 children: [new Text('Measure')]), | |
| 77 new MenuItem( | |
| 78 icon: 'maps/directions_run', | |
| 79 onPressed: () => _handleFitnessModeChange(FitnessMode.run), | |
| 80 selected: _fitnessMode == FitnessMode.run, | |
| 81 children: [new Text('Run')]), | |
| 82 new MenuDivider(), | |
| 83 new MenuItem( | |
| 84 icon: 'action/settings', | |
| 85 onPressed: _handleShowSettings, | |
| 86 children: [new Text('Settings')]), | |
| 87 new MenuItem( | |
| 88 icon: 'action/help', | |
| 89 children: [new Text('Help & Feedback')]) | |
| 90 ] | |
| 91 ); | |
| 92 } | |
| 93 | |
| 94 void _handleShowSettings() { | |
| 95 assert(navigator.currentRoute.name == '/drawer'); | |
| 96 navigator.pop(); | |
| 97 assert(navigator.currentRoute.name == '/'); | |
| 98 navigator.pushNamed('/settings'); | |
| 99 } | |
| 100 | |
| 101 void _handleOpenDrawer() { | |
| 102 _drawerController.open(); | |
| 103 navigator.pushState("/drawer", (_) { | |
| 104 _drawerController.close(); | |
| 105 }); | |
| 106 } | |
| 107 | |
| 108 // TODO(jackson): We should be localizing | |
| 109 String get fitnessModeTitle { | |
| 110 switch(_fitnessMode) { | |
| 111 case FitnessMode.measure: return "Measure"; | |
| 112 case FitnessMode.run: return "Run"; | |
| 113 } | |
| 114 } | |
| 115 | |
| 116 Widget buildToolBar() { | |
| 117 return new ToolBar( | |
| 118 left: new IconButton( | |
| 119 icon: 'navigation/menu_white', | |
| 120 onPressed: _handleOpenDrawer), | |
| 121 center: new Text(fitnessModeTitle) | |
| 122 ); | |
|
abarth-chromium
2015/07/08 00:05:30
Too much indent
| |
| 123 } | |
| 124 | |
| 125 Widget buildBody() { | |
| 126 TextStyle style = Theme.of(this).text.title; | |
| 127 switch (_fitnessMode) { | |
| 128 case FitnessMode.measure: | |
| 129 return new Material( | |
| 130 type: MaterialType.canvas, | |
| 131 child: new Flex( | |
| 132 [new Text("No measurements yet.\nAdd a new one!", style: style)], | |
| 133 justifyContent: FlexJustifyContent.center | |
| 134 ) | |
| 135 ); | |
| 136 case FitnessMode.run: | |
| 137 return new Material( | |
| 138 type: MaterialType.canvas, | |
| 139 child: new Flex([ | |
| 140 new Text(_isRunning ? "Go go go!" : "Start a new run!", style: style ) | |
| 141 ], justifyContent: FlexJustifyContent.center) | |
| 142 ); | |
| 143 } | |
| 144 } | |
| 145 | |
| 146 void _handleUndo() { | |
| 147 setState(() { | |
| 148 _isShowingSnackBar = false; | |
| 149 }); | |
| 150 } | |
| 151 | |
| 152 Widget buildSnackBar() { | |
| 153 if (!_isShowingSnackBar) | |
| 154 return null; | |
| 155 switch (_fitnessMode) { | |
| 156 case FitnessMode.measure: | |
| 157 return new SnackBar( | |
| 158 content: new Text("Measurement added!"), | |
| 159 actions: [new SnackBarAction(label: "UNDO", onPressed: _handleUndo)] | |
| 160 ); | |
| 161 case FitnessMode.run: | |
| 162 return new SnackBar( | |
| 163 content: new Text("Run started!"), | |
| 164 actions: [new SnackBarAction(label: "STOP", onPressed: _handleUndo)] | |
| 165 ); | |
| 166 } | |
| 167 } | |
| 168 | |
| 169 void _handleMeasurementAdded() { | |
| 170 setState(() { | |
| 171 _isShowingSnackBar = true; | |
| 172 }); | |
| 173 } | |
| 174 | |
| 175 void _handleRunStarted() { | |
| 176 setState(() { | |
| 177 _isRunning = true; | |
| 178 }); | |
| 179 } | |
| 180 | |
| 181 void _handleRunStopped() { | |
| 182 setState(() { | |
| 183 _isRunning = false; | |
| 184 }); | |
| 185 } | |
| 186 | |
| 187 Widget buildFloatingActionButton() { | |
| 188 switch (_fitnessMode) { | |
| 189 case FitnessMode.measure: | |
| 190 return new FloatingActionButton( | |
| 191 child: new Icon(type: 'content/add_white', size: 24), | |
| 192 onPressed: _handleMeasurementAdded | |
| 193 ); | |
| 194 case FitnessMode.run: | |
| 195 return new FloatingActionButton( | |
| 196 child: new Icon( | |
| 197 type: _isRunning ? 'av/stop_white' : 'maps/directions_run_white', | |
| 198 size: 24 | |
| 199 ), | |
| 200 onPressed: _isRunning ? _handleRunStopped : _handleRunStarted | |
| 201 ); | |
| 202 } | |
| 203 } | |
| 204 | |
| 205 Widget build() { | |
| 206 return new Scaffold( | |
| 207 toolbar: buildToolBar(), | |
| 208 body: buildBody(), | |
| 209 snackBar: buildSnackBar(), | |
| 210 floatingActionButton: buildFloatingActionButton(), | |
| 211 drawer: _drawerShowing ? buildDrawer() : null | |
| 212 ); | |
| 213 } | |
| 214 } | |
| OLD | NEW |