use ratatui::layout::{Constraint, Direction, Layout, Rect};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum OverlaySize {
Small,
Picker,
Text,
Wide,
}
pub fn centered_overlay(size: OverlaySize, area: Rect) -> Rect {
let (w, h) = overlay_dims(size);
centered_rect(w, h, area)
}
pub fn overlay_dims(size: OverlaySize) -> (u16, u16) {
match size {
OverlaySize::Small => (50, 40),
OverlaySize::Picker => (60, 60),
OverlaySize::Text => (70, 70),
OverlaySize::Wide => (85, 80),
}
}
pub fn centered_rect(percent_x: u16, percent_y: u16, r: Rect) -> Rect {
let v = Layout::default()
.direction(Direction::Vertical)
.constraints([
Constraint::Percentage((100 - percent_y) / 2),
Constraint::Percentage(percent_y),
Constraint::Percentage((100 - percent_y) / 2),
])
.split(r);
Layout::default()
.direction(Direction::Horizontal)
.constraints([
Constraint::Percentage((100 - percent_x) / 2),
Constraint::Percentage(percent_x),
Constraint::Percentage((100 - percent_x) / 2),
])
.split(v[1])[1]
}
#[cfg(test)]
mod tests {
use super::{overlay_dims, OverlaySize};
#[test]
fn overlay_dims_ordering_makes_sense() {
let (sw, sh) = overlay_dims(OverlaySize::Small);
let (pw, ph) = overlay_dims(OverlaySize::Picker);
let (tw, th) = overlay_dims(OverlaySize::Text);
let (ww, wh) = overlay_dims(OverlaySize::Wide);
assert!(sw <= pw && sh <= ph, "Picker not smaller than Small");
assert!(pw <= tw && ph <= th, "Text not bigger than Picker");
assert!(tw <= ww && th <= wh, "Wide not bigger than Text");
}
#[test]
fn overlay_dims_are_within_legal_percent_range() {
for size in [
OverlaySize::Small,
OverlaySize::Picker,
OverlaySize::Text,
OverlaySize::Wide,
] {
let (w, h) = overlay_dims(size);
assert!((10..=100).contains(&w), "{size:?} width {w} out of range");
assert!((10..=100).contains(&h), "{size:?} height {h} out of range");
}
}
}