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

Side by Side Diff: sky/sdk/example/fitness/lib/home.dart

Issue 1213603006: Initial fitness app (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: abarth cr feedback 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 | « sky/sdk/example/fitness/lib/fitness_types.dart ('k') | sky/sdk/example/fitness/lib/main.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(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 }
OLDNEW
« no previous file with comments | « sky/sdk/example/fitness/lib/fitness_types.dart ('k') | sky/sdk/example/fitness/lib/main.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698