| // Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| part of fitness; |
| |
| typedef void SettingsUpdater({ |
| BackupMode backup, |
| double goalWeight |
| }); |
| |
| class SettingsFragment extends StatefulComponent { |
| |
| SettingsFragment({ this.navigator, this.userData, this.updater }); |
| |
| Navigator navigator; |
| UserData userData; |
| SettingsUpdater updater; |
| |
| void syncConstructorArguments(SettingsFragment source) { |
| navigator = source.navigator; |
| userData = source.userData; |
| updater = source.updater; |
| } |
| |
| void _handleBackupChanged(bool value) { |
| assert(updater != null); |
| updater(backup: value ? BackupMode.enabled : BackupMode.disabled); |
| } |
| |
| Widget buildToolBar() { |
| return new ToolBar( |
| left: new IconButton( |
| icon: "navigation/arrow_back", |
| onPressed: navigator.pop), |
| center: new Text('Settings') |
| ); |
| } |
| |
| String get goalWeightText { |
| if (userData.goalWeight == null || userData.goalWeight == 0.0) |
| return "None"; |
| else |
| return "${userData.goalWeight}"; |
| } |
| |
| static final GlobalKey weightGoalKey = new GlobalKey(); |
| |
| double _goalWeight; |
| |
| void _handleGoalWeightChanged(String goalWeight) { |
| // TODO(jackson): Looking for null characters to detect enter key is a hack |
| if (goalWeight.endsWith("\u{0}")) { |
| navigator.pop(double.parse(goalWeight.replaceAll("\u{0}", ""))); |
| } else { |
| setState(() { |
| try { |
| _goalWeight = double.parse(goalWeight); |
| } on FormatException { |
| _goalWeight = 0.0; |
| } |
| }); |
| } |
| } |
| |
| EventDisposition _handleGoalWeightPressed() { |
| showDialog(navigator, (navigator) { |
| return new Dialog( |
| title: new Text("Goal Weight"), |
| content: new Input( |
| key: weightGoalKey, |
| placeholder: 'Goal weight in lbs', |
| keyboardType: KeyboardType_NUMBER, |
| onChanged: _handleGoalWeightChanged |
| ), |
| onDismiss: () { |
| navigator.pop(); |
| }, |
| actions: [ |
| new FlatButton( |
| child: new Text('CANCEL'), |
| onPressed: () { |
| navigator.pop(); |
| } |
| ), |
| new FlatButton( |
| child: new Text('SAVE'), |
| onPressed: () { |
| navigator.pop(_goalWeight); |
| } |
| ), |
| ] |
| ); |
| }).then((double goalWeight) => updater(goalWeight: goalWeight)); |
| return EventDisposition.processed; |
| } |
| |
| Widget buildSettingsPane() { |
| return new Material( |
| type: MaterialType.canvas, |
| child: new ScrollableViewport( |
| child: new Container( |
| padding: const EdgeDims.symmetric(vertical: 20.0), |
| child: new BlockBody([ |
| new DrawerItem( |
| onPressed: () { _handleBackupChanged(!(userData.backupMode == BackupMode.enabled)); }, |
| child: new Flex([ |
| new Flexible(child: new Text('Back up data to the cloud')), |
| new Switch(value: userData.backupMode == BackupMode.enabled, onChanged: _handleBackupChanged), |
| ]) |
| ), |
| new DrawerItem( |
| onPressed: () => _handleGoalWeightPressed(), |
| child: new Flex([ |
| new Text('Goal Weight'), |
| new Text(goalWeightText, style: Theme.of(this).text.caption), |
| ], |
| direction: FlexDirection.vertical, |
| alignItems: FlexAlignItems.start |
| ) |
| ), |
| ]) |
| ) |
| ) |
| ); |
| } |
| |
| Widget build() { |
| return new Scaffold( |
| toolbar: buildToolBar(), |
| body: buildSettingsPane() |
| ); |
| } |
| } |