use std::hash::{Hash, Hasher};
pub fn generate_color(tag: &str) -> (f32, f32, f32) {
generate_tui_color(tag, true)
}
pub fn generate_tui_color(tag: &str, is_dark_theme: bool) -> (f32, f32, f32) {
let mut hasher = std::collections::hash_map::DefaultHasher::new();
tag.hash(&mut hasher);
let hash = hasher.finish();
let h = (hash % 360) as f32;
let hash_s = hash >> 16;
let hash_l = hash >> 32;
let s = if is_dark_theme {
0.40 + ((hash_s % 51) as f32 / 100.0)
} else {
0.60 + ((hash_s % 41) as f32 / 100.0) };
let l = if is_dark_theme {
0.65 + ((hash_l % 26) as f32 / 100.0) } else {
0.25 + ((hash_l % 26) as f32 / 100.0) };
hsl_to_rgb(h, s, l)
}
fn hsl_to_rgb(h: f32, s: f32, l: f32) -> (f32, f32, f32) {
let c = (1.0 - (2.0 * l - 1.0).abs()) * s;
let x = c * (1.0 - ((h / 60.0) % 2.0 - 1.0).abs());
let m = l - c / 2.0;
let (r1, g1, b1) = if (0.0..60.0).contains(&h) {
(c, x, 0.0)
} else if (60.0..120.0).contains(&h) {
(x, c, 0.0)
} else if (120.0..180.0).contains(&h) {
(0.0, c, x)
} else if (180.0..240.0).contains(&h) {
(0.0, x, c)
} else if (240.0..300.0).contains(&h) {
(x, 0.0, c)
} else {
(c, 0.0, x)
};
(r1 + m, g1 + m, b1 + m)
}
pub fn is_dark(r: f32, g: f32, b: f32) -> bool {
let brightness = 0.299 * r + 0.587 * g + 0.114 * b;
brightness < 0.5
}
pub fn parse_hex_to_floats(hex: &str) -> Option<(f32, f32, f32)> {
let hex = hex.trim_start_matches('#');
if hex.len() < 6 {
return None;
}
let r = u8::from_str_radix(&hex[0..2], 16).ok()?;
let g = u8::from_str_radix(&hex[2..4], 16).ok()?;
let b = u8::from_str_radix(&hex[4..6], 16).ok()?;
Some((r as f32 / 255.0, g as f32 / 255.0, b as f32 / 255.0))
}
pub fn parse_hex_to_u8(hex: &str) -> Option<(u8, u8, u8)> {
let hex = hex.trim_start_matches('#');
if hex.len() < 6 {
return None;
}
let r = u8::from_str_radix(&hex[0..2], 16).ok()?;
let g = u8::from_str_radix(&hex[2..4], 16).ok()?;
let b = u8::from_str_radix(&hex[4..6], 16).ok()?;
Some((r, g, b))
}
pub fn get_priority_rgb(priority: u8, is_dark_theme: bool) -> (f32, f32, f32) {
if is_dark_theme {
match priority {
1 => (1.0, 0.2, 0.2), 2 => (1.0, 0.4, 0.2), 3 => (1.0, 0.6, 0.2), 4 => (1.0, 0.8, 0.2), 5 => (1.0, 1.0, 0.2), 6 => (0.85, 0.85, 0.55), 7 => (0.7, 0.75, 0.85), 8 => (0.65, 0.6, 0.8), 9 => (0.6, 0.55, 0.65), _ => (1.0, 1.0, 1.0), }
} else {
match priority {
1 => (0.8, 0.0, 0.0), 2 => (0.9, 0.3, 0.0), 3 => (0.9, 0.5, 0.0), 4 => (0.8, 0.6, 0.0), 5 => (0.7, 0.7, 0.0), 6 => (0.5, 0.5, 0.2), 7 => (0.3, 0.4, 0.6), 8 => (0.4, 0.4, 0.5), 9 => (0.5, 0.5, 0.5), _ => (0.0, 0.0, 0.0), }
}
}