提交 00823e6e 编写于 作者: C Collin Jackson

Merge pull request #268 from collinjackson/fitness_dialog

New item dialog for fitness app and other minor improvements

R=eseidel
......@@ -4,6 +4,7 @@
import 'package:sky/painting/text_style.dart';
import 'package:sky/widgets/basic.dart';
import 'package:sky/widgets/button_base.dart';
import 'package:sky/widgets/dialog.dart';
import 'package:sky/widgets/drawer.dart';
import 'package:sky/widgets/drawer_divider.dart';
......@@ -13,10 +14,13 @@ import 'package:sky/widgets/flat_button.dart';
import 'package:sky/widgets/floating_action_button.dart';
import 'package:sky/widgets/icon_button.dart';
import 'package:sky/widgets/icon.dart';
import 'package:sky/widgets/ink_well.dart';
import 'package:sky/widgets/material.dart';
import 'package:sky/widgets/navigator.dart';
import 'package:sky/widgets/radio.dart';
import 'package:sky/widgets/scaffold.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/theme.dart';
import 'package:sky/widgets/tool_bar.dart';
......@@ -27,7 +31,10 @@ import 'fitness_item.dart';
import 'measurement.dart';
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 FitnessItemHandler onDismissed;
......@@ -36,11 +43,40 @@ class FitnessItemList extends Component {
return new Material(
type: MaterialType.canvas,
child: new ScrollableList<FitnessItem>(
padding: const EdgeDims.all(4.0),
items: items,
itemHeight: kFitnessItemHeight,
itemBuilder: (item) => new MeasurementRow(
measurement: item as Measurement,
onDismissed: onDismissed
itemBuilder: (item) => item.toRow(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 {
}
bool _isShowingDialog = false;
String _addItemRoute;
void _handleAddItemRouteChanged(String routeName) {
setState(() {
_addItemRoute = routeName;
});
}
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(
title: new Text("New item"),
content: new Text("What are you trying to do?"),
title: new Text("What are you doing?"),
content: new ScrollableBlock(menuItems),
onDismiss: navigator.pop,
actions: [
new FlatButton(
......@@ -216,17 +271,10 @@ class FeedFragment extends StatefulComponent {
onPressed: navigator.pop
),
new FlatButton(
child: new Text('EAT'),
onPressed: () {
navigator.pop();
navigator.pushNamed("/meals/new");
}
),
new FlatButton(
child: new Text('MEASURE'),
child: new Text('ADD'),
onPressed: () {
navigator.pop();
navigator.pushNamed("/measurements/new");
navigator.pushNamed(_addItemRoute);
}
),
]
......@@ -236,6 +284,9 @@ class FeedFragment extends StatefulComponent {
void _handleActionButtonPressed() {
setState(() {
_isShowingDialog = true;
navigator.pushState(this, (_) {
_isShowingDialog = false;
});
});
}
......
......@@ -10,7 +10,7 @@ typedef void FitnessItemHandler(FitnessItem item);
const double kFitnessItemHeight = 79.0;
class FitnessItem {
abstract class FitnessItem {
FitnessItem({ this.when }) {
assert(when != null);
}
......@@ -18,13 +18,17 @@ class FitnessItem {
// TODO(jackson): Internationalize
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 {
FitnessItemRow({ FitnessItem item, this.onDismissed })
: this.item = item,
super(key: new Key(item.when.toString()));
super(key: new Key(item.when.toString())) {
assert(onDismissed != null);
}
final FitnessItem item;
final FitnessItemHandler onDismissed;
......
......@@ -21,6 +21,10 @@ class Meal extends FitnessItem {
Meal({ DateTime when, this.description }) : super(when: when);
final String description;
FitnessItemRow toRow({ FitnessItemHandler onDismissed }) {
return new MealRow(meal: this, onDismissed: onDismissed);
}
}
class MealRow extends FitnessItemRow {
......@@ -91,6 +95,8 @@ class MealFragment extends StatefulComponent {
});
}
static final GlobalKey descriptionKey = new GlobalKey();
Widget buildBody() {
Meal meal = new Meal(when: new DateTime.now());
return new Material(
......@@ -101,7 +107,7 @@ class MealFragment extends StatefulComponent {
child: new Block([
new Text(meal.displayDate),
new Input(
focused: false,
key: descriptionKey,
placeholder: 'Describe meal',
onChanged: _handleDescriptionChanged
),
......
......@@ -25,6 +25,10 @@ class Measurement extends FitnessItem {
// TODO(jackson): Internationalize
String get displayWeight => "${weight.toStringAsFixed(2)} lbs";
FitnessItemRow toRow({ FitnessItemHandler onDismissed }) {
return new MeasurementRow(measurement: this, onDismissed: onDismissed);
}
}
class MeasurementRow extends FitnessItemRow {
......@@ -105,6 +109,8 @@ class MeasurementFragment extends StatefulComponent {
});
}
static final GlobalKey weightKey = new GlobalKey();
Widget buildBody() {
Measurement measurement = new Measurement(when: new DateTime.now());
return new Material(
......@@ -115,7 +121,7 @@ class MeasurementFragment extends StatefulComponent {
child: new Block([
new Text(measurement.displayDate),
new Input(
focused: false,
key: weightKey,
placeholder: 'Enter weight',
onChanged: _handleWeightChanged
),
......
......@@ -31,7 +31,7 @@ class StockSettings extends StatefulComponent {
BackupMode backup;
SettingsUpdater updater;
bool showModeDialog = false;
bool _showModeDialog = false;
void syncFields(StockSettings source) {
navigator = source.navigator;
......@@ -60,9 +60,9 @@ class StockSettings extends StatefulComponent {
_handleOptimismChanged(false);
break;
case StockMode.pessimistic:
showModeDialog = true;
_showModeDialog = true;
navigator.pushState(this, (_) {
showModeDialog = false;
_showModeDialog = false;
});
break;
}
......@@ -123,7 +123,7 @@ class StockSettings extends StatefulComponent {
body: buildSettingsPane()
)
];
if (showModeDialog) {
if (_showModeDialog) {
layers.add(new Dialog(
title: new Text("Change mode?"),
content: new Text("Optimistic mode means everything is awesome. Are you sure you can handle that?"),
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册