diff --git a/examples/fitness/lib/main.dart b/examples/fitness/lib/main.dart index 8881905597e04..7450b71205a7e 100644 --- a/examples/fitness/lib/main.dart +++ b/examples/fitness/lib/main.dart @@ -22,6 +22,7 @@ part 'settings.dart'; abstract class UserData { BackupMode get backupMode; + double get goalWeight; List get items; } @@ -32,31 +33,29 @@ class UserDataImpl extends UserData { BackupMode _backupMode; BackupMode get backupMode => _backupMode; - void setBackupModeAndSave(BackupMode value) { + void set backupMode(BackupMode value) { _backupMode = value; - save(); } - List get items => _items; - void set items(List newItems) { - _items = []; - _items.addAll(newItems); - sort(); + double _goalWeight; + double get goalWeight => _goalWeight; + void set goalWeight(double value) { + _goalWeight = value; } + List get items => _items; + void sort() { _items.sort((a, b) => -a.when.compareTo(b.when)); } - void addAndSave(FitnessItem item) { + void add(FitnessItem item) { _items.add(item); sort(); - save(); } - void removeAndSave(FitnessItem item) { + void remove(FitnessItem item) { _items.remove(item); - save(); } Future save() => saveFitnessData(this); @@ -72,12 +71,14 @@ class UserDataImpl extends UserData { } catch(e) { print("Failed to load backup mode: ${e}"); } + _goalWeight = json['goalWeight']; } Map toJson() { Map json = new Map(); json['items'] = _items.map((item) => item.toJson()).toList(); json['backupMode'] = _backupMode.toString(); + json['goalWeight'] = _goalWeight; return json; } } @@ -139,17 +140,26 @@ class FitnessApp extends App { } void _handleItemCreated(FitnessItem item) { - setState(() => _userData.addAndSave(item)); + setState(() { + _userData.add(item); + _userData.save(); + }); } void _handleItemDeleted(FitnessItem item) { - setState(() => _userData.removeAndSave(item)); + setState(() { + _userData.remove(item); + _userData.save(); + }); } - void settingsUpdater({ BackupMode backup }) { + void settingsUpdater({ BackupMode backup, double goalWeight }) { setState(() { if (backup != null) - _userData.setBackupModeAndSave(backup); + _userData.backupMode = backup; + if (goalWeight != null) + _userData.goalWeight = goalWeight; + _userData.save(); }); } diff --git a/examples/fitness/lib/settings.dart b/examples/fitness/lib/settings.dart index 39f81d9dfc9e2..b51ec049ba281 100644 --- a/examples/fitness/lib/settings.dart +++ b/examples/fitness/lib/settings.dart @@ -5,20 +5,35 @@ part of fitness; typedef void SettingsUpdater({ - BackupMode backup + BackupMode backup, + double goalWeight }); -class SettingsFragment extends Component { +class SettingsFragment extends StatefulComponent { SettingsFragment({ this.navigator, this.userData, this.updater }); - final Navigator navigator; - final UserData userData; - final SettingsUpdater updater; + Navigator navigator; + UserData userData; + SettingsUpdater updater; + + void syncFields(SettingsFragment source) { + navigator = source.navigator; + userData = source.userData; + updater = source.updater; + } void _handleBackupChanged(bool value) { - if (updater != null) - updater(backup: value ? BackupMode.enabled : BackupMode.disabled); + assert(updater != null); + updater(backup: value ? BackupMode.enabled : BackupMode.disabled); + } + + void _goalWeightChanged(double value) { + assert(updater != null); + setState(() { + optimism = value ? StockMode.optimistic : StockMode.pessimistic; + }); + sendUpdates(); } Widget buildToolBar() { @@ -30,6 +45,64 @@ class SettingsFragment extends Component { ); } + 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, @@ -43,7 +116,16 @@ class SettingsFragment extends Component { new Flexible(child: new Text('Back up data to the cloud')), new Switch(value: userData.backupMode == BackupMode.enabled, onChanged: _handleBackupChanged) ] - ) + ), + new DrawerItem( + onPressed: () => _handleGoalWeightPressed(), + children: [ + new Flex([ + new Text('Goal Weight'), + new Text(goalWeightText, style: Theme.of(this).text.caption), + ], direction: FlexDirection.vertical, alignItems: FlexAlignItems.start) + ] + ), ]) ) )