1mod element;
3mod group;
4
5pub use element::Element;
6pub use group::Group;
7
8use crate::event::{self, Event};
9use crate::layout;
10use crate::mouse;
11use crate::renderer;
12use crate::widget::{Operation, Tree};
13use crate::{Clipboard, Layout, Point, Rectangle, Shell, Size, Vector};
14
15pub trait Overlay<Message, Theme, Renderer>
17where
18    Renderer: crate::Renderer,
19{
20    fn layout(&mut self, renderer: &Renderer, bounds: Size) -> layout::Node;
27
28    fn draw(
30        &self,
31        renderer: &mut Renderer,
32        theme: &Theme,
33        style: &renderer::Style,
34        layout: Layout<'_>,
35        cursor: mouse::Cursor,
36    );
37
38    fn operate(
40        &mut self,
41        _layout: Layout<'_>,
42        _renderer: &Renderer,
43        _operation: &mut dyn Operation,
44    ) {
45    }
46
47    fn on_event(
60        &mut self,
61        _event: Event,
62        _layout: Layout<'_>,
63        _cursor: mouse::Cursor,
64        _renderer: &Renderer,
65        _clipboard: &mut dyn Clipboard,
66        _shell: &mut Shell<'_, Message>,
67    ) -> event::Status {
68        event::Status::Ignored
69    }
70
71    fn mouse_interaction(
75        &self,
76        _layout: Layout<'_>,
77        _cursor: mouse::Cursor,
78        _viewport: &Rectangle,
79        _renderer: &Renderer,
80    ) -> mouse::Interaction {
81        mouse::Interaction::None
82    }
83
84    fn is_over(
89        &self,
90        layout: Layout<'_>,
91        _renderer: &Renderer,
92        cursor_position: Point,
93    ) -> bool {
94        layout.bounds().contains(cursor_position)
95    }
96
97    fn overlay<'a>(
99        &'a mut self,
100        _layout: Layout<'_>,
101        _renderer: &Renderer,
102    ) -> Option<Element<'a, Message, Theme, Renderer>> {
103        None
104    }
105}
106
107pub fn from_children<'a, Message, Theme, Renderer>(
112    children: &'a mut [crate::Element<'_, Message, Theme, Renderer>],
113    tree: &'a mut Tree,
114    layout: Layout<'_>,
115    renderer: &Renderer,
116    translation: Vector,
117) -> Option<Element<'a, Message, Theme, Renderer>>
118where
119    Renderer: crate::Renderer,
120{
121    let children = children
122        .iter_mut()
123        .zip(&mut tree.children)
124        .zip(layout.children())
125        .filter_map(|((child, state), c_layout)| {
126            child.as_widget_mut().overlay(
127                state,
128                c_layout.with_virtual_offset(layout.virtual_offset()),
129                renderer,
130                translation,
131            )
132        })
133        .collect::<Vec<_>>();
134
135    (!children.is_empty()).then(|| Group::with_children(children).overlay())
136}