use ratatui::style::Color;
use serde::{Deserialize, Serialize};
pub mod presets;
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ThemeConfig {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub selected_color: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub directory_color: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub file_color: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub error_color: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub highlight_color: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub cursor_color: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tree_cursor_color: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tree_cursor_bg_color: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub header_path_color: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub header_hints_color: Option<String>,
}
impl ThemeConfig {
pub fn parse_color(color_str: &str) -> Color {
match color_str.to_lowercase().as_str() {
"reset" => Color::Reset, "black" => Color::Black,
"red" => Color::Red,
"green" => Color::Green,
"yellow" => Color::Yellow,
"blue" => Color::Blue,
"magenta" => Color::Magenta,
"cyan" => Color::Cyan,
"gray" | "grey" => Color::Gray,
"darkgray" | "darkgrey" => Color::DarkGray,
"lightred" => Color::LightRed,
"lightgreen" => Color::LightGreen,
"lightyellow" => Color::LightYellow,
"lightblue" => Color::LightBlue,
"lightmagenta" => Color::LightMagenta,
"lightcyan" => Color::LightCyan,
"white" => Color::White,
s if s.starts_with('#') && s.len() == 7 => {
if let (Ok(r), Ok(g), Ok(b)) = (
u8::from_str_radix(&s[1..3], 16),
u8::from_str_radix(&s[3..5], 16),
u8::from_str_radix(&s[5..7], 16),
) {
Color::Rgb(r, g, b)
} else {
Color::Reset }
}
s => {
if let Ok(idx) = s.parse::<u8>() {
Color::Indexed(idx)
} else {
Color::Reset }
}
}
}
pub fn get_preset_theme(theme_name: &str) -> Option<Self> {
presets::get_preset(theme_name)
}
pub fn fallback_colors() -> Self {
Self {
selected_color: Some("cyan".to_string()),
directory_color: Some("gray".to_string()),
file_color: Some("white".to_string()),
error_color: Some("gray".to_string()),
highlight_color: Some("yellow".to_string()),
cursor_color: Some("yellow".to_string()),
tree_cursor_color: Some("dim".to_string()),
tree_cursor_bg_color: Some("dim".to_string()),
header_path_color: Some("cyan".to_string()),
header_hints_color: Some("darkgray".to_string()),
}
}
}