Skip to main content

iced_core/widget/
element.rs

1use crate::layout;
2use crate::mouse;
3use crate::overlay;
4use crate::renderer;
5use crate::widget;
6use crate::widget::tree::{self, Tree};
7use crate::{Event, Layout, Length, Rectangle, Shell, Size, Vector, Widget};
8
9/// A generic [`Widget`].
10///
11/// It is useful to build composable user interfaces that do not leak
12/// implementation details in their __view logic__.
13///
14/// If you have any [`Widget`], you should be able to use [`Widget::boxed`](Widget::_boxed)
15/// to turn it into an [`Element`].
16pub struct Element<'a, Message, Theme, Renderer> {
17    widget: Box<dyn Widget<Message, Theme, Renderer> + 'a>,
18}
19
20impl<'a, Message, Theme, Renderer> Element<'a, Message, Theme, Renderer> {
21    /// Creates a new [`Element`] containing the given [`Widget`].
22    pub(super) fn new(widget: impl Widget<Message, Theme, Renderer> + 'a) -> Self {
23        Self {
24            widget: Box::new(widget),
25        }
26    }
27}
28
29impl<'a, Message, Theme, Renderer> widget::Meta for Element<'a, Message, Theme, Renderer> {
30    fn is_void(&self) -> bool {
31        self.widget.is_void()
32    }
33}
34
35impl<'a, Message, Theme, Renderer> Widget<Message, Theme, Renderer>
36    for Element<'a, Message, Theme, Renderer>
37{
38    fn size(&self) -> Size<Length> {
39        self.widget.size()
40    }
41
42    fn tag(&self) -> tree::Tag {
43        self.widget.tag()
44    }
45
46    fn state(&self) -> tree::State {
47        self.widget.state()
48    }
49
50    fn diff(&mut self, tree: &mut Tree) {
51        self.widget.diff(tree);
52    }
53
54    fn layout(&mut self, tree: &mut Tree, renderer: &Renderer, limits: &layout::Limits) {
55        self.widget.layout(tree, renderer, limits);
56    }
57
58    fn draw(
59        &self,
60        tree: &Tree,
61        renderer: &mut Renderer,
62        theme: &Theme,
63        style: &renderer::Style,
64        layout: Layout,
65        cursor: mouse::Cursor,
66        viewport: &Rectangle,
67    ) {
68        self.widget
69            .draw(tree, renderer, theme, style, layout, cursor, viewport);
70    }
71
72    fn operate(
73        &mut self,
74        tree: &mut Tree,
75        layout: Layout,
76        viewport: &Rectangle,
77        renderer: &Renderer,
78        operation: &mut dyn widget::Operation,
79    ) {
80        self.widget
81            .operate(tree, layout, viewport, renderer, operation);
82    }
83
84    fn update(
85        &mut self,
86        tree: &mut Tree,
87        event: &Event,
88        layout: Layout,
89        cursor: mouse::Cursor,
90        renderer: &Renderer,
91        shell: &mut Shell<'_, Message>,
92        viewport: &Rectangle,
93    ) {
94        self.widget
95            .update(tree, event, layout, cursor, renderer, shell, viewport);
96    }
97
98    fn mouse_interaction(
99        &self,
100        tree: &Tree,
101        layout: Layout,
102        cursor: mouse::Cursor,
103        viewport: &Rectangle,
104        renderer: &Renderer,
105    ) -> mouse::Interaction {
106        self.widget
107            .mouse_interaction(tree, layout, cursor, viewport, renderer)
108    }
109
110    fn overlay<'b>(
111        &'b mut self,
112        tree: &'b mut Tree,
113        layout: Layout,
114        renderer: &Renderer,
115        viewport: &Rectangle,
116        translation: Vector,
117        window: Size,
118    ) -> Vec<overlay::Element<'b, Message, Theme, Renderer>> {
119        self.widget
120            .overlay(tree, layout, renderer, viewport, translation, window)
121    }
122
123    fn _boxed<'b>(self) -> Element<'b, Message, Theme, Renderer>
124    where
125        Self: Sized + 'b,
126    {
127        self
128    }
129}