ollama-app/lib/worker/theme.dart

113 lines
3.5 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
import '../main.dart';
ColorScheme? colorSchemeLight;
ColorScheme? colorSchemeDark;
void resetSystemNavigation(BuildContext context,
{Color? color,
Color? statusBarColor,
Color? systemNavigationBarColor,
Duration? delay}) {
WidgetsBinding.instance.addPostFrameCallback((_) async {
if (delay != null) {
await Future.delayed(delay);
}
// ignore: use_build_context_synchronously
color ??= themeCurrent(context).colorScheme.surface;
SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
statusBarIconBrightness:
(((statusBarColor != null) ? statusBarColor : color)!
.computeLuminance() >
0.179)
? Brightness.dark
: Brightness.light,
statusBarColor:
((((statusBarColor != null) ? statusBarColor : color)!.value !=
// ignore: use_build_context_synchronously
themeCurrent(context).colorScheme.surface.value) ||
kIsWeb)
? (statusBarColor != null)
? statusBarColor
: color
: Colors.transparent,
systemNavigationBarColor:
(systemNavigationBarColor != null) ? systemNavigationBarColor : color,
));
});
}
ThemeData themeModifier(ThemeData theme) {
return theme.copyWith(
// https://docs.flutter.dev/platform-integration/android/predictive-back#set-up-your-app
pageTransitionsTheme: const PageTransitionsTheme(
builders: <TargetPlatform, PageTransitionsBuilder>{
TargetPlatform.android: PredictiveBackPageTransitionsBuilder(),
},
));
}
ThemeData themeCurrent(BuildContext context) {
if (themeMode() == ThemeMode.system) {
if (MediaQuery.of(context).platformBrightness == Brightness.light) {
return themeLight();
} else {
return themeDark();
}
} else {
if (themeMode() == ThemeMode.light) {
return themeLight();
} else {
return themeDark();
}
}
}
ThemeData themeLight() {
if (!(prefs?.getBool("useDeviceTheme") ?? false) ||
colorSchemeLight == null) {
return themeModifier(ThemeData.from(
colorScheme: const ColorScheme(
brightness: Brightness.light,
primary: Colors.black,
onPrimary: Colors.white,
secondary: Colors.white,
onSecondary: Colors.black,
error: Colors.red,
onError: Colors.white,
surface: Colors.white,
onSurface: Colors.black)));
} else {
return themeModifier(ThemeData.from(colorScheme: colorSchemeLight!));
}
}
ThemeData themeDark() {
if (!(prefs?.getBool("useDeviceTheme") ?? false) || colorSchemeDark == null) {
return themeModifier(ThemeData.from(
colorScheme: const ColorScheme(
brightness: Brightness.dark,
primary: Colors.white,
onPrimary: Colors.black,
secondary: Colors.black,
onSecondary: Colors.white,
error: Colors.red,
onError: Colors.black,
surface: Colors.black,
onSurface: Colors.white)));
} else {
return themeModifier(ThemeData.from(colorScheme: colorSchemeDark!));
}
}
ThemeMode themeMode() {
return ((prefs?.getString("brightness") ?? "system") == "system")
? ThemeMode.system
: ((prefs!.getString("brightness") == "dark")
? ThemeMode.dark
: ThemeMode.light);
}