use ratatui::style::Color;
use tui_pane::Appearance;
use tui_pane::BUILTIN_HC_DARK_NAME;
use tui_pane::BUILTIN_HC_LIGHT_NAME;
use tui_pane::StyleSpec;
use tui_pane::Theme;
use tui_pane::ThemeId;
use tui_pane::ThemeRegistry;
use super::constants::COLUMN_HEADER;
use super::constants::DISCOVERY_SHIMMER;
use super::constants::GIT_IGNORED;
use super::constants::GIT_MODIFIED;
use super::constants::GIT_UNTRACKED;
use super::constants::LANGUAGE_SUBTOTAL;
use super::constants::ROLE_KEYS;
use super::constants::TARGET_BENCH;
#[derive(Clone, Copy)]
enum RolePalette {
DefaultDark,
DefaultLight,
HighContrastDark,
HighContrastLight,
}
pub(crate) fn apply_role_defaults_to_registry(registry: &mut ThemeRegistry) {
registry.update_themes(|id, appearance, theme| {
apply_role_defaults_to_theme(theme, Some(id), appearance);
});
}
pub(crate) fn apply_role_defaults_to_theme(
theme: &mut Theme,
id: Option<&ThemeId>,
appearance: Appearance,
) {
let palette = palette_for(id, appearance);
for role in ROLE_KEYS {
theme
.roles
.entry(String::from(role))
.or_insert_with(|| default_role(role, palette));
}
}
pub(crate) fn column_header_color() -> Color { role_color(COLUMN_HEADER) }
pub(crate) fn discovery_shimmer_color() -> Color { role_color(DISCOVERY_SHIMMER) }
pub(crate) fn git_ignored_color() -> Color { role_color(GIT_IGNORED) }
pub(crate) fn git_modified_color() -> Color { role_color(GIT_MODIFIED) }
pub(crate) fn git_untracked_color() -> Color { role_color(GIT_UNTRACKED) }
pub(crate) fn language_subtotal_color() -> Color { role_color(LANGUAGE_SUBTOTAL) }
pub(crate) fn target_bench_color() -> Color { role_color(TARGET_BENCH) }
fn role_color(role: &str) -> Color {
tui_pane::role_color(role, default_role(role, RolePalette::DefaultDark))
}
fn palette_for(id: Option<&ThemeId>, appearance: Appearance) -> RolePalette {
match id.map(ThemeId::as_str) {
Some(BUILTIN_HC_DARK_NAME) => RolePalette::HighContrastDark,
Some(BUILTIN_HC_LIGHT_NAME) => RolePalette::HighContrastLight,
_ => match appearance {
Appearance::Dark => RolePalette::DefaultDark,
Appearance::Light => RolePalette::DefaultLight,
},
}
}
fn default_role(role: &str, palette: RolePalette) -> StyleSpec {
match (role, palette) {
(COLUMN_HEADER, RolePalette::DefaultDark) => bold(Color::Rgb(150, 190, 180)),
(COLUMN_HEADER, RolePalette::DefaultLight) => bold(Color::Rgb(60, 100, 90)),
(COLUMN_HEADER | DISCOVERY_SHIMMER, RolePalette::HighContrastDark) => {
StyleSpec::bold(Color::LightCyan)
},
(COLUMN_HEADER, RolePalette::HighContrastLight) => StyleSpec::bold(Color::Rgb(0, 0, 140)),
(DISCOVERY_SHIMMER, RolePalette::DefaultDark) => {
StyleSpec::from_color(Color::Rgb(150, 210, 255))
},
(DISCOVERY_SHIMMER, RolePalette::DefaultLight) => {
StyleSpec::from_color(Color::Rgb(120, 140, 200))
},
(DISCOVERY_SHIMMER, RolePalette::HighContrastLight) => {
StyleSpec::bold(Color::Rgb(0, 0, 140))
},
(GIT_IGNORED, RolePalette::DefaultDark) => StyleSpec::from_color(Color::DarkGray),
(GIT_IGNORED, RolePalette::DefaultLight) => {
StyleSpec::from_color(Color::Rgb(150, 150, 150))
},
(GIT_IGNORED, RolePalette::HighContrastDark) => StyleSpec::from_color(Color::Gray),
(GIT_IGNORED, RolePalette::HighContrastLight) => {
StyleSpec::from_color(Color::Rgb(80, 80, 80))
},
(GIT_MODIFIED, RolePalette::DefaultDark | RolePalette::DefaultLight) => {
StyleSpec::from_color(Color::Indexed(208))
},
(GIT_MODIFIED, RolePalette::HighContrastDark) => StyleSpec::bold(Color::LightYellow),
(GIT_MODIFIED, RolePalette::HighContrastLight) => StyleSpec::bold(Color::Rgb(140, 60, 0)),
(GIT_UNTRACKED, RolePalette::DefaultDark) => StyleSpec::from_color(Color::Green),
(GIT_UNTRACKED, RolePalette::DefaultLight) => StyleSpec::from_color(Color::Rgb(0, 120, 0)),
(GIT_UNTRACKED, RolePalette::HighContrastDark) => StyleSpec::bold(Color::LightGreen),
(GIT_UNTRACKED, RolePalette::HighContrastLight) => StyleSpec::bold(Color::Rgb(0, 100, 0)),
(LANGUAGE_SUBTOTAL, RolePalette::DefaultDark) => {
StyleSpec::from_color(Color::Rgb(120, 190, 210))
},
(LANGUAGE_SUBTOTAL, RolePalette::DefaultLight) => {
StyleSpec::from_color(Color::Rgb(35, 110, 130))
},
(LANGUAGE_SUBTOTAL, RolePalette::HighContrastDark) => {
StyleSpec::from_color(Color::LightCyan)
},
(LANGUAGE_SUBTOTAL, RolePalette::HighContrastLight) => {
StyleSpec::bold(Color::Rgb(0, 85, 120))
},
(TARGET_BENCH, RolePalette::DefaultDark) => StyleSpec::from_color(Color::Magenta),
(TARGET_BENCH, RolePalette::DefaultLight) => StyleSpec::from_color(Color::Rgb(140, 0, 140)),
(TARGET_BENCH, RolePalette::HighContrastDark) => StyleSpec::bold(Color::LightMagenta),
(TARGET_BENCH, RolePalette::HighContrastLight) => StyleSpec::bold(Color::Rgb(140, 0, 140)),
_ => StyleSpec::from_color(Color::Reset),
}
}
const fn bold(color: Color) -> StyleSpec { StyleSpec::bold(color) }