93 lines
3.2 KiB
Dart
93 lines
3.2 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_colorpicker/flutter_colorpicker.dart';
|
|
import 'main.dart';
|
|
|
|
import 'generated/l10n.dart';
|
|
|
|
typedef OnThemeSaved(Color primary, Color primaryAccent, Color secondary, Color secondaryAccent);
|
|
|
|
class ThemeEditorPage extends StatefulWidget {
|
|
final OnThemeSaved? onSaved;
|
|
|
|
ThemeEditorPage({this.onSaved});
|
|
ThemeEditorState createState() => ThemeEditorState();
|
|
}
|
|
|
|
class ThemeEditorState extends State<ThemeEditorPage> {
|
|
Color _primary = Colors.black;
|
|
Color _primaryVariant = Colors.black;
|
|
Color _secondary = Colors.black;
|
|
Color _secondaryVariant = Colors.black;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
|
|
_primary = Color(settings.primaryColorValue);
|
|
_primaryVariant = Color(settings.primaryVariantColorValue);
|
|
_secondary = Color(settings.secondaryColorValue);
|
|
_secondaryVariant = Color(settings.secondaryVariantColorValue);
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final theme = Theme.of(context);
|
|
final s = S.of(context);
|
|
return Scaffold(
|
|
appBar: AppBar(title: Text(s.themeEditor)),
|
|
body: Padding(padding: EdgeInsets.all(8), child: Form(
|
|
child: Column(children: [
|
|
Text(s.primary, style: theme.textTheme.titleLarge),
|
|
Padding(padding: EdgeInsets.all(4)),
|
|
Card(
|
|
shape: RoundedRectangleBorder(
|
|
side: BorderSide(color: theme.dividerColor, width: 1)
|
|
),
|
|
child: Column(children: [
|
|
ListTile(title: Text(s.color), trailing: ColorSwatch(_primary, (c) => setState(() { _primary = c; }))),
|
|
ListTile(title: Text(s.accentColor), trailing: ColorSwatch(_primaryVariant, (c) => setState(() { _primaryVariant = c; }))),
|
|
])),
|
|
Padding(padding: EdgeInsets.all(8)),
|
|
Text(s.secondary, style: theme.textTheme.titleLarge),
|
|
Padding(padding: EdgeInsets.all(4)),
|
|
Card(
|
|
child: Column(children: [
|
|
ListTile(title: Text(s.color), trailing: ColorSwatch(_secondary, (c) => setState(() { _secondary = c; }))),
|
|
ListTile(title: Text(s.accentColor), trailing: ColorSwatch(_secondaryVariant, (c) => setState(() { _secondaryVariant = c; }))),
|
|
])),
|
|
ButtonBar(children: confirmButtons(context, _ok))
|
|
]))));
|
|
}
|
|
|
|
_ok() {
|
|
widget.onSaved?.call(_primary, _primaryVariant, _secondary, _secondaryVariant);
|
|
Navigator.of(context).pop();
|
|
}
|
|
}
|
|
|
|
class ColorSwatch extends StatelessWidget {
|
|
final Color color;
|
|
final Function(Color) onColorChanged;
|
|
|
|
ColorSwatch(this.color, this.onColorChanged);
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return GestureDetector(
|
|
onTap: () => _openColorPicker(context),
|
|
child: SizedBox(width: 32, height: 32, child: Container(color: color)));
|
|
}
|
|
|
|
_openColorPicker(BuildContext context) async {
|
|
await showDialog(
|
|
context: context,
|
|
builder: (context) => AlertDialog(
|
|
title: Text('Pick a color'),
|
|
content: SingleChildScrollView(
|
|
child: ColorPicker(
|
|
pickerColor: color,
|
|
onColorChanged: onColorChanged),
|
|
))
|
|
);
|
|
}
|
|
} |