use crate::tui::Component;
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub enum OverlayAnchor {
#[default]
Center,
TopLeft,
TopRight,
BottomLeft,
BottomRight,
TopCenter,
BottomCenter,
LeftCenter,
RightCenter,
}
#[derive(Debug, Clone, Copy, Default)]
pub struct OverlayMargin {
pub top: usize,
pub right: usize,
pub bottom: usize,
pub left: usize,
}
impl OverlayMargin {
pub fn uniform(value: usize) -> Self {
Self {
top: value,
right: value,
bottom: value,
left: value,
}
}
}
#[derive(Debug, Clone, Copy)]
pub enum SizeValue {
Absolute(usize),
Percent(f64),
}
impl SizeValue {
pub fn resolve(&self, reference: usize) -> usize {
match self {
SizeValue::Absolute(v) => *v,
SizeValue::Percent(p) => {
let v = (reference as f64 * p / 100.0).floor() as usize;
v.max(1)
}
}
}
}
#[derive(Debug, Clone, Default)]
pub struct OverlayOptions {
pub width: Option<SizeValue>,
pub min_width: Option<usize>,
pub max_height: Option<SizeValue>,
pub anchor: Option<OverlayAnchor>,
pub offset_x: Option<isize>,
pub offset_y: Option<isize>,
pub row: Option<SizeValue>,
pub col: Option<SizeValue>,
pub margin: Option<OverlayMargin>,
pub non_capturing: bool,
}
pub struct OverlayEntry {
pub component: Box<dyn Component>,
pub options: OverlayOptions,
pub hidden: bool,
pub focus_order: u64,
pub id: u64,
}
#[derive(Debug, Clone)]
pub struct OverlayLayout {
pub width: usize,
pub row: usize,
pub col: usize,
pub max_height: Option<usize>,
}