embedded_ui/
widget.rs

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
16// pub struct Overlay {
17//     bounds: Bounds,
18//     children: Vec<Overlay>,
19// }
20
21pub 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}