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