Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions lib/core/app_initialization.dart
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,7 @@ Future<void> initPrefs() async {
"language",
"themeMode",
"enableDynamicColor",
"pureBlackDarkMode",
"themeSeedColor",
"tagsOrder",
"secureScreen",
Expand Down
4 changes: 4 additions & 0 deletions lib/l10n/app_en.arb
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@
"@dynamicColor": {},
"dynamicColorDescription": "Use system dynamic color scheme",
"@dynamicColorDescription": {},
"pureBlackDarkMode": "Pure Black Dark Mode (AMOLED)",
"@pureBlackDarkMode": {},
"pureBlackDarkModeDescription": "Use true black surfaces in dark theme",
"@pureBlackDarkModeDescription": {},
"appThemeColor": "App Theme Color",
"@appThemeColor": {},
"chooseThemeColor": "Choose Theme Color",
Expand Down
4 changes: 4 additions & 0 deletions lib/l10n/app_zh.arb
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@
"@dynamicColor": {},
"dynamicColorDescription": "使用系统动态配色方案",
"@dynamicColorDescription": {},
"pureBlackDarkMode": "纯黑暗色模式 (AMOLED)",
"@pureBlackDarkMode": {},
"pureBlackDarkModeDescription": "在深色主题中使用纯黑背景",
"@pureBlackDarkModeDescription": {},
"appThemeColor": "应用主题配色",
"@appThemeColor": {},
"chooseThemeColor": "选择主题色",
Expand Down
4 changes: 4 additions & 0 deletions lib/l10n/app_zh_HK.arb
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@
"@dynamicColor": {},
"dynamicColorDescription": "使用系統動態配色方案",
"@dynamicColorDescription": {},
"pureBlackDarkMode": "純黑暗色模式 (AMOLED)",
"@pureBlackDarkMode": {},
"pureBlackDarkModeDescription": "在深色主題中使用純黑背景",
"@pureBlackDarkModeDescription": {},
"appThemeColor": "應用主題配色",
"@appThemeColor": {},
"chooseThemeColor": "選擇主題色",
Expand Down
4 changes: 4 additions & 0 deletions lib/l10n/app_zh_TW.arb
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@
"@dynamicColor": {},
"dynamicColorDescription": "使用系統動態配色方案",
"@dynamicColorDescription": {},
"pureBlackDarkMode": "純黑深色模式 (AMOLED)",
"@pureBlackDarkMode": {},
"pureBlackDarkModeDescription": "在深色主題中使用純黑背景",
"@pureBlackDarkModeDescription": {},
"appThemeColor": "應用主題配色",
"@appThemeColor": {},
"chooseThemeColor": "選擇主題色",
Expand Down
38 changes: 34 additions & 4 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,24 @@ class Ciyue extends StatefulWidget {
}

class _CiyueState extends State<Ciyue> with TrayListener {
ColorScheme _applyPureBlackDarkScheme(ColorScheme colorScheme) {
if (colorScheme.brightness != Brightness.dark) {
return colorScheme;
}

return colorScheme.copyWith(
surface: Colors.black,
surfaceDim: Colors.black,
surfaceBright: Colors.black,
surfaceContainerLowest: Colors.black,
surfaceContainerLow: Colors.black,
surfaceContainer: Colors.black,
surfaceContainerHigh: Colors.black,
surfaceContainerHighest: Colors.black,
surfaceTint: Colors.transparent,
);
}

@override
Widget build(BuildContext context) {
if (widget.isFloatingWindow) {
Expand Down Expand Up @@ -159,15 +177,27 @@ class _CiyueState extends State<Ciyue> with TrayListener {

Widget buildMaterialApp(ColorScheme? lightColorScheme,
ColorScheme? darkColorScheme, Locale? locale) {
final ColorScheme resolvedDarkColorScheme;
if (darkColorScheme != null) {
resolvedDarkColorScheme = darkColorScheme;
} else {
resolvedDarkColorScheme = ColorScheme.fromSeed(
seedColor: Colors.blue, brightness: Brightness.dark);
}

final ColorScheme darkScheme;
if (settings.pureBlackDarkMode) {
darkScheme = _applyPureBlackDarkScheme(resolvedDarkColorScheme);
} else {
darkScheme = resolvedDarkColorScheme;
}

return SafeArea(
top: false,
child: MaterialApp.router(
title: "Ciyue",
theme: ThemeData(colorScheme: lightColorScheme),
darkTheme: ThemeData(
colorScheme: darkColorScheme ??
ColorScheme.fromSeed(
seedColor: Colors.blue, brightness: Brightness.dark)),
darkTheme: ThemeData(colorScheme: darkScheme),
themeMode: settings.themeMode,
locale: locale,
localizationsDelegates: [
Expand Down
7 changes: 7 additions & 0 deletions lib/repositories/settings.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ class Settings {

late ThemeMode themeMode;
late bool enableDynamicColor;
late bool pureBlackDarkMode;
late Color themeSeedColor;
String? language;
late bool searchBarInAppBar;
Expand Down Expand Up @@ -69,6 +70,7 @@ class Settings {

language = prefs.getString("language") ?? "system";
enableDynamicColor = prefs.getBool("enableDynamicColor") ?? true;
pureBlackDarkMode = prefs.getBool("pureBlackDarkMode") ?? false;
final int? themeSeedColorValue = prefs.getInt("themeSeedColor");
themeSeedColor = Color(themeSeedColorValue ?? Colors.blue.toARGB32());
searchBarInAppBar = prefs.getBool("searchBarInAppBar") ?? true;
Expand Down Expand Up @@ -173,6 +175,11 @@ class Settings {
await prefs.setInt("themeSeedColor", color.toARGB32());
}

Future<void> setPureBlackDarkMode(bool value) async {
pureBlackDarkMode = value;
await prefs.setBool("pureBlackDarkMode", value);
}

Future<void> setTabBarPosition(TabBarPosition position) async {
tabBarPosition = position;
await prefs.setString("tabBarPosition", position.name);
Expand Down
23 changes: 23 additions & 0 deletions lib/ui/pages/settings/appearance/theme_color_settings_section.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,23 @@ import "package:flutter_riverpod/flutter_riverpod.dart";

class ThemeColorSettingsState {
final bool dynamicColorEnabled;
final bool pureBlackDarkMode;
final Color seedColor;

const ThemeColorSettingsState({
required this.dynamicColorEnabled,
required this.pureBlackDarkMode,
required this.seedColor,
});

ThemeColorSettingsState copyWith({
bool? dynamicColorEnabled,
bool? pureBlackDarkMode,
Color? seedColor,
}) {
return ThemeColorSettingsState(
dynamicColorEnabled: dynamicColorEnabled ?? this.dynamicColorEnabled,
pureBlackDarkMode: pureBlackDarkMode ?? this.pureBlackDarkMode,
seedColor: seedColor ?? this.seedColor,
);
}
Expand All @@ -29,6 +33,7 @@ class ThemeColorSettingsNotifier extends Notifier<ThemeColorSettingsState> {
ThemeColorSettingsState build() {
return ThemeColorSettingsState(
dynamicColorEnabled: settings.enableDynamicColor,
pureBlackDarkMode: settings.pureBlackDarkMode,
seedColor: settings.themeSeedColor,
);
}
Expand All @@ -40,6 +45,10 @@ class ThemeColorSettingsNotifier extends Notifier<ThemeColorSettingsState> {
void setSeedColor(Color color) {
state = state.copyWith(seedColor: color);
}

void setPureBlackDarkMode(bool value) {
state = state.copyWith(pureBlackDarkMode: value);
}
}

final themeColorSettingsProvider =
Expand All @@ -57,6 +66,7 @@ class ThemeColorSettingsSection extends ConsumerWidget {
final locale = AppLocalizations.of(context)!;
final themeSettings = ref.watch(themeColorSettingsProvider);
final dynamicColorEnabled = themeSettings.dynamicColorEnabled;
final pureBlackDarkMode = themeSettings.pureBlackDarkMode;
final themeSeedColor = themeSettings.seedColor;

return Column(
Expand All @@ -74,6 +84,19 @@ class ThemeColorSettingsSection extends ConsumerWidget {
refreshAll();
},
),
SwitchListTile(
secondary: const Icon(Icons.contrast),
title: Text(locale.pureBlackDarkMode),
subtitle: Text(locale.pureBlackDarkModeDescription),
value: pureBlackDarkMode,
onChanged: (value) async {
ref
.read(themeColorSettingsProvider.notifier)
.setPureBlackDarkMode(value);
await settings.setPureBlackDarkMode(value);
refreshAll();
},
),
if (!dynamicColorEnabled)
ListTile(
leading: const Icon(Icons.palette_outlined),
Expand Down