Refactor preferences
This commit is contained in:
179
lib/core/prefs/app_theme.dart
Normal file
179
lib/core/prefs/app_theme.dart
Normal file
@@ -0,0 +1,179 @@
|
||||
import 'package:flex_color_scheme/flex_color_scheme.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
// mostly exact copy of flex color scheme 7.1's fabulous 12 theme
|
||||
class AppTheme {
|
||||
AppTheme(
|
||||
this.mode,
|
||||
this.trueBlack,
|
||||
this.fontFamily,
|
||||
);
|
||||
|
||||
final ThemeMode mode;
|
||||
final bool trueBlack;
|
||||
final String fontFamily;
|
||||
|
||||
ThemeData light() {
|
||||
return FlexThemeData.light(
|
||||
scheme: FlexScheme.indigoM3,
|
||||
surfaceMode: FlexSurfaceMode.highScaffoldLowSurface,
|
||||
useMaterial3: true,
|
||||
swapLegacyOnMaterial3: true,
|
||||
useMaterial3ErrorColors: true,
|
||||
blendLevel: 1,
|
||||
subThemesData: const FlexSubThemesData(
|
||||
useTextTheme: true,
|
||||
useM2StyleDividerInM3: true,
|
||||
elevatedButtonSchemeColor: SchemeColor.onPrimaryContainer,
|
||||
elevatedButtonSecondarySchemeColor: SchemeColor.primaryContainer,
|
||||
outlinedButtonOutlineSchemeColor: SchemeColor.primary,
|
||||
toggleButtonsBorderSchemeColor: SchemeColor.primary,
|
||||
segmentedButtonSchemeColor: SchemeColor.primary,
|
||||
segmentedButtonBorderSchemeColor: SchemeColor.primary,
|
||||
unselectedToggleIsColored: true,
|
||||
sliderValueTinted: true,
|
||||
inputDecoratorSchemeColor: SchemeColor.primary,
|
||||
inputDecoratorBackgroundAlpha: 43,
|
||||
inputDecoratorUnfocusedHasBorder: false,
|
||||
inputDecoratorFocusedBorderWidth: 1.0,
|
||||
inputDecoratorPrefixIconSchemeColor: SchemeColor.primary,
|
||||
popupMenuRadius: 8.0,
|
||||
popupMenuElevation: 3.0,
|
||||
drawerIndicatorSchemeColor: SchemeColor.primary,
|
||||
bottomNavigationBarMutedUnselectedLabel: false,
|
||||
bottomNavigationBarMutedUnselectedIcon: false,
|
||||
menuRadius: 8.0,
|
||||
menuElevation: 3.0,
|
||||
menuBarRadius: 0.0,
|
||||
menuBarElevation: 2.0,
|
||||
menuBarShadowColor: Color(0x00000000),
|
||||
navigationBarSelectedLabelSchemeColor: SchemeColor.primary,
|
||||
navigationBarMutedUnselectedLabel: false,
|
||||
navigationBarSelectedIconSchemeColor: SchemeColor.onPrimary,
|
||||
navigationBarMutedUnselectedIcon: false,
|
||||
navigationBarIndicatorSchemeColor: SchemeColor.primary,
|
||||
navigationBarIndicatorOpacity: 1.00,
|
||||
navigationRailSelectedLabelSchemeColor: SchemeColor.primary,
|
||||
navigationRailMutedUnselectedLabel: false,
|
||||
navigationRailSelectedIconSchemeColor: SchemeColor.onPrimary,
|
||||
navigationRailMutedUnselectedIcon: false,
|
||||
navigationRailIndicatorSchemeColor: SchemeColor.primary,
|
||||
navigationRailIndicatorOpacity: 1.00,
|
||||
navigationRailBackgroundSchemeColor: SchemeColor.surface,
|
||||
),
|
||||
keyColors: const FlexKeyColors(
|
||||
useSecondary: true,
|
||||
useTertiary: true,
|
||||
keepPrimary: true,
|
||||
),
|
||||
tones: FlexTones.jolly(Brightness.light),
|
||||
visualDensity: FlexColorScheme.comfortablePlatformDensity,
|
||||
fontFamily: fontFamily,
|
||||
extensions: <ThemeExtension<dynamic>>{
|
||||
ConnectionButtonTheme.light,
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
ThemeData dark() {
|
||||
return FlexThemeData.dark(
|
||||
scheme: FlexScheme.indigoM3,
|
||||
useMaterial3: true,
|
||||
swapLegacyOnMaterial3: true,
|
||||
useMaterial3ErrorColors: true,
|
||||
darkIsTrueBlack: trueBlack,
|
||||
surfaceMode: FlexSurfaceMode.highScaffoldLowSurface,
|
||||
// blendLevel: 1,
|
||||
subThemesData: const FlexSubThemesData(
|
||||
blendTextTheme: true,
|
||||
useTextTheme: true,
|
||||
useM2StyleDividerInM3: true,
|
||||
elevatedButtonSchemeColor: SchemeColor.onPrimaryContainer,
|
||||
elevatedButtonSecondarySchemeColor: SchemeColor.primaryContainer,
|
||||
outlinedButtonOutlineSchemeColor: SchemeColor.primary,
|
||||
toggleButtonsBorderSchemeColor: SchemeColor.primary,
|
||||
segmentedButtonSchemeColor: SchemeColor.primary,
|
||||
segmentedButtonBorderSchemeColor: SchemeColor.primary,
|
||||
unselectedToggleIsColored: true,
|
||||
sliderValueTinted: true,
|
||||
inputDecoratorSchemeColor: SchemeColor.primary,
|
||||
inputDecoratorBackgroundAlpha: 43,
|
||||
inputDecoratorUnfocusedHasBorder: false,
|
||||
inputDecoratorFocusedBorderWidth: 1.0,
|
||||
inputDecoratorPrefixIconSchemeColor: SchemeColor.primary,
|
||||
popupMenuRadius: 8.0,
|
||||
popupMenuElevation: 3.0,
|
||||
drawerIndicatorSchemeColor: SchemeColor.primary,
|
||||
bottomNavigationBarMutedUnselectedLabel: false,
|
||||
bottomNavigationBarMutedUnselectedIcon: false,
|
||||
menuRadius: 8.0,
|
||||
menuElevation: 3.0,
|
||||
menuBarRadius: 0.0,
|
||||
menuBarElevation: 2.0,
|
||||
menuBarShadowColor: Color(0x00000000),
|
||||
navigationBarSelectedLabelSchemeColor: SchemeColor.primary,
|
||||
navigationBarMutedUnselectedLabel: false,
|
||||
navigationBarSelectedIconSchemeColor: SchemeColor.onPrimary,
|
||||
navigationBarMutedUnselectedIcon: false,
|
||||
navigationBarIndicatorSchemeColor: SchemeColor.primary,
|
||||
navigationBarIndicatorOpacity: 1.00,
|
||||
navigationRailSelectedLabelSchemeColor: SchemeColor.primary,
|
||||
navigationRailMutedUnselectedLabel: false,
|
||||
navigationRailSelectedIconSchemeColor: SchemeColor.onPrimary,
|
||||
navigationRailMutedUnselectedIcon: false,
|
||||
navigationRailIndicatorSchemeColor: SchemeColor.primary,
|
||||
navigationRailIndicatorOpacity: 1.00,
|
||||
navigationRailBackgroundSchemeColor: SchemeColor.surface,
|
||||
),
|
||||
keyColors: const FlexKeyColors(
|
||||
useSecondary: true,
|
||||
useTertiary: true,
|
||||
),
|
||||
// tones: FlexTones.jolly(Brightness.dark),
|
||||
visualDensity: FlexColorScheme.comfortablePlatformDensity,
|
||||
fontFamily: fontFamily,
|
||||
extensions: <ThemeExtension<dynamic>>{
|
||||
ConnectionButtonTheme.light,
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class ConnectionButtonTheme extends ThemeExtension<ConnectionButtonTheme> {
|
||||
const ConnectionButtonTheme({
|
||||
this.idleColor,
|
||||
this.connectedColor,
|
||||
});
|
||||
|
||||
final Color? idleColor;
|
||||
final Color? connectedColor;
|
||||
|
||||
static const ConnectionButtonTheme light = ConnectionButtonTheme(
|
||||
idleColor: Color(0xFF4a4d8b),
|
||||
connectedColor: Color(0xFF44a334),
|
||||
);
|
||||
|
||||
@override
|
||||
ThemeExtension<ConnectionButtonTheme> copyWith({
|
||||
Color? idleColor,
|
||||
Color? connectedColor,
|
||||
}) =>
|
||||
ConnectionButtonTheme(
|
||||
idleColor: idleColor ?? this.idleColor,
|
||||
connectedColor: connectedColor ?? this.connectedColor,
|
||||
);
|
||||
|
||||
@override
|
||||
ThemeExtension<ConnectionButtonTheme> lerp(
|
||||
covariant ThemeExtension<ConnectionButtonTheme>? other,
|
||||
double t,
|
||||
) {
|
||||
if (other is! ConnectionButtonTheme) {
|
||||
return this;
|
||||
}
|
||||
return ConnectionButtonTheme(
|
||||
idleColor: Color.lerp(idleColor, other.idleColor, t),
|
||||
connectedColor: Color.lerp(connectedColor, other.connectedColor, t),
|
||||
);
|
||||
}
|
||||
}
|
||||
44
lib/core/prefs/locale_prefs.dart
Normal file
44
lib/core/prefs/locale_prefs.dart
Normal file
@@ -0,0 +1,44 @@
|
||||
import 'package:dartx/dartx.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
import 'package:hiddify/gen/fonts.gen.dart';
|
||||
import 'package:hiddify/gen/translations.g.dart';
|
||||
import 'package:hiddify/utils/pref_notifier.dart';
|
||||
|
||||
export 'package:hiddify/gen/translations.g.dart';
|
||||
|
||||
final localeProvider = AlwaysAlivePrefNotifier.provider(
|
||||
"locale",
|
||||
AppLocale.deviceLocale(),
|
||||
mapFrom: AppLocale.values.byName,
|
||||
mapTo: (value) => value.name,
|
||||
);
|
||||
|
||||
enum AppLocale {
|
||||
en,
|
||||
fa;
|
||||
|
||||
Locale get locale {
|
||||
return Locale(name);
|
||||
}
|
||||
|
||||
static List<Locale> get locales =>
|
||||
AppLocale.values.map((e) => e.locale).toList();
|
||||
|
||||
static AppLocale fromString(String e) {
|
||||
return AppLocale.values.firstOrNullWhere((element) => element.name == e) ??
|
||||
AppLocale.en;
|
||||
}
|
||||
|
||||
static AppLocale deviceLocale() {
|
||||
return AppLocale.fromString(
|
||||
AppLocaleUtils.findDeviceLocale().languageCode,
|
||||
);
|
||||
}
|
||||
|
||||
TranslationsEn translations() {
|
||||
final appLocale = AppLocaleUtils.parse(name);
|
||||
return appLocale.build();
|
||||
}
|
||||
|
||||
String get preferredFontFamily => this == fa ? FontFamily.shabnam : "";
|
||||
}
|
||||
@@ -1 +1,4 @@
|
||||
export 'app_theme.dart';
|
||||
export 'general_prefs.dart';
|
||||
export 'locale_prefs.dart';
|
||||
export 'theme_prefs.dart';
|
||||
|
||||
14
lib/core/prefs/theme_prefs.dart
Normal file
14
lib/core/prefs/theme_prefs.dart
Normal file
@@ -0,0 +1,14 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:hiddify/utils/pref_notifier.dart';
|
||||
|
||||
final themeModeProvider = AlwaysAlivePrefNotifier.provider(
|
||||
"theme_mode",
|
||||
ThemeMode.system,
|
||||
mapFrom: ThemeMode.values.byName,
|
||||
mapTo: (value) => value.name,
|
||||
);
|
||||
|
||||
final trueBlackThemeProvider = AlwaysAlivePrefNotifier.provider(
|
||||
"true_black_theme",
|
||||
false,
|
||||
);
|
||||
Reference in New Issue
Block a user