use super::{BaseColor, Color, ColorPair, Palette, PaletteColor};
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub struct ColorStyle {
pub front: ColorType,
pub back: ColorType,
}
impl ColorStyle {
pub fn new<F, B>(front: F, back: B) -> Self
where
F: Into<ColorType>,
B: Into<ColorType>,
{
let front = front.into();
let back = back.into();
Self { front, back }
}
pub fn terminal_default() -> Self {
Self::new(Color::TerminalDefault, Color::TerminalDefault)
}
pub fn background() -> Self {
Self::new(PaletteColor::Background, PaletteColor::Background)
}
pub fn shadow() -> Self {
Self::new(PaletteColor::Shadow, PaletteColor::Shadow)
}
pub fn primary() -> Self {
Self::new(PaletteColor::Primary, PaletteColor::View)
}
pub fn secondary() -> Self {
Self::new(PaletteColor::Secondary, PaletteColor::View)
}
pub fn tertiary() -> Self {
Self::new(PaletteColor::Tertiary, PaletteColor::View)
}
pub fn title_primary() -> Self {
Self::new(PaletteColor::TitlePrimary, PaletteColor::View)
}
pub fn title_secondary() -> Self {
Self::new(PaletteColor::TitleSecondary, PaletteColor::View)
}
pub fn highlight() -> Self {
Self::new(PaletteColor::View, PaletteColor::Highlight)
}
pub fn highlight_inactive() -> Self {
Self::new(PaletteColor::View, PaletteColor::HighlightInactive)
}
pub fn resolve(&self, palette: &Palette) -> ColorPair {
ColorPair {
front: self.front.resolve(palette),
back: self.back.resolve(palette),
}
}
}
impl From<Color> for ColorStyle {
fn from(color: Color) -> Self {
Self::new(color, PaletteColor::View)
}
}
impl From<BaseColor> for ColorStyle {
fn from(color: BaseColor) -> Self {
Self::new(Color::Dark(color), PaletteColor::View)
}
}
impl From<PaletteColor> for ColorStyle {
fn from(color: PaletteColor) -> Self {
Self::new(color, PaletteColor::View)
}
}
impl From<ColorType> for ColorStyle {
fn from(color: ColorType) -> Self {
Self::new(color, PaletteColor::View)
}
}
impl<F, B> From<(F, B)> for ColorStyle
where
F: Into<ColorType>,
B: Into<ColorType>,
{
fn from((front, back): (F, B)) -> Self {
Self::new(front, back)
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum ColorType {
Palette(PaletteColor),
Color(Color),
}
impl ColorType {
pub fn resolve(self, palette: &Palette) -> Color {
match self {
ColorType::Color(color) => color,
ColorType::Palette(color) => color.resolve(palette),
}
}
}
impl From<Color> for ColorType {
fn from(color: Color) -> Self {
ColorType::Color(color)
}
}
impl From<PaletteColor> for ColorType {
fn from(color: PaletteColor) -> Self {
ColorType::Palette(color)
}
}