Chromium Code Reviews| 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..1a8b676f9575e36e756858c51c750513295f5b8d |
| --- /dev/null |
| +++ b/sky/sdk/example/fitness/lib/home.dart |
| @@ -0,0 +1,214 @@ |
| +// 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) |
| + ); |
|
abarth-chromium
2015/07/08 00:05:30
Too much indent
|
| + } |
| + |
| + 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; |
| + switch (_fitnessMode) { |
| + case FitnessMode.measure: |
| + return new SnackBar( |
| + content: new Text("Measurement added!"), |
| + actions: [new SnackBarAction(label: "UNDO", onPressed: _handleUndo)] |
| + ); |
| + case FitnessMode.run: |
| + return new SnackBar( |
| + content: new Text("Run started!"), |
| + actions: [new SnackBarAction(label: "STOP", 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 |
| + ); |
| + } |
| +} |