2022-01-08 23:54:24 +00:00
|
|
|
use iced::Font;
|
2022-01-01 18:21:34 +00:00
|
|
|
use image::Rgb;
|
|
|
|
use crate::palette::Palette;
|
2021-12-30 22:58:56 +00:00
|
|
|
use iced::Background;
|
|
|
|
use iced::Color;
|
|
|
|
use iced::widget::container;
|
2021-12-31 05:09:01 +00:00
|
|
|
use iced::widget::text_input;
|
|
|
|
|
2022-01-08 23:54:24 +00:00
|
|
|
pub const FONT_VG5000: Font = Font::External {
|
|
|
|
name: "VG5000",
|
|
|
|
bytes: include_bytes!("../fonts/vg5000/VG5000.otf"),
|
|
|
|
};
|
|
|
|
|
2021-12-30 22:58:56 +00:00
|
|
|
#[derive(Copy, Clone, Debug)]
|
|
|
|
pub struct Theme {
|
|
|
|
pub base_color: Color,
|
|
|
|
pub text_color: Color,
|
2022-01-08 23:54:24 +00:00
|
|
|
subtype: Subtype,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
|
|
|
|
enum Subtype {
|
|
|
|
Base,
|
|
|
|
ActiveLyric,
|
2021-12-30 22:58:56 +00:00
|
|
|
}
|
2022-01-08 23:54:24 +00:00
|
|
|
use Subtype::*;
|
2021-12-30 22:58:56 +00:00
|
|
|
|
2022-01-01 18:21:34 +00:00
|
|
|
impl Theme {
|
2022-01-26 23:42:31 +00:00
|
|
|
pub fn from_palette(palette: &Palette) -> Self {
|
2022-01-09 02:08:17 +00:00
|
|
|
let base_color = img_color_to_iced(palette.dominant_color());
|
|
|
|
let luma = relative_lum(base_color);
|
|
|
|
let text_color = if luma > 0.2 {
|
|
|
|
Color {
|
|
|
|
a: 0.8,
|
|
|
|
..Color::BLACK
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
Color::WHITE
|
|
|
|
};
|
2022-01-26 23:42:31 +00:00
|
|
|
Self {
|
2022-01-08 23:54:24 +00:00
|
|
|
subtype: Base,
|
2022-01-09 02:08:17 +00:00
|
|
|
base_color, text_color,
|
2022-01-08 23:54:24 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-01-26 23:42:31 +00:00
|
|
|
pub const fn reduced_text_color(&self) -> Color {
|
2022-01-08 23:54:24 +00:00
|
|
|
Color {
|
2022-01-09 14:27:03 +00:00
|
|
|
a: 0.7,
|
2022-01-08 23:54:24 +00:00
|
|
|
..self.text_color
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-01-26 23:42:31 +00:00
|
|
|
pub const fn active_lyric(&self, active: bool) -> Self {
|
2022-01-08 23:54:24 +00:00
|
|
|
if active {
|
|
|
|
self.set_subtype(ActiveLyric)
|
|
|
|
} else {
|
|
|
|
*self
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-01-26 23:42:31 +00:00
|
|
|
const fn set_subtype(&self, subtype: Subtype) -> Self {
|
|
|
|
Self {
|
2022-01-08 23:54:24 +00:00
|
|
|
subtype,
|
|
|
|
..*self
|
2022-01-01 18:21:34 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-12-30 22:58:56 +00:00
|
|
|
impl Default for Theme {
|
|
|
|
fn default() -> Self {
|
2022-01-26 23:42:31 +00:00
|
|
|
Self {
|
2021-12-30 22:58:56 +00:00
|
|
|
base_color: Color {r: 236. / 255., g: 63. / 255., b: 53. / 255., a: 1.},
|
|
|
|
text_color: Color {r: 1., g: 1., b: 1., a: 1.},
|
2022-01-08 23:54:24 +00:00
|
|
|
subtype: Base,
|
2021-12-30 22:58:56 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl container::StyleSheet for Theme {
|
|
|
|
fn style(&self) -> container::Style {
|
|
|
|
container::Style {
|
|
|
|
text_color: Some(self.text_color),
|
|
|
|
background: Some(Background::Color(self.base_color)),
|
|
|
|
..Default::default()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2021-12-31 05:09:01 +00:00
|
|
|
|
|
|
|
impl text_input::StyleSheet for Theme {
|
|
|
|
fn active(&self) -> text_input::Style {
|
|
|
|
text_input::Style {
|
|
|
|
background: Background::Color(self.base_color),
|
|
|
|
border_radius: 0.,
|
|
|
|
border_width: 0.,
|
|
|
|
..Default::default()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn focused(&self) -> text_input::Style {
|
|
|
|
self.active()
|
|
|
|
}
|
|
|
|
|
|
|
|
fn placeholder_color(&self) -> Color {
|
2022-01-08 23:54:24 +00:00
|
|
|
Color {
|
|
|
|
a: 0.3,
|
|
|
|
..self.text_color
|
|
|
|
}
|
2021-12-31 05:09:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
fn value_color(&self) -> Color {
|
2022-01-08 23:54:24 +00:00
|
|
|
if self.subtype == ActiveLyric {
|
|
|
|
self.text_color
|
|
|
|
} else {
|
|
|
|
self.reduced_text_color()
|
|
|
|
}
|
2021-12-31 05:09:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
fn selection_color(&self) -> Color {
|
|
|
|
self.text_color
|
|
|
|
}
|
|
|
|
}
|
2022-01-01 18:21:34 +00:00
|
|
|
|
2022-01-26 23:42:31 +00:00
|
|
|
fn img_color_to_iced(color: Rgb<u8>) -> Color {
|
2022-01-01 18:21:34 +00:00
|
|
|
Color {
|
|
|
|
r: color[0] as f32 / 255.,
|
|
|
|
g: color[1] as f32 / 255.,
|
|
|
|
b: color[2] as f32 / 255.,
|
|
|
|
a: 1.
|
|
|
|
}
|
|
|
|
}
|
2022-01-09 02:08:17 +00:00
|
|
|
|
|
|
|
pub fn relative_lum(color: Color) -> f32 {
|
|
|
|
let mut t = [color.r, color.g, color.b]
|
|
|
|
.into_iter()
|
|
|
|
.map(|val| {
|
|
|
|
if val < 0.03928 {
|
|
|
|
val / 12.92
|
|
|
|
} else {
|
|
|
|
((val+0.055)/1.055).powf(2.4)
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
0.2126 * t.next().unwrap() + 0.7152 * t.next().unwrap() + 0.0722 * t.next().unwrap()
|
|
|
|
}
|