| 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 ); |
| 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 return new SnackBar( |
| 156 content: new Text("Measurement added!"), |
| 157 actions: [new SnackBarAction(label: "UNDO", onPressed: _handleUndo)] |
| 158 ); |
| 159 } |
| 160 |
| 161 void _handleMeasurementAdded() { |
| 162 setState(() { |
| 163 _isShowingSnackBar = true; |
| 164 }); |
| 165 } |
| 166 |
| 167 void _handleRunStarted() { |
| 168 setState(() { |
| 169 _isRunning = true; |
| 170 }); |
| 171 } |
| 172 |
| 173 void _handleRunStopped() { |
| 174 setState(() { |
| 175 _isRunning = false; |
| 176 }); |
| 177 } |
| 178 |
| 179 Widget buildFloatingActionButton() { |
| 180 switch (_fitnessMode) { |
| 181 case FitnessMode.measure: |
| 182 return new FloatingActionButton( |
| 183 child: new Icon(type: 'content/add_white', size: 24), |
| 184 onPressed: _handleMeasurementAdded |
| 185 ); |
| 186 case FitnessMode.run: |
| 187 return new FloatingActionButton( |
| 188 child: new Icon( |
| 189 type: _isRunning ? 'av/stop_white' : 'maps/directions_run_white', |
| 190 size: 24 |
| 191 ), |
| 192 onPressed: _isRunning ? _handleRunStopped : _handleRunStarted |
| 193 ); |
| 194 } |
| 195 } |
| 196 |
| 197 Widget build() { |
| 198 return new Scaffold( |
| 199 toolbar: buildToolBar(), |
| 200 body: buildBody(), |
| 201 snackBar: buildSnackBar(), |
| 202 floatingActionButton: buildFloatingActionButton(), |
| 203 drawer: _drawerShowing ? buildDrawer() : null |
| 204 ); |
| 205 } |
| 206 } |
| OLD | NEW |