| // 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:flutter/material.dart'; | |
| import 'stock_types.dart'; | |
| class StockSettings extends StatefulWidget { | |
| const StockSettings(this.configuration, this.updater); | |
| final StockConfiguration configuration; | |
| final ValueChanged<StockConfiguration> updater; | |
| @override | |
| StockSettingsState createState() => new StockSettingsState(); | |
| } | |
| class StockSettingsState extends State<StockSettings> { | |
| void _handleOptimismChanged(bool value) { | |
| value ??= false; | |
| sendUpdates(config.configuration.copyWith(stockMode: value ? StockMode.optimistic : StockMode.pessimistic)); | |
| } | |
| void _handleBackupChanged(bool value) { | |
| sendUpdates(config.configuration.copyWith(backupMode: value ? BackupMode.enabled : BackupMode.disabled)); | |
| } | |
| void _handleShowGridChanged(bool value) { | |
| sendUpdates(config.configuration.copyWith(debugShowGrid: value)); | |
| } | |
| void _handleShowSizesChanged(bool value) { | |
| sendUpdates(config.configuration.copyWith(debugShowSizes: value)); | |
| } | |
| void _handleShowBaselinesChanged(bool value) { | |
| sendUpdates(config.configuration.copyWith(debugShowBaselines: value)); | |
| } | |
| void _handleShowLayersChanged(bool value) { | |
| sendUpdates(config.configuration.copyWith(debugShowLayers: value)); | |
| } | |
| void _handleShowPointersChanged(bool value) { | |
| sendUpdates(config.configuration.copyWith(debugShowPointers: value)); | |
| } | |
| void _handleShowRainbowChanged(bool value) { | |
| sendUpdates(config.configuration.copyWith(debugShowRainbow: value)); | |
| } | |
| void _handleShowPerformanceOverlayChanged(bool value) { | |
| sendUpdates(config.configuration.copyWith(showPerformanceOverlay: value)); | |
| } | |
| void _handleShowSemanticsDebuggerChanged(bool value) { | |
| sendUpdates(config.configuration.copyWith(showSemanticsDebugger: value)); | |
| } | |
| void _confirmOptimismChange() { | |
| switch (config.configuration.stockMode) { | |
| case StockMode.optimistic: | |
| _handleOptimismChanged(false); | |
| break; | |
| case StockMode.pessimistic: | |
| showDialog( | |
| context: context, | |
| child: new AlertDialog( | |
| 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.pop(context, false); | |
| } | |
| ), | |
| new FlatButton( | |
| child: new Text('AGREE'), | |
| onPressed: () { | |
| Navigator.pop(context, true); | |
| } | |
| ), | |
| ] | |
| ) | |
| ).then(_handleOptimismChanged); | |
| break; | |
| } | |
| } | |
| void sendUpdates(StockConfiguration value) { | |
| if (config.updater != null) | |
| config.updater(value); | |
| } | |
| Widget buildAppBar(BuildContext context) { | |
| return new AppBar( | |
| title: new Text('Settings') | |
| ); | |
| } | |
| Widget buildSettingsPane(BuildContext context) { | |
| List<Widget> rows = <Widget>[ | |
| new DrawerItem( | |
| icon: new Icon(Icons.thumb_up), | |
| onPressed: () => _confirmOptimismChange(), | |
| child: new Row( | |
| children: <Widget>[ | |
| new Flexible(child: new Text('Everything is awesome')), | |
| new Checkbox( | |
| value: config.configuration.stockMode == StockMode.optimistic, | |
| onChanged: (bool value) => _confirmOptimismChange() | |
| ), | |
| ] | |
| ) | |
| ), | |
| new DrawerItem( | |
| icon: new Icon(Icons.backup), | |
| onPressed: () { _handleBackupChanged(!(config.configuration.backupMode == BackupMode.enabled)); }, | |
| child: new Row( | |
| children: <Widget>[ | |
| new Flexible(child: new Text('Back up stock list to the cloud')), | |
| new Switch( | |
| value: config.configuration.backupMode == BackupMode.enabled, | |
| onChanged: _handleBackupChanged | |
| ), | |
| ] | |
| ) | |
| ), | |
| new DrawerItem( | |
| icon: new Icon(Icons.picture_in_picture), | |
| onPressed: () { _handleShowPerformanceOverlayChanged(!config.configuration.showPerformanceOverlay); }, | |
| child: new Row( | |
| children: <Widget>[ | |
| new Flexible(child: new Text('Show rendering performance overlay')), | |
| new Switch( | |
| value: config.configuration.showPerformanceOverlay, | |
| onChanged: _handleShowPerformanceOverlayChanged | |
| ), | |
| ] | |
| ) | |
| ), | |
| new DrawerItem( | |
| icon: new Icon(Icons.accessibility), | |
| onPressed: () { _handleShowSemanticsDebuggerChanged(!config.configuration.showSemanticsDebugger); }, | |
| child: new Row( | |
| children: <Widget>[ | |
| new Flexible(child: new Text('Show semantics overlay')), | |
| new Switch( | |
| value: config.configuration.showSemanticsDebugger, | |
| onChanged: _handleShowSemanticsDebuggerChanged | |
| ), | |
| ] | |
| ) | |
| ), | |
| ]; | |
| assert(() { | |
| // material grid and size construction lines are only available in checked mode | |
| rows.addAll(<Widget>[ | |
| new DrawerItem( | |
| icon: new Icon(Icons.border_clear), | |
| onPressed: () { _handleShowGridChanged(!config.configuration.debugShowGrid); }, | |
| child: new Row( | |
| children: <Widget>[ | |
| new Flexible(child: new Text('Show material grid (for debugging)')), | |
| new Switch( | |
| value: config.configuration.debugShowGrid, | |
| onChanged: _handleShowGridChanged | |
| ), | |
| ] | |
| ) | |
| ), | |
| new DrawerItem( | |
| icon: new Icon(Icons.border_all), | |
| onPressed: () { _handleShowSizesChanged(!config.configuration.debugShowSizes); }, | |
| child: new Row( | |
| children: <Widget>[ | |
| new Flexible(child: new Text('Show construction lines (for debugging)')), | |
| new Switch( | |
| value: config.configuration.debugShowSizes, | |
| onChanged: _handleShowSizesChanged | |
| ), | |
| ] | |
| ) | |
| ), | |
| new DrawerItem( | |
| icon: new Icon(Icons.format_color_text), | |
| onPressed: () { _handleShowBaselinesChanged(!config.configuration.debugShowBaselines); }, | |
| child: new Row( | |
| children: <Widget>[ | |
| new Flexible(child: new Text('Show baselines (for debugging)')), | |
| new Switch( | |
| value: config.configuration.debugShowBaselines, | |
| onChanged: _handleShowBaselinesChanged | |
| ), | |
| ] | |
| ) | |
| ), | |
| new DrawerItem( | |
| icon: new Icon(Icons.filter_none), | |
| onPressed: () { _handleShowLayersChanged(!config.configuration.debugShowLayers); }, | |
| child: new Row( | |
| children: <Widget>[ | |
| new Flexible(child: new Text('Show layer boundaries (for debugging)')), | |
| new Switch( | |
| value: config.configuration.debugShowLayers, | |
| onChanged: _handleShowLayersChanged | |
| ), | |
| ] | |
| ) | |
| ), | |
| new DrawerItem( | |
| icon: new Icon(Icons.mouse), | |
| onPressed: () { _handleShowPointersChanged(!config.configuration.debugShowPointers); }, | |
| child: new Row( | |
| children: <Widget>[ | |
| new Flexible(child: new Text('Show pointer hit-testing (for debugging)')), | |
| new Switch( | |
| value: config.configuration.debugShowPointers, | |
| onChanged: _handleShowPointersChanged | |
| ), | |
| ] | |
| ) | |
| ), | |
| new DrawerItem( | |
| icon: new Icon(Icons.gradient), | |
| onPressed: () { _handleShowRainbowChanged(!config.configuration.debugShowRainbow); }, | |
| child: new Row( | |
| children: <Widget>[ | |
| new Flexible(child: new Text('Show repaint rainbow (for debugging)')), | |
| new Switch( | |
| value: config.configuration.debugShowRainbow, | |
| onChanged: _handleShowRainbowChanged | |
| ), | |
| ] | |
| ) | |
| ), | |
| ]); | |
| return true; | |
| }); | |
| return new Block( | |
| children: rows, | |
| padding: const EdgeInsets.symmetric(vertical: 20.0) | |
| ); | |
| } | |
| @override | |
| Widget build(BuildContext context) { | |
| return new Scaffold( | |
| appBar: buildAppBar(context), | |
| body: buildSettingsPane(context) | |
| ); | |
| } | |
| } |