1mod element;
3mod group;
4mod nested;
5
6pub use element::Element;
7pub use group::Group;
8pub use nested::Nested;
9
10use crate::layout;
11use crate::mouse;
12use crate::renderer;
13use crate::widget;
14use crate::widget::Tree;
15use crate::{Event, Layout, Rectangle, Shell, Size, Vector};
16
17pub trait Overlay<Message, Theme, Renderer>
19where
20 Renderer: crate::Renderer,
21{
22 fn layout(&mut self, renderer: &Renderer, bounds: Size) -> layout::Node;
29
30 fn draw(
32 &self,
33 renderer: &mut Renderer,
34 theme: &Theme,
35 style: &renderer::Style,
36 layout: Layout<'_>,
37 cursor: mouse::Cursor,
38 );
39
40 fn operate(
42 &mut self,
43 _layout: Layout<'_>,
44 _renderer: &Renderer,
45 _operation: &mut dyn widget::Operation,
46 ) {
47 }
48
49 fn update(
53 &mut self,
54 _event: &Event,
55 _layout: Layout<'_>,
56 _cursor: mouse::Cursor,
57 _renderer: &Renderer,
58 _shell: &mut Shell<'_, Message>,
59 ) {
60 }
61
62 fn mouse_interaction(
66 &self,
67 _layout: Layout<'_>,
68 _cursor: mouse::Cursor,
69 _renderer: &Renderer,
70 ) -> mouse::Interaction {
71 mouse::Interaction::None
72 }
73
74 fn overlay<'a>(
76 &'a mut self,
77 _layout: Layout<'a>,
78 _renderer: &Renderer,
79 ) -> Option<Element<'a, Message, Theme, Renderer>> {
80 None
81 }
82
83 fn index(&self) -> f32 {
90 1.0
91 }
92}
93
94pub fn from_children<'a, Message, Theme, Renderer>(
99 children: &'a mut [crate::Element<'_, Message, Theme, Renderer>],
100 tree: &'a mut Tree,
101 layout: Layout<'a>,
102 renderer: &Renderer,
103 viewport: &Rectangle,
104 translation: Vector,
105) -> Option<Element<'a, Message, Theme, Renderer>>
106where
107 Renderer: crate::Renderer,
108{
109 let children = children
110 .iter_mut()
111 .zip(&mut tree.children)
112 .zip(layout.children())
113 .filter_map(|((child, state), layout)| {
114 child
115 .as_widget_mut()
116 .overlay(state, layout, renderer, viewport, translation)
117 })
118 .collect::<Vec<_>>();
119
120 (!children.is_empty()).then(|| Group::with_children(children).overlay())
121}