1use core::{any::Any, hash::Hash};
2
3use alloc::vec::Vec;
4
5use crate::{
6 el::{El, ElId},
7 event::{Event, EventResponse, Propagate},
8 layout::{Layout, LayoutNode, Limits, Position, Viewport},
9 render::Renderer,
10 size::{Bounds, Length, Size},
11 state::{State, StateNode, StateTag},
12 style::Styler,
13 ui::UiCtx,
14};
15
16pub trait Widget<Message, R, E: Event, S>
22where
23 R: Renderer,
24{
25 fn id(&self) -> Option<ElId>;
26 fn tree_ids(&self) -> Vec<ElId>;
27 fn size(&self) -> Size<Length>;
28 fn position(&self) -> Position {
29 Position::Relative
30 }
31 fn layout(
32 &self,
33 ctx: &mut UiCtx<Message>,
34 state: &mut StateNode,
35 styler: &S,
36 limits: &Limits,
37 viewport: &Viewport,
38 ) -> LayoutNode;
39
40 fn draw(
41 &self,
42 ctx: &mut UiCtx<Message>,
43 state: &mut StateNode,
44 renderer: &mut R,
45 styler: &S,
46 layout: Layout,
47 );
48
49 fn on_event(
50 &mut self,
51 ctx: &mut UiCtx<Message>,
52 event: E,
53 state: &mut StateNode,
54 ) -> EventResponse<E> {
55 let _ = ctx;
56 let _ = event;
57 let _ = state;
58 Propagate::Ignored.into()
59 }
60
61 fn state_tag(&self) -> StateTag {
62 StateTag::stateless()
63 }
64 fn state(&self) -> State {
65 State::None
66 }
67 fn state_children(&self) -> Vec<StateNode> {
68 vec![]
69 }
70}