1mod element;
3mod group;
4
5pub use element::Element;
6pub use group::Group;
7
8use crate::layout;
9use crate::mouse;
10use crate::renderer;
11use crate::widget;
12use crate::widget::Tree;
13use crate::{Clipboard, 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(
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 ) {
68 }
69
70 fn mouse_interaction(
74 &self,
75 _layout: Layout<'_>,
76 _cursor: mouse::Cursor,
77 _renderer: &Renderer,
78 ) -> mouse::Interaction {
79 mouse::Interaction::None
80 }
81
82 fn overlay<'a>(
84 &'a mut self,
85 _layout: Layout<'a>,
86 _renderer: &Renderer,
87 ) -> Option<Element<'a, Message, Theme, Renderer>> {
88 None
89 }
90
91 fn index(&self) -> f32 {
98 1.0
99 }
100}
101
102pub fn from_children<'a, Message, Theme, Renderer>(
107 children: &'a mut [crate::Element<'_, Message, Theme, Renderer>],
108 tree: &'a mut Tree,
109 layout: Layout<'a>,
110 renderer: &Renderer,
111 viewport: &Rectangle,
112 translation: Vector,
113) -> Option<Element<'a, Message, Theme, Renderer>>
114where
115 Renderer: crate::Renderer,
116{
117 let children = children
118 .iter_mut()
119 .zip(&mut tree.children)
120 .zip(layout.children())
121 .filter_map(|((child, state), layout)| {
122 child.as_widget_mut().overlay(
123 state,
124 layout,
125 renderer,
126 viewport,
127 translation,
128 )
129 })
130 .collect::<Vec<_>>();
131
132 (!children.is_empty()).then(|| Group::with_children(children).overlay())
133}