import 'package:fluent_ui/fluent_ui.dart'; import 'package:provider/provider.dart'; import '../theme/app_theme.dart'; import '../widgets/page_mixin.dart'; const List accentColorNames = [ 'System', 'Yellow', 'Orange', 'Red', 'Magenta', 'Purple', 'Blue', 'Teal', 'Green', ]; class SettingsScreen extends StatefulWidget { const SettingsScreen({super.key}); @override State createState() => _SettingsScreenState(); } class _SettingsScreenState extends State with PageMixin { @override Widget build(BuildContext context) { final appTheme = context.watch(); const spacer = SizedBox(height: 10); const biggerSpacer = SizedBox(height: 40); return ScaffoldPage.scrollable( header: const PageHeader(title: Text('Settings')), children: [ Text('Theme mode', style: FluentTheme.of(context).typography.subtitle), spacer, ...List.generate(ThemeMode.values.length, (index) { final mode = ThemeMode.values[index]; return Padding( padding: const EdgeInsetsDirectional.only(bottom: 8), child: RadioButton( checked: appTheme.mode == mode, onChanged: (value) { if (value) { appTheme.mode = mode; } }, content: Text('$mode'.replaceAll('ThemeMode.', '')), ), ); }), biggerSpacer, Text( 'Navigation Pane Display Mode', style: FluentTheme.of(context).typography.subtitle, ), spacer, ...List.generate(PaneDisplayMode.values.length, (index) { final mode = PaneDisplayMode.values[index]; return Padding( padding: const EdgeInsetsDirectional.only(bottom: 8), child: RadioButton( checked: appTheme.displayMode == mode, onChanged: (value) { if (value) appTheme.displayMode = mode; }, content: Text(mode.toString().replaceAll('PaneDisplayMode.', '')), ), ); }), biggerSpacer, Text( 'Navigation Indicator', style: FluentTheme.of(context).typography.subtitle, ), spacer, ...List.generate(NavigationIndicators.values.length, (index) { final mode = NavigationIndicators.values[index]; return Padding( padding: const EdgeInsetsDirectional.only(bottom: 8), child: RadioButton( checked: appTheme.indicator == mode, onChanged: (value) { if (value) appTheme.indicator = mode; }, content: Text( mode.toString().replaceAll('NavigationIndicators.', ''), ), ), ); }), biggerSpacer, Text( 'Accent Color', style: FluentTheme.of(context).typography.subtitle, ), spacer, Wrap( children: [ Tooltip( message: accentColorNames[0], child: _buildColorBlock(appTheme, systemAccentColor), ), ...List.generate(Colors.accentColors.length, (index) { final color = Colors.accentColors[index]; return Tooltip( message: accentColorNames[index + 1], child: _buildColorBlock(appTheme, color), ); }), ], ), biggerSpacer, Text( 'Text Direction', style: FluentTheme.of(context).typography.subtitle, ), spacer, ...List.generate(TextDirection.values.length, (index) { final direction = TextDirection.values[index]; return Padding( padding: const EdgeInsetsDirectional.only(bottom: 8), child: RadioButton( checked: appTheme.textDirection == direction, onChanged: (value) { if (value) { appTheme.textDirection = direction; } }, content: Text( '$direction' .replaceAll('TextDirection.', '') .replaceAll('rtl', 'Right to left') .replaceAll('ltr', 'Left to right'), ), ), ); }).reversed, ], ); } Widget _buildColorBlock(AppTheme appTheme, AccentColor color) { return Padding( padding: const EdgeInsetsDirectional.all(2), child: Button( onPressed: () { appTheme.color = color; }, style: ButtonStyle( padding: const WidgetStatePropertyAll(EdgeInsetsDirectional.zero), backgroundColor: WidgetStateProperty.resolveWith((states) { if (states.isPressed) { return color.light; } else if (states.isHovered) { return color.lighter; } return color; }), ), child: Container( height: 40, width: 40, alignment: AlignmentDirectional.center, child: appTheme.color == color ? Icon( FluentIcons.check_mark, color: color.basedOnLuminance(), size: 22, ) : null, ), ), ); } }