use std::mem::ManuallyDrop;
use reactive_core::{RwSignal, signal};
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum ControlSize {
Mini,
Small,
#[default]
Regular,
Large,
}
impl ControlSize {
pub fn scale(self) -> f32 {
match self {
ControlSize::Mini => 0.75,
ControlSize::Small => 0.875,
ControlSize::Regular => 1.0,
ControlSize::Large => 1.25,
}
}
}
thread_local! {
static CONTROL_SIZE: ManuallyDrop<RwSignal<ControlSize>> =
ManuallyDrop::new(signal(ControlSize::Regular));
}
pub fn set_control_size(size: ControlSize) {
CONTROL_SIZE.with(|s| s.set(size));
}
pub fn use_control_size() -> ControlSize {
CONTROL_SIZE.with(|s| s.get())
}
pub fn control_scale() -> f32 {
use_control_size().scale()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn the_ambient_size_scales_the_bases_and_regular_leaves_them_alone() {
assert_eq!(ControlSize::Regular.scale(), 1.0);
assert!(ControlSize::Mini.scale() < 1.0);
assert!(ControlSize::Large.scale() > 1.0);
assert_eq!(use_control_size(), ControlSize::Regular, "the default");
set_control_size(ControlSize::Mini);
assert_eq!(control_scale(), ControlSize::Mini.scale());
set_control_size(ControlSize::Regular);
}
}