Persist RGB value for theme color instead

This commit is contained in:
Ming Ming 2022-11-13 18:20:33 +08:00
parent b2d60c2a24
commit 7b3b0fed40
2 changed files with 26 additions and 82 deletions

View file

@ -3,30 +3,6 @@ import 'package:logging/logging.dart';
import 'package:nc_photos/material3.dart';
import 'package:nc_photos/pref.dart';
enum SeedColor {
// the order must NOT change
amber,
blue,
green,
purple,
red;
Color toColor() {
switch (this) {
case amber:
return const Color(0xFFFFC107);
case blue:
return const Color(0xFF2196F3);
case green:
return const Color(0xFF4CAF50);
case purple:
return const Color(0xFF9C27B0);
case red:
return const Color(0xFFF44336);
}
}
}
extension ThemeExtension on ThemeData {
double get widthLimitedContentMaxWidth => 550.0;
@ -81,18 +57,16 @@ ThemeData buildTheme(Brightness brightness) {
ThemeData buildLightTheme() {
final seedColor = getSeedColor();
final color = seedColor.toColor();
final colorScheme = ColorScheme.fromSeed(
seedColor: color,
seedColor: seedColor,
);
return _applyColorScheme(colorScheme, color);
return _applyColorScheme(colorScheme, seedColor);
}
ThemeData buildDarkTheme() {
final seedColor = getSeedColor();
final color = seedColor.toColor();
final colorScheme = ColorScheme.fromSeed(
seedColor: color,
seedColor: seedColor,
brightness: Brightness.dark,
);
if (Pref().isUseBlackInDarkThemeOr(false)) {
@ -101,10 +75,10 @@ ThemeData buildDarkTheme() {
background: Colors.black,
surface: Colors.grey[900],
),
color,
seedColor,
);
} else {
return _applyColorScheme(colorScheme, color);
return _applyColorScheme(colorScheme, seedColor);
}
}
@ -118,20 +92,8 @@ ThemeData buildDarkModeSwitchTheme(BuildContext context) {
);
}
SeedColor getSeedColor() {
final index = Pref().getSeedColor();
if (index == null) {
return SeedColor.blue;
} else {
SeedColor seedColor;
try {
seedColor = SeedColor.values[index];
} catch (e, stackTrace) {
_log.severe("[getSeedColor] Uncaught exception", e, stackTrace);
seedColor = SeedColor.blue;
}
return seedColor;
}
Color getSeedColor() {
return Color(Pref().getSeedColor() ?? 0xFF2196F3).withAlpha(0xFF);
}
ThemeData _applyColorScheme(ColorScheme colorScheme, Color seedColor) {

View file

@ -1501,7 +1501,7 @@ class _ThemeSettingsState extends State<_ThemeSettings> {
trailing: Icon(
Icons.circle,
size: 32,
color: _seedColor.toColor(),
color: _seedColor,
),
onTap: () => _onSeedColorPressed(context),
),
@ -1571,11 +1571,9 @@ class _ThemeSettingsState extends State<_ThemeSettings> {
}
Future<void> _onSeedColorPressed(BuildContext context) async {
final result = await showDialog<SeedColor>(
final result = await showDialog<Color>(
context: context,
builder: (context) => _SeedColorPicker(
initialColor: _seedColor,
),
builder: (context) => const _SeedColorPicker(),
);
if (result == null) {
return;
@ -1585,7 +1583,7 @@ class _ThemeSettingsState extends State<_ThemeSettings> {
setState(() {
_seedColor = result;
});
if (await Pref().setSeedColor(result.index)) {
if (await Pref().setSeedColor(result.withAlpha(0xFF).value)) {
KiwiContainer().resolve<EventBus>().fire(ThemeChangedEvent());
} else {
_log.severe("[_onSeedColorPressed] Failed writing pref");
@ -1601,20 +1599,16 @@ class _ThemeSettingsState extends State<_ThemeSettings> {
late bool _isFollowSystemTheme;
late bool _isUseBlackInDarkTheme;
late SeedColor _seedColor;
late Color _seedColor;
static final _log = Logger("widget.settings._ThemeSettingsState");
}
class _SeedColorPicker extends StatefulWidget {
const _SeedColorPicker({
required this.initialColor,
});
const _SeedColorPicker();
@override
State<StatefulWidget> createState() => _SeedColorPickerState();
final SeedColor initialColor;
}
class _SeedColorPickerState extends State<_SeedColorPicker> {
@ -1624,15 +1618,14 @@ class _SeedColorPickerState extends State<_SeedColorPicker> {
title: Text(L10n.global().settingsSeedColorPickerTitle),
content: Wrap(
children: const [
SeedColor.red,
SeedColor.purple,
SeedColor.blue,
SeedColor.green,
SeedColor.amber,
Color(0xFFF44336),
Color(0xFF9C27B0),
Color(0xFF2196F3),
Color(0xFF4CAF50),
Color(0xFFFFC107),
]
.map((c) => _SeedColorPickerItem(
seedColor: c,
isSelected: c == widget.initialColor,
onSelected: () => _onItemSelected(context, c),
))
.toList(),
@ -1640,7 +1633,7 @@ class _SeedColorPickerState extends State<_SeedColorPicker> {
);
}
void _onItemSelected(BuildContext context, SeedColor seedColor) {
void _onItemSelected(BuildContext context, Color seedColor) {
Navigator.of(context).pop(seedColor);
}
}
@ -1648,7 +1641,6 @@ class _SeedColorPickerState extends State<_SeedColorPicker> {
class _SeedColorPickerItem extends StatelessWidget {
const _SeedColorPickerItem({
required this.seedColor,
required this.isSelected,
this.onSelected,
});
@ -1656,21 +1648,12 @@ class _SeedColorPickerItem extends StatelessWidget {
Widget build(BuildContext context) {
final content = SizedBox.square(
dimension: _size,
child: Stack(
alignment: Alignment.center,
children: [
if (isSelected)
Icon(
Icons.circle,
size: _size,
color: Theme.of(context).colorScheme.onSurface,
),
Icon(
Icons.circle,
size: _size - _size * .2,
color: seedColor.toColor(),
),
],
child: Center(
child: Icon(
Icons.circle,
size: _size - _size * .1,
color: seedColor,
),
),
);
if (onSelected != null) {
@ -1684,8 +1667,7 @@ class _SeedColorPickerItem extends StatelessWidget {
}
}
final SeedColor seedColor;
final bool isSelected;
final Color seedColor;
final VoidCallback? onSelected;
static const _size = 56.0;