use egui::Color32;
use super::Palette;
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct NavOverlayTokens {
pub chip_plate: Color32,
pub chip_declared: Color32,
pub chip_guessed: Color32,
pub chip_undeclared: Color32,
pub chip_focused: Color32,
pub edge_contains: Color32,
pub edge_next: Color32,
pub edge_spatial: Color32,
}
impl NavOverlayTokens {
pub const NAMES: [&'static str; 8] = [
"nav.chip.plate",
"nav.chip.text.declared",
"nav.chip.text.guessed",
"nav.chip.text.undeclared",
"nav.chip.outline.focused",
"nav.edge.contains",
"nav.edge.next",
"nav.edge.spatial",
];
pub fn from_palette(p: &Palette) -> Self {
Self {
chip_plate: p.surface_extreme.to_color32(),
chip_declared: p.primary.to_color32(),
chip_guessed: p.warn.to_color32(),
chip_undeclared: p.error.to_color32(),
chip_focused: p.accent.to_color32(),
edge_contains: p.outline.to_color32_alpha(150),
edge_next: p.accent.to_color32(),
edge_spatial: p.on_surface_dim.to_color32_alpha(200),
}
}
pub fn contains_at_depth(&self, depth: u8) -> Color32 {
let k = match depth {
0..=2 => 1.0,
3 => 0.75,
4 => 0.55,
_ => 0.4,
};
self.edge_contains.gamma_multiply(k)
}
}
pub fn published_palette(ctx: &egui::Context) -> Palette {
ctx.data(|d| d.get_temp::<Palette>(egui::Id::new(PALETTE_ID)))
.unwrap_or_else(super::presets::windows_dark_palette)
}
pub fn publish_palette(ctx: &egui::Context, p: Palette) {
ctx.data_mut(|d| d.insert_temp(egui::Id::new(PALETTE_ID), p));
}
const PALETTE_ID: &str = "facett_look_palette";
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn the_three_confidences_are_tellable_apart_and_the_plate_is_opaque() {
for p in [
super::super::presets::windows_dark_palette(),
super::super::presets::windows_light_palette(),
super::super::presets::device_palette(),
] {
let t = NavOverlayTokens::from_palette(&p);
assert_eq!(t.chip_plate.a(), 255, "the chip plate must occlude");
assert_ne!(t.chip_declared, t.chip_guessed);
assert_ne!(t.chip_declared, t.chip_undeclared);
assert_ne!(t.chip_guessed, t.chip_undeclared);
assert!(t.contains_at_depth(5).a() < t.contains_at_depth(1).a(), "deeper fades");
}
assert_eq!(NavOverlayTokens::NAMES.len(), 8);
}
}