nc-photos/lib/theme.dart

141 lines
4.3 KiB
Dart
Raw Normal View History

2021-04-10 06:28:12 +02:00
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:nc_photos/pref.dart';
2021-04-10 06:28:12 +02:00
class AppTheme extends StatelessWidget {
2021-07-23 22:05:57 +02:00
const AppTheme({
2021-09-15 08:58:06 +02:00
Key? key,
2021-07-23 22:05:57 +02:00
required this.child,
2021-09-15 08:58:06 +02:00
}) : super(key: key);
2021-04-10 06:28:12 +02:00
@override
Widget build(BuildContext context) {
return Theme(
2021-07-16 09:55:04 +02:00
data: buildThemeData(context),
2021-04-10 06:28:12 +02:00
child: child,
);
}
2021-07-16 09:55:04 +02:00
static ThemeData buildThemeData(BuildContext context) {
final theme = Theme.of(context);
return theme.brightness == Brightness.light
? _buildLightThemeData(context, theme)
: _buildDarkThemeData(context, theme);
2021-04-10 06:28:12 +02:00
}
static AppBarTheme getContextualAppBarTheme(BuildContext context) {
final theme = Theme.of(context);
if (theme.brightness == Brightness.light) {
return theme.appBarTheme.copyWith(
backgroundColor: Colors.grey[800],
foregroundColor: Colors.white.withOpacity(.87),
2021-04-10 06:28:12 +02:00
);
} else {
return theme.appBarTheme.copyWith(
backgroundColor: Colors.grey[200],
foregroundColor: Colors.black87,
2021-04-10 06:28:12 +02:00
);
}
}
static Color getSelectionOverlayColor(BuildContext context) {
return Theme.of(context).brightness == Brightness.light
2021-07-23 22:05:57 +02:00
? primarySwatchLight[100]!.withOpacity(0.7)
: primarySwatchDark[700]!.withOpacity(0.7);
2021-04-10 06:28:12 +02:00
}
static Color getOverscrollIndicatorColor(BuildContext context) {
return Theme.of(context).brightness == Brightness.light
2021-07-23 22:05:57 +02:00
? Colors.grey[800]!
: Colors.grey[200]!;
2021-04-10 06:28:12 +02:00
}
static Color getRootPickerContentBoxColor(BuildContext context) {
2021-07-23 22:05:57 +02:00
return Colors.blue[200]!;
2021-04-10 06:28:12 +02:00
}
2021-04-17 10:59:16 +02:00
static Color getPrimaryTextColor(BuildContext context) {
return Theme.of(context).brightness == Brightness.light
? Colors.black87
: Colors.white.withOpacity(.87);
}
static Color getSecondaryTextColor(BuildContext context) {
return Theme.of(context).brightness == Brightness.light
? Colors.black.withOpacity(.6)
: Colors.white60;
}
2021-04-17 11:04:46 +02:00
static Color getAppBarDarkModeSwitchColor(BuildContext context) {
return Colors.black87;
}
static Color getAppBarDarkModeSwitchTrackColor(BuildContext context) {
return Colors.white.withOpacity(.5);
}
2021-05-05 22:03:39 +02:00
static Color getListItemBackgroundColor(BuildContext context) {
return Theme.of(context).brightness == Brightness.light
? Colors.black26
: Colors.white12;
}
2021-07-16 09:55:04 +02:00
static ThemeData _buildLightThemeData(BuildContext context, ThemeData theme) {
final appBarTheme = theme.appBarTheme.copyWith(
backgroundColor: theme.scaffoldBackgroundColor,
foregroundColor: theme.colorScheme.onSurface,
2021-07-16 09:55:04 +02:00
);
return theme.copyWith(appBarTheme: appBarTheme);
}
static ThemeData _buildDarkThemeData(BuildContext context, ThemeData theme) {
final Color background;
final Color popup;
if (Pref.inst().isUseBlackInDarkThemeOr(false)) {
background = Colors.black;
popup = Colors.grey[900]!;
} else {
// in the material spec, black is suggested to be 0x121212, but the one
// used in flutter by default is 0x303030, why?
background = Colors.grey[850]!;
popup = Colors.grey[800]!;
}
2021-07-16 09:55:04 +02:00
final appBarTheme = theme.appBarTheme.copyWith(
backgroundColor: background,
foregroundColor: theme.colorScheme.onSurface,
2021-07-16 09:55:04 +02:00
);
final bottomNavigationBarTheme = theme.bottomNavigationBarTheme.copyWith(
backgroundColor: background,
);
final popupMenuTheme = theme.popupMenuTheme.copyWith(
color: popup,
);
return theme.copyWith(
scaffoldBackgroundColor: background,
appBarTheme: appBarTheme,
bottomNavigationBarTheme: bottomNavigationBarTheme,
popupMenuTheme: popupMenuTheme,
dialogBackgroundColor: popup,
);
2021-07-16 09:55:04 +02:00
}
2021-04-10 06:28:12 +02:00
static const primarySwatchLight = Colors.blue;
static const primarySwatchDark = Colors.cyan;
static const widthLimitedContentMaxWidth = 550.0;
/// Make a TextButton look like a default FlatButton. See
/// https://flutter.dev/go/material-button-migration-guide
static final flatButtonStyle = TextButton.styleFrom(
primary: Colors.black87,
2021-09-15 08:58:06 +02:00
minimumSize: const Size(88, 36),
padding: const EdgeInsets.symmetric(horizontal: 16.0),
2021-04-10 06:28:12 +02:00
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(2.0)),
),
);
final Widget child;
}