Skip to main content

iced_core/
overlay.rs

1//! Display interactive elements on top of other widgets.
2mod 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
15/// An interactive component that can be displayed on top of other widgets.
16pub trait Overlay<Message, Theme, Renderer>
17where
18    Renderer: crate::Renderer,
19{
20    /// Returns the layout [`Node`] of the [`Overlay`].
21    ///
22    /// This [`Node`] is used by the runtime to compute the [`Layout`] of the
23    /// user interface.
24    ///
25    /// [`Node`]: layout::Node
26    fn layout(&mut self, renderer: &Renderer, bounds: Size) -> layout::Node;
27
28    /// Draws the [`Overlay`] using the associated `Renderer`.
29    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    /// Applies a [`widget::Operation`] to the [`Overlay`].
39    fn operate(
40        &mut self,
41        _layout: Layout<'_>,
42        _renderer: &Renderer,
43        _operation: &mut dyn widget::Operation,
44    ) {
45    }
46
47    /// Processes a runtime [`Event`].
48    ///
49    /// By default, it does nothing.
50    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    /// Returns the current [`mouse::Interaction`] of the [`Overlay`].
61    ///
62    /// By default, it returns [`mouse::Interaction::None`].
63    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    /// Returns the nested overlays of the [`Overlay`].
73    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    /// The index of the overlay.
82    ///
83    /// Overlays with a higher index will be rendered on top of overlays with
84    /// a lower index.
85    ///
86    /// By default, it returns `1.0`.
87    fn index(&self) -> f32 {
88        1.0
89    }
90}
91
92/// Returns the overlays of the given [`Element`] children.
93///
94/// This method will generally only be used by advanced users that are
95/// implementing the [`Widget`](crate::Widget) trait.
96pub 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}