1pub mod operation;
3pub mod text;
4pub mod tree;
5
6mod id;
7
8pub use id::Id;
9pub use operation::Operation;
10pub use text::Text;
11pub use tree::Tree;
12
13use crate::layout::{self, Layout};
14use crate::mouse;
15use crate::overlay;
16use crate::renderer;
17use crate::{Event, Length, Rectangle, Shell, Size, Vector};
18
19pub trait Widget<Message, Theme, Renderer>
38where
39 Renderer: crate::Renderer,
40{
41 fn size(&self) -> Size<Length>;
43
44 fn layout(
49 &mut self,
50 tree: &mut Tree,
51 renderer: &Renderer,
52 limits: &layout::Limits,
53 ) -> layout::Node;
54
55 fn draw(
57 &self,
58 tree: &Tree,
59 renderer: &mut Renderer,
60 theme: &Theme,
61 style: &renderer::Style,
62 layout: Layout<'_>,
63 cursor: mouse::Cursor,
64 viewport: &Rectangle,
65 );
66
67 fn tag(&self) -> tree::Tag {
71 tree::Tag::stateless()
72 }
73
74 fn state(&self) -> tree::State {
78 tree::State::None
79 }
80
81 fn diff(&mut self, tree: &mut Tree) {
83 tree.children.clear();
84 }
85
86 fn operate(
88 &mut self,
89 _tree: &mut Tree,
90 _layout: Layout<'_>,
91 _viewport: &Rectangle,
92 _renderer: &Renderer,
93 _operation: &mut dyn Operation,
94 ) {
95 }
96
97 fn update(
101 &mut self,
102 _tree: &mut Tree,
103 _event: &Event,
104 _layout: Layout<'_>,
105 _cursor: mouse::Cursor,
106 _renderer: &Renderer,
107 _shell: &mut Shell<'_, Message>,
108 _viewport: &Rectangle,
109 ) {
110 }
111
112 fn mouse_interaction(
116 &self,
117 _tree: &Tree,
118 _layout: Layout<'_>,
119 _cursor: mouse::Cursor,
120 _viewport: &Rectangle,
121 _renderer: &Renderer,
122 ) -> mouse::Interaction {
123 mouse::Interaction::None
124 }
125
126 fn overlay<'a>(
128 &'a mut self,
129 _tree: &'a mut Tree,
130 _layout: Layout<'a>,
131 _renderer: &Renderer,
132 _viewport: &Rectangle,
133 _translation: Vector,
134 ) -> Vec<overlay::Element<'a, Message, Theme, Renderer>> {
135 Vec::new()
136 }
137
138 fn is_void(&self) -> bool {
140 false
141 }
142}
143
144pub struct Void;
146
147impl<Message, Theme, Renderer> Widget<Message, Theme, Renderer> for Void
148where
149 Renderer: crate::Renderer,
150{
151 fn size(&self) -> Size<Length> {
152 Size {
153 width: Length::Shrink,
154 height: Length::Shrink,
155 }
156 }
157
158 fn layout(
159 &mut self,
160 _tree: &mut Tree,
161 _renderer: &Renderer,
162 _limits: &layout::Limits,
163 ) -> layout::Node {
164 layout::Node::new(Size::ZERO)
165 }
166
167 fn draw(
168 &self,
169 _tree: &Tree,
170 _renderer: &mut Renderer,
171 _theme: &Theme,
172 _style: &renderer::Style,
173 _layout: Layout<'_>,
174 _cursor: mouse::Cursor,
175 _viewport: &Rectangle,
176 ) {
177 }
178
179 fn is_void(&self) -> bool {
180 true
181 }
182}