blob: 3919096e05e1239ab396718f1a0b91c825065f97 [file] [log] [blame]
// 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)
);
}
}