use crate::overlay::OverlayType;
use crate::render::panel::RenderedOverlay;
use crate::render::theme::PanelStyle;
pub trait Overlay {
type BuildData;
fn overlay_type() -> OverlayType;
fn build(data: &Self::BuildData, style: &PanelStyle) -> RenderedOverlay;
fn calculate_position(
term_size: (usize, usize),
overlay_size: (usize, usize),
) -> (usize, usize) {
let (term_w, term_h) = term_size;
let (overlay_w, overlay_h) = overlay_size;
let x = term_w.saturating_sub(overlay_w) / 2;
let y = term_h.saturating_sub(overlay_h) / 2;
(x, y)
}
fn closes_on_escape() -> bool {
true
}
fn captures_input() -> bool {
false
}
fn min_size() -> (usize, usize) {
(0, 0)
}
}
pub fn top_left_position(
_term_size: (usize, usize),
_overlay_size: (usize, usize),
) -> (usize, usize) {
(0, 0)
}
pub fn top_right_position(
term_size: (usize, usize),
overlay_size: (usize, usize),
) -> (usize, usize) {
let x = term_size.0.saturating_sub(overlay_size.0);
(x, 0)
}
pub fn bottom_left_position(
term_size: (usize, usize),
overlay_size: (usize, usize),
) -> (usize, usize) {
let y = term_size.1.saturating_sub(overlay_size.1);
(0, y)
}
pub fn bottom_right_position(
term_size: (usize, usize),
overlay_size: (usize, usize),
) -> (usize, usize) {
let x = term_size.0.saturating_sub(overlay_size.0);
let y = term_size.1.saturating_sub(overlay_size.1);
(x, y)
}
#[cfg(test)]
mod tests {
use super::*;
struct TestOverlay;
impl Overlay for TestOverlay {
type BuildData = ();
fn overlay_type() -> OverlayType {
OverlayType::Controls
}
fn build(_data: &Self::BuildData, _style: &PanelStyle) -> RenderedOverlay {
RenderedOverlay {
lines: vec!["Test".to_string()],
title_box: None,
rich_lines: None,
}
}
}
#[test]
fn test_default_position_calculation() {
let pos = TestOverlay::calculate_position((100, 50), (60, 20));
assert_eq!(pos, (20, 15)); }
#[test]
fn test_position_with_small_terminal() {
let pos = TestOverlay::calculate_position((50, 20), (60, 25));
assert_eq!(pos, (0, 0)); }
#[test]
fn test_default_flags() {
assert!(TestOverlay::closes_on_escape());
assert!(!TestOverlay::captures_input());
assert_eq!(TestOverlay::min_size(), (0, 0));
}
#[test]
fn test_position_helpers() {
assert_eq!(top_left_position((100, 50), (60, 20)), (0, 0));
assert_eq!(top_right_position((100, 50), (60, 20)), (40, 0));
assert_eq!(bottom_left_position((100, 50), (60, 20)), (0, 30));
assert_eq!(bottom_right_position((100, 50), (60, 20)), (40, 30));
}
}