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 _renderer: &Renderer,
92 _operation: &mut dyn Operation,
93 ) {
94 }
95
96 fn update(
100 &mut self,
101 _tree: &mut Tree,
102 _event: &Event,
103 _layout: Layout<'_>,
104 _cursor: mouse::Cursor,
105 _renderer: &Renderer,
106 _shell: &mut Shell<'_, Message>,
107 _viewport: &Rectangle,
108 ) {
109 }
110
111 fn mouse_interaction(
115 &self,
116 _tree: &Tree,
117 _layout: Layout<'_>,
118 _cursor: mouse::Cursor,
119 _viewport: &Rectangle,
120 _renderer: &Renderer,
121 ) -> mouse::Interaction {
122 mouse::Interaction::None
123 }
124
125 fn overlay<'a>(
127 &'a mut self,
128 _tree: &'a mut Tree,
129 _layout: Layout<'a>,
130 _renderer: &Renderer,
131 _viewport: &Rectangle,
132 _translation: Vector,
133 ) -> Option<overlay::Element<'a, Message, Theme, Renderer>> {
134 None
135 }
136}
137
138pub struct Void;
140
141impl<Message, Theme, Renderer> Widget<Message, Theme, Renderer> for Void
142where
143 Renderer: crate::Renderer,
144{
145 fn size(&self) -> Size<Length> {
146 Size {
147 width: Length::Fixed(0.0),
148 height: Length::Fixed(0.0),
149 }
150 }
151
152 fn layout(
153 &mut self,
154 _tree: &mut Tree,
155 _renderer: &Renderer,
156 _limits: &layout::Limits,
157 ) -> layout::Node {
158 layout::Node::new(Size::ZERO)
159 }
160
161 fn draw(
162 &self,
163 _tree: &Tree,
164 _renderer: &mut Renderer,
165 _theme: &Theme,
166 _style: &renderer::Style,
167 _layout: Layout<'_>,
168 _cursor: mouse::Cursor,
169 _viewport: &Rectangle,
170 ) {
171 }
172}