272 lines
8.3 KiB
Dart
272 lines
8.3 KiB
Dart
part of '../main.dart';
|
|
|
|
enum AppTheme {darkTheme, defaultTheme, haTheme}
|
|
|
|
class HAClientTheme {
|
|
|
|
static const TextTheme textTheme = TextTheme(
|
|
display1: TextStyle(fontSize: 34, fontWeight: FontWeight.normal),
|
|
display2: TextStyle(fontSize: 34, fontWeight: FontWeight.normal),
|
|
headline: TextStyle(fontSize: 24, fontWeight: FontWeight.normal),
|
|
title: TextStyle(fontSize: 20, fontWeight: FontWeight.w700),
|
|
subhead: TextStyle(fontSize: 16, fontWeight: FontWeight.normal),
|
|
body1: TextStyle(fontSize: 15, fontWeight: FontWeight.normal),
|
|
body2: TextStyle(fontSize: 15, fontWeight: FontWeight.w500),
|
|
subtitle: TextStyle(fontSize: 15, fontWeight: FontWeight.w500),
|
|
caption: TextStyle(fontSize: 12, fontWeight: FontWeight.normal),
|
|
overline: TextStyle(
|
|
fontSize: 10,
|
|
fontWeight: FontWeight.normal,
|
|
letterSpacing: 1,
|
|
),
|
|
button: TextStyle(fontSize: 14, fontWeight: FontWeight.w500),
|
|
);
|
|
|
|
static const offEntityStates = [
|
|
EntityState.off,
|
|
EntityState.closed,
|
|
"below_horizon",
|
|
"default",
|
|
EntityState.idle,
|
|
EntityState.alarm_disarmed,
|
|
];
|
|
|
|
static const onEntityStates = [
|
|
EntityState.on,
|
|
"auto",
|
|
EntityState.active,
|
|
EntityState.playing,
|
|
EntityState.paused,
|
|
"above_horizon",
|
|
EntityState.home,
|
|
EntityState.open,
|
|
EntityState.cleaning,
|
|
EntityState.returning,
|
|
"cool",
|
|
EntityState.alarm_arming,
|
|
EntityState.alarm_disarming,
|
|
EntityState.alarm_pending,
|
|
];
|
|
|
|
static const disabledEntityStates = [
|
|
EntityState.unavailable,
|
|
EntityState.unknown,
|
|
];
|
|
|
|
static const alarmEntityStates = [
|
|
EntityState.alarm_armed_away,
|
|
EntityState.alarm_armed_custom_bypass,
|
|
EntityState.alarm_armed_home,
|
|
EntityState.alarm_armed_night,
|
|
EntityState.alarm_triggered,
|
|
"heat",
|
|
];
|
|
|
|
static const defaultStateColor = Color.fromRGBO(68, 115, 158, 1.0);
|
|
|
|
static const badgeColors = {
|
|
"default": Color.fromRGBO(223, 76, 30, 1.0),
|
|
"binary_sensor": Color.fromRGBO(3, 155, 229, 1.0)
|
|
};
|
|
|
|
static final HAClientTheme _instance = HAClientTheme
|
|
._internal();
|
|
|
|
factory HAClientTheme() {
|
|
return _instance;
|
|
}
|
|
|
|
HAClientTheme._internal();
|
|
|
|
ThemeData getThemeData(AppTheme theme) {
|
|
switch (theme) {
|
|
case AppTheme.darkTheme:
|
|
return darkTheme;
|
|
break;
|
|
case AppTheme.defaultTheme:
|
|
return defaultTheme;
|
|
break;
|
|
case AppTheme.haTheme:
|
|
return homeAssistantTheme;
|
|
break;
|
|
default:
|
|
return defaultTheme;
|
|
}
|
|
}
|
|
|
|
final ThemeData defaultTheme = ThemeData.from(
|
|
colorScheme: ColorScheme(
|
|
primary: Color.fromRGBO(112, 154, 193, 1),
|
|
primaryVariant: Color.fromRGBO(68, 115, 158, 1),
|
|
secondary: Color.fromRGBO(253, 216, 53, 1),
|
|
secondaryVariant: Color.fromRGBO(222, 181, 2, 1),
|
|
background: Color.fromRGBO(250, 250, 250, 1),
|
|
surface: Colors.white,
|
|
error: Colors.red,
|
|
onPrimary: Colors.white,
|
|
onSecondary: Colors.black87,
|
|
onBackground: Colors.black87,
|
|
onSurface: Colors.black87,
|
|
onError: Colors.white,
|
|
brightness: Brightness.light
|
|
),
|
|
textTheme: ThemeData.light().textTheme.copyWith(
|
|
display1: textTheme.display1.copyWith(color: Colors.black54),
|
|
display2: textTheme.display2.copyWith(color: Colors.redAccent),
|
|
headline: textTheme.headline.copyWith(color: Colors.black87),
|
|
title: textTheme.title.copyWith(color: Colors.black87),
|
|
subhead: textTheme.subhead.copyWith(color: Colors.black54),
|
|
body1: textTheme.body1.copyWith(color: Colors.black87),
|
|
body2: textTheme.body2.copyWith(color: Colors.black87),
|
|
subtitle: textTheme.subtitle.copyWith(color: Colors.black45),
|
|
caption: textTheme.caption.copyWith(color: Colors.black45),
|
|
overline: textTheme.overline.copyWith(color: Colors.black26),
|
|
button: textTheme.button.copyWith(color: Colors.white),
|
|
)
|
|
);
|
|
|
|
final ThemeData homeAssistantTheme = ThemeData.from(
|
|
colorScheme: ColorScheme(
|
|
primary: Color.fromRGBO(2, 165, 238, 1),
|
|
primaryVariant: Color.fromRGBO(68, 115, 158, 1),
|
|
secondary: Color.fromRGBO(253, 216, 53, 1),
|
|
secondaryVariant: Color.fromRGBO(222, 181, 2, 1),
|
|
background: Color.fromRGBO(250, 250, 250, 1),
|
|
surface: Colors.white,
|
|
error: Colors.red,
|
|
onPrimary: Colors.white,
|
|
onSecondary: Colors.black87,
|
|
onBackground: Colors.black87,
|
|
onSurface: Colors.black87,
|
|
onError: Colors.white,
|
|
brightness: Brightness.light
|
|
),
|
|
textTheme: ThemeData.light().textTheme.copyWith(
|
|
display1: textTheme.display1.copyWith(color: Colors.black54),
|
|
display2: textTheme.display2.copyWith(color: Colors.redAccent),
|
|
headline: textTheme.headline.copyWith(color: Colors.black87),
|
|
title: textTheme.title.copyWith(color: Colors.black87),
|
|
subhead: textTheme.subhead.copyWith(color: Colors.black54),
|
|
body1: textTheme.body1.copyWith(color: Colors.black87),
|
|
body2: textTheme.body2.copyWith(color: Colors.black87),
|
|
subtitle: textTheme.subtitle.copyWith(color: Colors.black45),
|
|
caption: textTheme.caption.copyWith(color: Colors.black45),
|
|
overline: textTheme.overline.copyWith(color: Colors.black26),
|
|
button: textTheme.button.copyWith(color: Colors.white),
|
|
)
|
|
);
|
|
|
|
final ThemeData darkTheme = ThemeData.from(
|
|
colorScheme: ColorScheme(
|
|
primary: Color.fromRGBO(112, 154, 193, 1),
|
|
primaryVariant: Color.fromRGBO(68, 115, 158, 1),
|
|
secondary: Color.fromRGBO(253, 216, 53, 1),
|
|
secondaryVariant: Color.fromRGBO(222, 181, 2, 1),
|
|
background: Color.fromRGBO(47, 49, 54, 1),
|
|
surface: Color.fromRGBO(54, 57, 63, 1),
|
|
error: Color.fromRGBO(183, 109, 109, 1),
|
|
onPrimary: Colors.white,
|
|
onSecondary: Colors.black87,
|
|
onBackground: Color.fromRGBO(220, 221, 222, 1),
|
|
onSurface: Colors.white,
|
|
onError: Colors.white,
|
|
brightness: Brightness.dark
|
|
),
|
|
textTheme: textTheme
|
|
);
|
|
|
|
Color getOnStateColor(BuildContext context) {
|
|
return Theme.of(context).colorScheme.secondary;
|
|
}
|
|
|
|
Color getOffStateColor(BuildContext context) {
|
|
return Theme.of(context).colorScheme.primaryVariant;
|
|
}
|
|
|
|
Color getDisabledStateColor(BuildContext context) {
|
|
return Theme.of(context).disabledColor;
|
|
}
|
|
|
|
Color getAlertStateColor(BuildContext context) {
|
|
return Theme.of(context).colorScheme.error;
|
|
}
|
|
|
|
Color getColorByEntityState(String state, BuildContext context) {
|
|
if (onEntityStates.contains(state)) {
|
|
return getOnStateColor(context);
|
|
} else if (disabledEntityStates.contains(state)) {
|
|
return getDisabledStateColor(context);
|
|
} else if (alarmEntityStates.contains(state)) {
|
|
return getAlertStateColor(context);
|
|
} else {
|
|
return getOffStateColor(context);
|
|
}
|
|
}
|
|
|
|
Color getGreenGaugeColor() {
|
|
return Colors.green;
|
|
}
|
|
|
|
Color getYellowGaugeColor() {
|
|
return Colors.yellow;
|
|
}
|
|
|
|
Color getRedGaugeColor() {
|
|
return Colors.red;
|
|
}
|
|
|
|
TextStyle getLinkTextStyle(BuildContext context) {
|
|
ThemeData theme = Theme.of(context);
|
|
return theme.textTheme.body1.copyWith(
|
|
color: Colors.blue,
|
|
decoration: TextDecoration.underline
|
|
);
|
|
}
|
|
|
|
TextStyle getActionTextStyle(BuildContext context) {
|
|
ThemeData theme = Theme.of(context);
|
|
return theme.textTheme.subhead.copyWith(
|
|
color: Colors.blue
|
|
);
|
|
}
|
|
|
|
Color getBadgeColor(String entityDomain) {
|
|
return badgeColors[entityDomain] ??
|
|
badgeColors["default"];
|
|
}
|
|
|
|
Color getOnBadgeTextColor() {
|
|
return Colors.white;
|
|
}
|
|
|
|
charts.Color chartHistoryStateColor(String state, int id, BuildContext context) {
|
|
Color c = getColorByEntityState(state, context);
|
|
if (c != null) {
|
|
return charts.Color(
|
|
r: c.red,
|
|
g: c.green,
|
|
b: c.blue,
|
|
a: c.alpha
|
|
);
|
|
} else {
|
|
double r = id.toDouble() % 10;
|
|
return charts.MaterialPalette.getOrderedPalettes(10)[r.round()].shadeDefault;
|
|
}
|
|
}
|
|
|
|
Color historyStateColor(String state, int id, BuildContext context) {
|
|
Color c = getColorByEntityState(state, context);
|
|
if (c != null) {
|
|
return c;
|
|
} else {
|
|
if (id > -1) {
|
|
double r = id.toDouble() % 10;
|
|
charts.Color c1 = charts.MaterialPalette.getOrderedPalettes(10)[r.round()].shadeDefault;
|
|
return Color.fromARGB(c1.a, c1.r, c1.g, c1.b);
|
|
} else {
|
|
return getOnStateColor(context);
|
|
}
|
|
}
|
|
}
|
|
|
|
} |