facett-flow/src/attr.rs
//! Optional parallel tables. Setters validate atomically against the scene's current ordering.
use serde::{Deserialize, Serialize};
#[cfg(feature = "boxes")]
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct Sizes {
pub nodes: Vec<[f32; 2]>,
}
#[cfg(feature = "status")]
#[non_exhaustive]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum Status {
Ok,
Slow,
Error,
}
#[cfg(feature = "status")]
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct StatusTable {
pub nodes: Vec<Option<Status>>,
pub edges: Vec<Option<Status>>,
}
#[cfg(feature = "status")]
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct StatusPalette {
pub ok: egui::Color32,
pub slow: egui::Color32,
pub error: egui::Color32,
}
#[cfg(feature = "status")]
impl StatusPalette {
pub fn from_theme(th: &facett_core::Theme) -> Self {
Self {
ok: th.point,
slow: facett_core::look::AMBER,
error: facett_core::look::RED,
}
}
pub(crate) fn color(&self, value: Option<Status>, plain: egui::Color32) -> egui::Color32 {
match value {
Some(Status::Ok) => self.ok,
Some(Status::Slow) => self.slow,
Some(Status::Error) => self.error,
None => plain,
}
}
}
#[cfg(feature = "rate")]
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct Rates {
pub edges: Vec<Option<f32>>,
}
#[cfg(all(test, feature = "status"))]
mod tests {
use super::*;
#[test]
fn status_colours_follow_all_host_themes() {
for look in [
facett_core::LookTheme::nordisk_dark(),
facett_core::LookTheme::nordisk_light(),
facett_core::LookTheme::device(),
] {
let theme = look.to_legacy_palette();
let p = StatusPalette::from_theme(&theme);
assert_eq!(p.color(Some(Status::Ok), theme.text), theme.point);
assert_eq!(
p.color(Some(Status::Slow), theme.text),
facett_core::look::AMBER
);
assert_eq!(
p.color(Some(Status::Error), theme.text),
facett_core::look::RED
);
assert_eq!(p.color(None, theme.text), theme.text);
}
}
}