summaryrefslogtreecommitdiffstats
path: root/src/config/raw/theme/style.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/config/raw/theme/style.rs')
-rw-r--r--src/config/raw/theme/style.rs131
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)
}
}