use crate::{
buffer::Buffer,
prelude::Vec2,
widgets::{Element, LayoutNode, Widget},
};
pub struct Overlay<M: 'static = ()> {
children: Vec<Element<M>>,
}
impl<M> Overlay<M> {
#[must_use]
pub fn new<I>(children: I) -> Self
where
I: IntoIterator,
I::Item: Into<Element<M>>,
{
Self {
children: children.into_iter().map(|i| i.into()).collect(),
}
}
#[must_use]
pub fn empty() -> Self {
Self { children: vec![] }
}
pub fn push<W>(&mut self, child: W)
where
W: Into<Element<M>>,
{
self.children.push(child.into());
}
}
impl<M: Clone + 'static> Widget<M> for Overlay<M> {
fn render(&self, buffer: &mut Buffer, layout: &LayoutNode) {
for (i, child) in self.children.iter().enumerate() {
child.render(buffer, &layout.children[i]);
}
}
fn height(&self, size: &Vec2) -> usize {
self.children
.iter()
.map(|c| c.height(size))
.max()
.unwrap_or(0)
}
fn width(&self, size: &Vec2) -> usize {
self.children
.iter()
.map(|c| c.width(size))
.max()
.unwrap_or(0)
}
fn children(&self) -> Vec<&Element<M>> {
self.children.iter().collect()
}
}
impl<M: Clone + 'static> From<Overlay<M>> for Element<M> {
fn from(value: Overlay<M>) -> Self {
Element::new(value)
}
}
impl<M: Clone + 'static> From<Overlay<M>> for Box<dyn Widget<M>> {
fn from(value: Overlay<M>) -> Self {
Box::new(value)
}
}