1mod element;
3mod nested;
4
5pub use element::Element;
6pub use nested::Nested;
7
8use crate::layout;
9use crate::mouse;
10use crate::renderer;
11use crate::widget;
12use crate::widget::Tree;
13use crate::{Event, Layout, 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 widget::Operation,
44 ) {
45 }
46
47 fn update(
51 &mut self,
52 _event: &Event,
53 _layout: Layout<'_>,
54 _cursor: mouse::Cursor,
55 _renderer: &Renderer,
56 _shell: &mut Shell<'_, Message>,
57 ) {
58 }
59
60 fn mouse_interaction(
64 &self,
65 _layout: Layout<'_>,
66 _cursor: mouse::Cursor,
67 _renderer: &Renderer,
68 ) -> mouse::Interaction {
69 mouse::Interaction::None
70 }
71
72 fn overlay<'a>(
74 &'a mut self,
75 _layout: Layout<'a>,
76 _renderer: &Renderer,
77 ) -> Vec<Element<'a, Message, Theme, Renderer>> {
78 Vec::new()
79 }
80
81 fn index(&self) -> f32 {
88 1.0
89 }
90}
91
92pub fn from_children<'a, Message, Theme, Renderer>(
97 children: &'a mut [crate::Element<'_, Message, Theme, Renderer>],
98 tree: &'a mut Tree,
99 layout: Layout<'a>,
100 renderer: &Renderer,
101 viewport: &Rectangle,
102 translation: Vector,
103) -> Vec<Element<'a, Message, Theme, Renderer>>
104where
105 Renderer: crate::Renderer,
106{
107 children
108 .iter_mut()
109 .zip(&mut tree.children)
110 .zip(layout.children())
111 .flat_map(|((child, state), layout)| {
112 child
113 .as_widget_mut()
114 .overlay(state, layout, renderer, viewport, translation)
115 })
116 .collect()
117}