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
9pub 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 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}