178 lines
5.3 KiB
Dart
178 lines
5.3 KiB
Dart
import 'package:fluent_ui/fluent_ui.dart';
|
|
import 'package:provider/provider.dart';
|
|
|
|
import '../theme/app_theme.dart';
|
|
import '../widgets/page_mixin.dart';
|
|
|
|
const List<String> accentColorNames = [
|
|
'System',
|
|
'Yellow',
|
|
'Orange',
|
|
'Red',
|
|
'Magenta',
|
|
'Purple',
|
|
'Blue',
|
|
'Teal',
|
|
'Green',
|
|
];
|
|
|
|
class SettingsScreen extends StatefulWidget {
|
|
const SettingsScreen({super.key});
|
|
|
|
@override
|
|
State<SettingsScreen> createState() => _SettingsScreenState();
|
|
}
|
|
|
|
class _SettingsScreenState extends State<SettingsScreen> with PageMixin {
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final appTheme = context.watch<AppTheme>();
|
|
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,
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|