diff options
Diffstat (limited to 'src/config/raw/theme/style.rs')
-rw-r--r-- | src/config/raw/theme/style.rs | 131 |
1 files changed, 89 insertions, 42 deletions
diff --git a/src/config/raw/theme/style.rs b/src/config/raw/theme/style.rs index a588bd5..fd037a7 100644 --- a/src/config/raw/theme/style.rs +++ b/src/config/raw/theme/style.rs @@ -1,11 +1,96 @@ use colors_transform::{Color, Rgb}; - +use ratatui::style::{self, Style}; use serde::Deserialize; -use ratatui::style; - use crate::config::clean::theme::style::AppStyle; +fn str_to_color(s: &str) -> style::Color { + match s { + "black" => style::Color::Black, + "red" => style::Color::Red, + "green" => style::Color::Green, + "yellow" => style::Color::Yellow, + "blue" => style::Color::Blue, + "magenta" => style::Color::Magenta, + "cyan" => style::Color::Cyan, + "gray" => style::Color::Gray, + "dark_gray" => style::Color::DarkGray, + "light_red" => style::Color::LightRed, + "light_green" => style::Color::LightGreen, + "light_yellow" => style::Color::LightYellow, + "light_blue" => style::Color::LightBlue, + "light_magenta" => style::Color::LightMagenta, + "light_cyan" => style::Color::LightCyan, + "white" => style::Color::White, + "reset" => style::Color::Reset, + s if s.starts_with('#') => { + let rgb = match Rgb::from_hex_str(s) { + Ok(s) => s, + _ => return style::Color::Reset, + }; + let r = rgb.get_red() as u8; + let g = rgb.get_green() as u8; + let b = rgb.get_blue() as u8; + style::Color::Rgb(r, g, b) + } + s if s.is_empty() => style::Color::Reset, + s => match s.parse::<Rgb>() { + Ok(rgb) => { + let r = rgb.get_red() as u8; + let g = rgb.get_green() as u8; + let b = rgb.get_blue() as u8; + style::Color::Rgb(r, g, b) + } + Err(_) => style::Color::Reset, + }, + } +} + +#[derive(Clone, Debug, Deserialize)] + +pub struct AppStyleOptionsRaw { + pub fg: Option<String>, + pub bg: Option<String>, + pub bold: Option<bool>, + pub underline: Option<bool>, + pub invert: Option<bool>, +} + +impl AppStyleOptionsRaw { + pub fn as_style(&self) -> Style { + let mut add_modifier = style::Modifier::empty(); + let mut sub_modifier = style::Modifier::empty(); + if let Some(bold) = self.bold { + if bold { + add_modifier.insert(style::Modifier::BOLD); + } else { + sub_modifier.insert(style::Modifier::BOLD); + } + } + if let Some(underline) = self.underline { + if underline { + add_modifier.insert(style::Modifier::UNDERLINED); + } else { + sub_modifier.insert(style::Modifier::UNDERLINED); + } + } + if let Some(invert) = self.invert { + if invert { + add_modifier.insert(style::Modifier::REVERSED); + } else { + sub_modifier.insert(style::Modifier::REVERSED); + } + } + Style { + fg: self.fg.clone().map(|s| str_to_color(s.as_ref())), + bg: self.bg.clone().map(|s| str_to_color(s.as_ref())), + add_modifier, + sub_modifier, + //underline_color: None, # only when ratatui with crossterm + } + } +} + #[derive(Clone, Debug, Deserialize)] pub struct AppStyleRaw { #[serde(default)] @@ -40,45 +125,7 @@ impl AppStyleRaw { } pub fn str_to_color(s: &str) -> style::Color { - match s { - "black" => style::Color::Black, - "red" => style::Color::Red, - "green" => style::Color::Green, - "yellow" => style::Color::Yellow, - "blue" => style::Color::Blue, - "magenta" => style::Color::Magenta, - "cyan" => style::Color::Cyan, - "gray" => style::Color::Gray, - "dark_gray" => style::Color::DarkGray, - "light_red" => style::Color::LightRed, - "light_green" => style::Color::LightGreen, - "light_yellow" => style::Color::LightYellow, - "light_blue" => style::Color::LightBlue, - "light_magenta" => style::Color::LightMagenta, - "light_cyan" => style::Color::LightCyan, - "white" => style::Color::White, - "reset" => style::Color::Reset, - s if s.starts_with('#') => { - let rgb = match Rgb::from_hex_str(s) { - Ok(s) => s, - _ => return style::Color::Reset, - }; - let r = rgb.get_red() as u8; - let g = rgb.get_green() as u8; - let b = rgb.get_blue() as u8; - style::Color::Rgb(r, g, b) - } - s if s.is_empty() => style::Color::Reset, - s => match s.parse::<Rgb>() { - Ok(rgb) => { - let r = rgb.get_red() as u8; - let g = rgb.get_green() as u8; - let b = rgb.get_blue() as u8; - style::Color::Rgb(r, g, b) - } - Err(_) => style::Color::Reset, - }, - } + str_to_color(s) } } |