Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 46687c8

Browse files
committed
Merge pull request #713 from collinjackson/goalweight
Support for saving goal weight
2 parents 5b7e927 + 3002f29 commit 46687c8

2 files changed

Lines changed: 115 additions & 23 deletions

File tree

examples/fitness/lib/main.dart

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ part 'settings.dart';
2222

2323
abstract class UserData {
2424
BackupMode get backupMode;
25+
double get goalWeight;
2526
List<FitnessItem> get items;
2627
}
2728

@@ -32,31 +33,29 @@ class UserDataImpl extends UserData {
3233

3334
BackupMode _backupMode;
3435
BackupMode get backupMode => _backupMode;
35-
void setBackupModeAndSave(BackupMode value) {
36+
void set backupMode(BackupMode value) {
3637
_backupMode = value;
37-
save();
3838
}
3939

40-
List<FitnessItem> get items => _items;
41-
void set items(List<FitnessItem> newItems) {
42-
_items = [];
43-
_items.addAll(newItems);
44-
sort();
40+
double _goalWeight;
41+
double get goalWeight => _goalWeight;
42+
void set goalWeight(double value) {
43+
_goalWeight = value;
4544
}
4645

46+
List<FitnessItem> get items => _items;
47+
4748
void sort() {
4849
_items.sort((a, b) => -a.when.compareTo(b.when));
4950
}
5051

51-
void addAndSave(FitnessItem item) {
52+
void add(FitnessItem item) {
5253
_items.add(item);
5354
sort();
54-
save();
5555
}
5656

57-
void removeAndSave(FitnessItem item) {
57+
void remove(FitnessItem item) {
5858
_items.remove(item);
59-
save();
6059
}
6160

6261
Future save() => saveFitnessData(this);
@@ -72,12 +71,14 @@ class UserDataImpl extends UserData {
7271
} catch(e) {
7372
print("Failed to load backup mode: ${e}");
7473
}
74+
_goalWeight = json['goalWeight'];
7575
}
7676

7777
Map toJson() {
7878
Map json = new Map();
7979
json['items'] = _items.map((item) => item.toJson()).toList();
8080
json['backupMode'] = _backupMode.toString();
81+
json['goalWeight'] = _goalWeight;
8182
return json;
8283
}
8384
}
@@ -139,17 +140,26 @@ class FitnessApp extends App {
139140
}
140141

141142
void _handleItemCreated(FitnessItem item) {
142-
setState(() => _userData.addAndSave(item));
143+
setState(() {
144+
_userData.add(item);
145+
_userData.save();
146+
});
143147
}
144148

145149
void _handleItemDeleted(FitnessItem item) {
146-
setState(() => _userData.removeAndSave(item));
150+
setState(() {
151+
_userData.remove(item);
152+
_userData.save();
153+
});
147154
}
148155

149-
void settingsUpdater({ BackupMode backup }) {
156+
void settingsUpdater({ BackupMode backup, double goalWeight }) {
150157
setState(() {
151158
if (backup != null)
152-
_userData.setBackupModeAndSave(backup);
159+
_userData.backupMode = backup;
160+
if (goalWeight != null)
161+
_userData.goalWeight = goalWeight;
162+
_userData.save();
153163
});
154164
}
155165

examples/fitness/lib/settings.dart

Lines changed: 90 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,35 @@
55
part of fitness;
66

77
typedef void SettingsUpdater({
8-
BackupMode backup
8+
BackupMode backup,
9+
double goalWeight
910
});
1011

11-
class SettingsFragment extends Component {
12+
class SettingsFragment extends StatefulComponent {
1213

1314
SettingsFragment({ this.navigator, this.userData, this.updater });
1415

15-
final Navigator navigator;
16-
final UserData userData;
17-
final SettingsUpdater updater;
16+
Navigator navigator;
17+
UserData userData;
18+
SettingsUpdater updater;
19+
20+
void syncFields(SettingsFragment source) {
21+
navigator = source.navigator;
22+
userData = source.userData;
23+
updater = source.updater;
24+
}
1825

1926
void _handleBackupChanged(bool value) {
20-
if (updater != null)
21-
updater(backup: value ? BackupMode.enabled : BackupMode.disabled);
27+
assert(updater != null);
28+
updater(backup: value ? BackupMode.enabled : BackupMode.disabled);
29+
}
30+
31+
void _goalWeightChanged(double value) {
32+
assert(updater != null);
33+
setState(() {
34+
optimism = value ? StockMode.optimistic : StockMode.pessimistic;
35+
});
36+
sendUpdates();
2237
}
2338

2439
Widget buildToolBar() {
@@ -30,6 +45,64 @@ class SettingsFragment extends Component {
3045
);
3146
}
3247

48+
String get goalWeightText {
49+
if (userData.goalWeight == null || userData.goalWeight == 0.0)
50+
return "None";
51+
else
52+
return "${userData.goalWeight}";
53+
}
54+
55+
static final GlobalKey weightGoalKey = new GlobalKey();
56+
57+
double _goalWeight;
58+
59+
void _handleGoalWeightChanged(String goalWeight) {
60+
// TODO(jackson): Looking for null characters to detect enter key is a hack
61+
if (goalWeight.endsWith("\u{0}")) {
62+
navigator.pop(double.parse(goalWeight.replaceAll("\u{0}", "")));
63+
} else {
64+
setState(() {
65+
try {
66+
_goalWeight = double.parse(goalWeight);
67+
} on FormatException {
68+
_goalWeight = 0.0;
69+
}
70+
});
71+
}
72+
}
73+
74+
EventDisposition _handleGoalWeightPressed() {
75+
showDialog(navigator, (navigator) {
76+
return new Dialog(
77+
title: new Text("Goal Weight"),
78+
content: new Input(
79+
key: weightGoalKey,
80+
placeholder: 'Goal weight in lbs',
81+
keyboardType: KeyboardType_NUMBER,
82+
onChanged: _handleGoalWeightChanged
83+
),
84+
onDismiss: () {
85+
navigator.pop();
86+
},
87+
actions: [
88+
new FlatButton(
89+
child: new Text('CANCEL'),
90+
onPressed: () {
91+
navigator.pop();
92+
}
93+
),
94+
new FlatButton(
95+
child: new Text('SAVE'),
96+
onPressed: () {
97+
navigator.pop(_goalWeight);
98+
}
99+
),
100+
]
101+
);
102+
}).then((double goalWeight) => updater(goalWeight: goalWeight));
103+
return EventDisposition.processed;
104+
}
105+
33106
Widget buildSettingsPane() {
34107
return new Material(
35108
type: MaterialType.canvas,
@@ -43,7 +116,16 @@ class SettingsFragment extends Component {
43116
new Flexible(child: new Text('Back up data to the cloud')),
44117
new Switch(value: userData.backupMode == BackupMode.enabled, onChanged: _handleBackupChanged)
45118
]
46-
)
119+
),
120+
new DrawerItem(
121+
onPressed: () => _handleGoalWeightPressed(),
122+
children: [
123+
new Flex([
124+
new Text('Goal Weight'),
125+
new Text(goalWeightText, style: Theme.of(this).text.caption),
126+
], direction: FlexDirection.vertical, alignItems: FlexAlignItems.start)
127+
]
128+
),
47129
])
48130
)
49131
)

0 commit comments

Comments
 (0)