use crate::component::RenderContext;
use crate::input::Event;
use super::action::OverlayAction;
use super::traits::Overlay;
pub struct OverlayStack<M> {
layers: Vec<Box<dyn Overlay<M>>>,
}
impl<M> OverlayStack<M> {
pub fn new() -> Self {
Self { layers: Vec::new() }
}
pub fn push(&mut self, overlay: Box<dyn Overlay<M>>) {
self.layers.push(overlay);
}
pub fn pop(&mut self) -> Option<Box<dyn Overlay<M>>> {
self.layers.pop()
}
pub fn clear(&mut self) {
self.layers.clear();
}
pub fn is_active(&self) -> bool {
!self.layers.is_empty()
}
pub fn is_empty(&self) -> bool {
self.layers.is_empty()
}
pub fn len(&self) -> usize {
self.layers.len()
}
pub(crate) fn handle_event(&mut self, event: &Event) -> OverlayAction<M> {
for overlay in self.layers.iter_mut().rev() {
match overlay.handle_event(event) {
OverlayAction::Propagate => continue,
action => return action,
}
}
OverlayAction::Propagate
}
pub(crate) fn render(&self, ctx: &mut RenderContext<'_, '_>) {
for overlay in &self.layers {
overlay.view(&mut ctx.with_area(ctx.area));
}
}
}
impl<M> Default for OverlayStack<M> {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests;