Commit 9f6fc78c authored by Collin Jackson's avatar Collin Jackson

Fix the new item dialog for fitness app

parent cb8e1b58
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
import 'package:sky/painting/text_style.dart'; import 'package:sky/painting/text_style.dart';
import 'package:sky/widgets/basic.dart'; import 'package:sky/widgets/basic.dart';
import 'package:sky/widgets/button_base.dart';
import 'package:sky/widgets/dialog.dart'; import 'package:sky/widgets/dialog.dart';
import 'package:sky/widgets/drawer.dart'; import 'package:sky/widgets/drawer.dart';
import 'package:sky/widgets/drawer_divider.dart'; import 'package:sky/widgets/drawer_divider.dart';
...@@ -13,10 +14,13 @@ import 'package:sky/widgets/flat_button.dart'; ...@@ -13,10 +14,13 @@ import 'package:sky/widgets/flat_button.dart';
import 'package:sky/widgets/floating_action_button.dart'; import 'package:sky/widgets/floating_action_button.dart';
import 'package:sky/widgets/icon_button.dart'; import 'package:sky/widgets/icon_button.dart';
import 'package:sky/widgets/icon.dart'; import 'package:sky/widgets/icon.dart';
import 'package:sky/widgets/ink_well.dart';
import 'package:sky/widgets/material.dart'; import 'package:sky/widgets/material.dart';
import 'package:sky/widgets/navigator.dart'; import 'package:sky/widgets/navigator.dart';
import 'package:sky/widgets/radio.dart';
import 'package:sky/widgets/scaffold.dart'; import 'package:sky/widgets/scaffold.dart';
import 'package:sky/widgets/scrollable_list.dart'; import 'package:sky/widgets/scrollable_list.dart';
import 'package:sky/widgets/scrollable_viewport.dart';
import 'package:sky/widgets/snack_bar.dart'; import 'package:sky/widgets/snack_bar.dart';
import 'package:sky/widgets/theme.dart'; import 'package:sky/widgets/theme.dart';
import 'package:sky/widgets/tool_bar.dart'; import 'package:sky/widgets/tool_bar.dart';
...@@ -27,7 +31,10 @@ import 'fitness_item.dart'; ...@@ -27,7 +31,10 @@ import 'fitness_item.dart';
import 'measurement.dart'; import 'measurement.dart';
class FitnessItemList extends Component { class FitnessItemList extends Component {
FitnessItemList({ Key key, this.items, this.onDismissed }) : super(key: key); FitnessItemList({ Key key, this.items, this.onDismissed }) : super(key: key) {
assert(items != null);
assert(onDismissed != null);
}
final List<FitnessItem> items; final List<FitnessItem> items;
final FitnessItemHandler onDismissed; final FitnessItemHandler onDismissed;
...@@ -36,11 +43,40 @@ class FitnessItemList extends Component { ...@@ -36,11 +43,40 @@ class FitnessItemList extends Component {
return new Material( return new Material(
type: MaterialType.canvas, type: MaterialType.canvas,
child: new ScrollableList<FitnessItem>( child: new ScrollableList<FitnessItem>(
padding: const EdgeDims.all(4.0),
items: items, items: items,
itemHeight: kFitnessItemHeight, itemHeight: kFitnessItemHeight,
itemBuilder: (item) => new MeasurementRow( itemBuilder: (item) => item.toRow(onDismissed: onDismissed)
measurement: item as Measurement, )
onDismissed: onDismissed );
}
}
class DialogMenuItem extends ButtonBase {
DialogMenuItem(this.children, { Key key, this.onPressed }) : super(key: key);
List<Widget> children;
Function onPressed;
void syncFields(DialogMenuItem source) {
children = source.children;
onPressed = source.onPressed;
super.syncFields(source);
}
Widget buildContent() {
return new Listener(
onGestureTap: (_) {
if (onPressed != null)
onPressed();
},
child: new Container(
height: 48.0,
child: new InkWell(
child: new Padding(
padding: const EdgeDims.symmetric(horizontal: 16.0),
child: new Flex(children)
)
) )
) )
); );
...@@ -204,11 +240,30 @@ class FeedFragment extends StatefulComponent { ...@@ -204,11 +240,30 @@ class FeedFragment extends StatefulComponent {
} }
bool _isShowingDialog = false; bool _isShowingDialog = false;
String _addItemRoute;
void _handleAddItemRouteChanged(String routeName) {
setState(() {
_addItemRoute = routeName;
});
}
Widget buildDialog() { Widget buildDialog() {
// TODO(jackson): Internationalize
Map<String, String> labels = {
'/meals/new': 'Eat',
'/measurements/new': 'Measure',
};
List<Widget> menuItems = [];
for(String routeName in labels.keys) {
menuItems.add(new DialogMenuItem([
new Flexible(child: new Text(labels[routeName])),
new Radio(value: routeName, groupValue: _addItemRoute, onChanged: _handleAddItemRouteChanged),
], onPressed: () => _handleAddItemRouteChanged(routeName)));
}
return new Dialog( return new Dialog(
title: new Text("New item"), title: new Text("What are you doing?"),
content: new Text("What are you trying to do?"), content: new ScrollableBlock(menuItems),
onDismiss: navigator.pop, onDismiss: navigator.pop,
actions: [ actions: [
new FlatButton( new FlatButton(
...@@ -216,17 +271,10 @@ class FeedFragment extends StatefulComponent { ...@@ -216,17 +271,10 @@ class FeedFragment extends StatefulComponent {
onPressed: navigator.pop onPressed: navigator.pop
), ),
new FlatButton( new FlatButton(
child: new Text('EAT'), child: new Text('ADD'),
onPressed: () {
navigator.pop();
navigator.pushNamed("/meals/new");
}
),
new FlatButton(
child: new Text('MEASURE'),
onPressed: () { onPressed: () {
navigator.pop(); navigator.pop();
navigator.pushNamed("/measurements/new"); navigator.pushNamed(_addItemRoute);
} }
), ),
] ]
...@@ -236,6 +284,9 @@ class FeedFragment extends StatefulComponent { ...@@ -236,6 +284,9 @@ class FeedFragment extends StatefulComponent {
void _handleActionButtonPressed() { void _handleActionButtonPressed() {
setState(() { setState(() {
_isShowingDialog = true; _isShowingDialog = true;
navigator.pushState(this, (_) {
_isShowingDialog = false;
});
}); });
} }
......
...@@ -10,7 +10,7 @@ typedef void FitnessItemHandler(FitnessItem item); ...@@ -10,7 +10,7 @@ typedef void FitnessItemHandler(FitnessItem item);
const double kFitnessItemHeight = 79.0; const double kFitnessItemHeight = 79.0;
class FitnessItem { abstract class FitnessItem {
FitnessItem({ this.when }) { FitnessItem({ this.when }) {
assert(when != null); assert(when != null);
} }
...@@ -18,13 +18,17 @@ class FitnessItem { ...@@ -18,13 +18,17 @@ class FitnessItem {
// TODO(jackson): Internationalize // TODO(jackson): Internationalize
String get displayDate => "${when.year.toString()}-${when.month.toString().padLeft(2,'0')}-${when.day.toString().padLeft(2,'0')}"; String get displayDate => "${when.year.toString()}-${when.month.toString().padLeft(2,'0')}-${when.day.toString().padLeft(2,'0')}";
FitnessItemRow toRow({ FitnessItemHandler onDismissed });
} }
abstract class FitnessItemRow extends Component { abstract class FitnessItemRow extends Component {
FitnessItemRow({ FitnessItem item, this.onDismissed }) FitnessItemRow({ FitnessItem item, this.onDismissed })
: this.item = item, : this.item = item,
super(key: new Key(item.when.toString())); super(key: new Key(item.when.toString())) {
assert(onDismissed != null);
}
final FitnessItem item; final FitnessItem item;
final FitnessItemHandler onDismissed; final FitnessItemHandler onDismissed;
......
...@@ -21,6 +21,10 @@ class Meal extends FitnessItem { ...@@ -21,6 +21,10 @@ class Meal extends FitnessItem {
Meal({ DateTime when, this.description }) : super(when: when); Meal({ DateTime when, this.description }) : super(when: when);
final String description; final String description;
FitnessItemRow toRow({ FitnessItemHandler onDismissed }) {
return new MealRow(meal: this, onDismissed: onDismissed);
}
} }
class MealRow extends FitnessItemRow { class MealRow extends FitnessItemRow {
...@@ -91,6 +95,8 @@ class MealFragment extends StatefulComponent { ...@@ -91,6 +95,8 @@ class MealFragment extends StatefulComponent {
}); });
} }
static final GlobalKey descriptionKey = new GlobalKey();
Widget buildBody() { Widget buildBody() {
Meal meal = new Meal(when: new DateTime.now()); Meal meal = new Meal(when: new DateTime.now());
return new Material( return new Material(
...@@ -101,7 +107,7 @@ class MealFragment extends StatefulComponent { ...@@ -101,7 +107,7 @@ class MealFragment extends StatefulComponent {
child: new Block([ child: new Block([
new Text(meal.displayDate), new Text(meal.displayDate),
new Input( new Input(
focused: false, key: descriptionKey,
placeholder: 'Describe meal', placeholder: 'Describe meal',
onChanged: _handleDescriptionChanged onChanged: _handleDescriptionChanged
), ),
......
...@@ -25,6 +25,10 @@ class Measurement extends FitnessItem { ...@@ -25,6 +25,10 @@ class Measurement extends FitnessItem {
// TODO(jackson): Internationalize // TODO(jackson): Internationalize
String get displayWeight => "${weight.toStringAsFixed(2)} lbs"; String get displayWeight => "${weight.toStringAsFixed(2)} lbs";
FitnessItemRow toRow({ FitnessItemHandler onDismissed }) {
return new MeasurementRow(measurement: this, onDismissed: onDismissed);
}
} }
class MeasurementRow extends FitnessItemRow { class MeasurementRow extends FitnessItemRow {
...@@ -105,6 +109,8 @@ class MeasurementFragment extends StatefulComponent { ...@@ -105,6 +109,8 @@ class MeasurementFragment extends StatefulComponent {
}); });
} }
static final GlobalKey weightKey = new GlobalKey();
Widget buildBody() { Widget buildBody() {
Measurement measurement = new Measurement(when: new DateTime.now()); Measurement measurement = new Measurement(when: new DateTime.now());
return new Material( return new Material(
...@@ -115,7 +121,7 @@ class MeasurementFragment extends StatefulComponent { ...@@ -115,7 +121,7 @@ class MeasurementFragment extends StatefulComponent {
child: new Block([ child: new Block([
new Text(measurement.displayDate), new Text(measurement.displayDate),
new Input( new Input(
focused: false, key: weightKey,
placeholder: 'Enter weight', placeholder: 'Enter weight',
onChanged: _handleWeightChanged onChanged: _handleWeightChanged
), ),
......
...@@ -31,7 +31,7 @@ class StockSettings extends StatefulComponent { ...@@ -31,7 +31,7 @@ class StockSettings extends StatefulComponent {
BackupMode backup; BackupMode backup;
SettingsUpdater updater; SettingsUpdater updater;
bool showModeDialog = false; bool _showModeDialog = false;
void syncFields(StockSettings source) { void syncFields(StockSettings source) {
navigator = source.navigator; navigator = source.navigator;
...@@ -60,9 +60,9 @@ class StockSettings extends StatefulComponent { ...@@ -60,9 +60,9 @@ class StockSettings extends StatefulComponent {
_handleOptimismChanged(false); _handleOptimismChanged(false);
break; break;
case StockMode.pessimistic: case StockMode.pessimistic:
showModeDialog = true; _showModeDialog = true;
navigator.pushState(this, (_) { navigator.pushState(this, (_) {
showModeDialog = false; _showModeDialog = false;
}); });
break; break;
} }
...@@ -123,7 +123,7 @@ class StockSettings extends StatefulComponent { ...@@ -123,7 +123,7 @@ class StockSettings extends StatefulComponent {
body: buildSettingsPane() body: buildSettingsPane()
) )
]; ];
if (showModeDialog) { if (_showModeDialog) {
layers.add(new Dialog( layers.add(new Dialog(
title: new Text("Change mode?"), title: new Text("Change mode?"),
content: new Text("Optimistic mode means everything is awesome. Are you sure you can handle that?"), content: new Text("Optimistic mode means everything is awesome. Are you sure you can handle that?"),
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment