// 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. part of stocks; typedef void SettingsUpdater({ StockMode optimism, BackupMode backup }); class StockSettings extends StatefulComponent { const StockSettings(this.optimism, this.backup, this.updater); final StockMode optimism; final BackupMode backup; final SettingsUpdater updater; StockSettingsState createState() => new StockSettingsState(); } class StockSettingsState extends State<StockSettings> { void _handleOptimismChanged(bool value) { value ??= false; sendUpdates(value ? StockMode.optimistic : StockMode.pessimistic, config.backup); } void _handleBackupChanged(bool value) { sendUpdates(config.optimism, value ? BackupMode.enabled : BackupMode.disabled); } void _confirmOptimismChange() { switch (config.optimism) { case StockMode.optimistic: _handleOptimismChanged(false); break; case StockMode.pessimistic: showDialog( context: context, child: new Dialog( title: new Text("Change mode?"), content: new Text("Optimistic mode means everything is awesome. Are you sure you can handle that?"), actions: <Widget>[ new FlatButton( child: new Text('NO THANKS'), onPressed: () { Navigator.of(context).pop(false); } ), new FlatButton( child: new Text('AGREE'), onPressed: () { Navigator.of(context).pop(true); } ), ] ) ).then(_handleOptimismChanged); break; } } void sendUpdates(StockMode optimism, BackupMode backup) { if (config.updater != null) config.updater( optimism: optimism, backup: backup ); } Widget buildToolBar(BuildContext context) { return new ToolBar( left: new IconButton( icon: 'navigation/arrow_back', onPressed: () => Navigator.of(context).pop() ), center: new Text('Settings') ); } Widget buildSettingsPane(BuildContext context) { // TODO(ianh): Once we have the gesture API hooked up, fix https://github.com/domokit/mojo/issues/281 // (whereby tapping the widgets below causes both the widget and the menu item to fire their callbacks) return new Block(<Widget>[ new DrawerItem( icon: 'action/thumb_up', onPressed: () => _confirmOptimismChange(), child: new Row(<Widget>[ new Flexible(child: new Text('Everything is awesome')), new Checkbox( value: config.optimism == StockMode.optimistic, onChanged: (bool value) => _confirmOptimismChange() ), ]) ), new DrawerItem( icon: 'action/backup', onPressed: () { _handleBackupChanged(!(config.backup == BackupMode.enabled)); }, child: new Row(<Widget>[ new Flexible(child: new Text('Back up stock list to the cloud')), new Switch( value: config.backup == BackupMode.enabled, onChanged: _handleBackupChanged ), ]) ), ], padding: const EdgeDims.symmetric(vertical: 20.0) ); } Widget build(BuildContext context) { return new Scaffold( toolBar: buildToolBar(context), body: buildSettingsPane(context) ); } }