use crate::core::types::Rect;
use super::types::{OverlayKind, SlotId};
use super::z_layers::ZLayerTable;
#[derive(Debug, Clone)]
pub struct OverlayEntry {
pub id: SlotId,
pub kind: OverlayKind,
pub rect: Rect,
pub anchor: Option<Rect>,
}
#[derive(Debug, Clone, Default)]
pub struct OverlayStack {
entries: Vec<OverlayEntry>,
}
impl OverlayStack {
pub fn new() -> Self {
Self::default()
}
pub fn push(&mut self, entry: OverlayEntry) {
self.entries.retain(|e| e.id != entry.id);
self.entries.push(entry);
}
pub fn clear(&mut self) {
self.entries.clear();
}
pub fn iter(&self) -> impl Iterator<Item = &OverlayEntry> {
self.entries.iter()
}
pub fn get(&self, id: &str) -> Option<&OverlayEntry> {
self.entries.iter().find(|e| e.id == id)
}
pub fn sort_by_z(&mut self, table: &ZLayerTable) {
self.entries.sort_by_key(|e| table.z_for(e.kind));
}
pub fn entries(&self) -> &[OverlayEntry] {
&self.entries
}
pub fn clamp_to_viewport(rect: Rect, viewport: Rect) -> Rect {
let w = rect.width.min(viewport.width);
let h = rect.height.min(viewport.height);
let x = rect.x
.max(viewport.x)
.min(viewport.x + viewport.width - w);
let y = rect.y
.max(viewport.y)
.min(viewport.y + viewport.height - h);
Rect::new(x, y, w, h)
}
}