Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(346)

Unified Diff: sky/sdk/example/fitness/lib/home.dart

Issue 1213603006: Initial fitness app (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: abarth cr feedback Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « sky/sdk/example/fitness/lib/fitness_types.dart ('k') | sky/sdk/example/fitness/lib/main.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sky/sdk/example/fitness/lib/home.dart
diff --git a/sky/sdk/example/fitness/lib/home.dart b/sky/sdk/example/fitness/lib/home.dart
new file mode 100644
index 0000000000000000000000000000000000000000..c7be4d4d2be10cb4573feb9370bc85b9526227cb
--- /dev/null
+++ b/sky/sdk/example/fitness/lib/home.dart
@@ -0,0 +1,206 @@
+// 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.
+
+import 'package:sky/painting/text_style.dart';
+import 'package:sky/widgets/basic.dart';
+import 'package:sky/widgets/drawer.dart';
+import 'package:sky/widgets/drawer_header.dart';
+import 'package:sky/widgets/floating_action_button.dart';
+import 'package:sky/widgets/icon.dart';
+import 'package:sky/widgets/icon_button.dart';
+import 'package:sky/widgets/material.dart';
+import 'package:sky/widgets/menu_divider.dart';
+import 'package:sky/widgets/menu_item.dart';
+import 'package:sky/widgets/navigator.dart';
+import 'package:sky/widgets/snack_bar.dart';
+import 'package:sky/widgets/scaffold.dart';
+import 'package:sky/widgets/theme.dart';
+import 'package:sky/widgets/tool_bar.dart';
+import 'package:sky/widgets/widget.dart';
+
+import 'fitness_types.dart';
+import 'measurement.dart';
+
+class HomeFragment extends StatefulComponent {
+
+ HomeFragment(this.navigator, this.userData) {
+ // if (debug)
+ // new Timer(new Duration(seconds: 1), dumpState);
+ _drawerController = new DrawerController(_handleDrawerStatusChanged);
+ }
+
+ Navigator navigator;
+ List<Measurement> userData;
+
+ FitnessMode _fitnessMode = FitnessMode.measure;
+
+ void syncFields(HomeFragment source) {
+ navigator = source.navigator;
+ userData = source.userData;
+ }
+
+ bool _isShowingSnackBar = false;
+ bool _isRunning = false;
+
+ DrawerController _drawerController;
+ bool _drawerShowing = false;
+
+ void _handleDrawerStatusChanged(bool showing) {
+ if (!showing && navigator.currentRoute.name == "/drawer") {
+ navigator.pop();
+ }
+ setState(() {
+ _drawerShowing = showing;
+ });
+ }
+
+ void _handleFitnessModeChange(FitnessMode value) {
+ setState(() {
+ _fitnessMode = value;
+ });
+ assert(navigator.currentRoute.name == '/drawer');
+ navigator.pop();
+ }
+
+ Drawer buildDrawer() {
+ return new Drawer(
+ controller: _drawerController,
+ level: 3,
+ children: [
+ new DrawerHeader(children: [new Text('Fitness')]),
+ new MenuItem(
+ icon: 'action/assessment',
+ onPressed: () => _handleFitnessModeChange(FitnessMode.measure),
+ selected: _fitnessMode == FitnessMode.measure,
+ children: [new Text('Measure')]),
+ new MenuItem(
+ icon: 'maps/directions_run',
+ onPressed: () => _handleFitnessModeChange(FitnessMode.run),
+ selected: _fitnessMode == FitnessMode.run,
+ children: [new Text('Run')]),
+ new MenuDivider(),
+ new MenuItem(
+ icon: 'action/settings',
+ onPressed: _handleShowSettings,
+ children: [new Text('Settings')]),
+ new MenuItem(
+ icon: 'action/help',
+ children: [new Text('Help & Feedback')])
+ ]
+ );
+ }
+
+ void _handleShowSettings() {
+ assert(navigator.currentRoute.name == '/drawer');
+ navigator.pop();
+ assert(navigator.currentRoute.name == '/');
+ navigator.pushNamed('/settings');
+ }
+
+ void _handleOpenDrawer() {
+ _drawerController.open();
+ navigator.pushState("/drawer", (_) {
+ _drawerController.close();
+ });
+ }
+
+ // TODO(jackson): We should be localizing
+ String get fitnessModeTitle {
+ switch(_fitnessMode) {
+ case FitnessMode.measure: return "Measure";
+ case FitnessMode.run: return "Run";
+ }
+ }
+
+ Widget buildToolBar() {
+ return new ToolBar(
+ left: new IconButton(
+ icon: 'navigation/menu_white',
+ onPressed: _handleOpenDrawer),
+ center: new Text(fitnessModeTitle)
+ );
+ }
+
+ Widget buildBody() {
+ TextStyle style = Theme.of(this).text.title;
+ switch (_fitnessMode) {
+ case FitnessMode.measure:
+ return new Material(
+ type: MaterialType.canvas,
+ child: new Flex(
+ [new Text("No measurements yet.\nAdd a new one!", style: style)],
+ justifyContent: FlexJustifyContent.center
+ )
+ );
+ case FitnessMode.run:
+ return new Material(
+ type: MaterialType.canvas,
+ child: new Flex([
+ new Text(_isRunning ? "Go go go!" : "Start a new run!", style: style)
+ ], justifyContent: FlexJustifyContent.center)
+ );
+ }
+ }
+
+ void _handleUndo() {
+ setState(() {
+ _isShowingSnackBar = false;
+ });
+ }
+
+ Widget buildSnackBar() {
+ if (!_isShowingSnackBar)
+ return null;
+ return new SnackBar(
+ content: new Text("Measurement added!"),
+ actions: [new SnackBarAction(label: "UNDO", onPressed: _handleUndo)]
+ );
+ }
+
+ void _handleMeasurementAdded() {
+ setState(() {
+ _isShowingSnackBar = true;
+ });
+ }
+
+ void _handleRunStarted() {
+ setState(() {
+ _isRunning = true;
+ });
+ }
+
+ void _handleRunStopped() {
+ setState(() {
+ _isRunning = false;
+ });
+ }
+
+ Widget buildFloatingActionButton() {
+ switch (_fitnessMode) {
+ case FitnessMode.measure:
+ return new FloatingActionButton(
+ child: new Icon(type: 'content/add_white', size: 24),
+ onPressed: _handleMeasurementAdded
+ );
+ case FitnessMode.run:
+ return new FloatingActionButton(
+ child: new Icon(
+ type: _isRunning ? 'av/stop_white' : 'maps/directions_run_white',
+ size: 24
+ ),
+ onPressed: _isRunning ? _handleRunStopped : _handleRunStarted
+ );
+ }
+ }
+
+ Widget build() {
+ return new Scaffold(
+ toolbar: buildToolBar(),
+ body: buildBody(),
+ snackBar: buildSnackBar(),
+ floatingActionButton: buildFloatingActionButton(),
+ drawer: _drawerShowing ? buildDrawer() : null
+ );
+ }
+}
« no previous file with comments | « sky/sdk/example/fitness/lib/fitness_types.dart ('k') | sky/sdk/example/fitness/lib/main.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698