tuigui/widgets/
layers.rs

1use crate::preludes::widget_creation::*;
2
3#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
4/// Create layers of widgets so widgets can overlay each other
5/// the last item in the vector will be the front-most item
6pub struct Layers<W: Widget> {
7    pub roots: Vec<W>,
8    widget_data: WidgetData,
9}
10
11impl<W: Widget> Layers<W> {
12    pub fn new(roots: Vec<W>) -> Self {
13        Self {
14            roots,
15            widget_data: WidgetData::new(),
16        }
17    }
18}
19
20impl<W: Widget> Widget for Layers<W> {
21    fn draw(&mut self, canvas: &mut Canvas, state_frame: Option<&EventStateFrame>) {
22        if canvas.is_visible() == false {
23            return;
24        }
25
26        let mut inners: Vec<Canvas> = self.roots.iter().map(|x| {
27            let mut inner = canvas.new_copy_child();
28
29            inner.transform.size = x.widget_info().size_info.correct_size(inner.transform.size);
30
31            inner
32        }).collect();
33
34        for (i, widget) in self.roots.iter_mut().enumerate() {
35            widget.draw(&mut inners[i], state_frame);
36        }
37    }
38
39    fn widget_info(&self) -> WidgetInfo {
40        WidgetInfo {
41            size_info: WidgetSizeInfo::Dynamic {
42                min: None,
43                max: None,
44            },
45        }
46    }
47
48    fn widget_data(&mut self) -> &mut WidgetData {
49        return &mut self.widget_data;
50    }
51}