Skip to main content

iced_core/
overlay.rs

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