Skip to main content

embedded_gui/context/
mod.rs

1pub mod builders;
2pub mod core_impl;
3pub mod input;
4pub mod mutators;
5pub mod present;
6pub mod render;
7pub mod types;
8
9pub use builders::WidgetBuilder;
10pub(crate) use input::*;
11pub use types::*;
12
13#[cfg(test)]
14mod tests {
15    use crate::GuiContext;
16    use crate::geometry::Rect;
17    use crate::input::{InputEvent, PointerButton, UiEvent};
18
19    #[test]
20    fn test_context_initialization() {
21        let viewport = Rect::new(0, 0, 320, 240);
22        let ctx: GuiContext<32, 16, 16> = GuiContext::new(viewport);
23        assert_eq!(ctx.viewport(), viewport);
24        assert_eq!(ctx.widgets().len(), 0);
25        assert_eq!(ctx.focus(), None);
26    }
27
28    #[test]
29    fn test_widget_addition_and_focus() {
30        let viewport = Rect::new(0, 0, 320, 240);
31        let mut ctx: GuiContext<32, 16, 16> = GuiContext::new(viewport);
32
33        let btn1 = ctx
34            .add_themed_button(Rect::new(10, 10, 80, 30), "Button 1")
35            .unwrap();
36        let btn2 = ctx
37            .add_themed_button(Rect::new(10, 50, 80, 30), "Button 2")
38            .unwrap();
39
40        assert_eq!(ctx.widgets().len(), 2);
41        // Automatically focuses first focusable widget
42        assert_eq!(ctx.focus(), Some(btn1));
43
44        ctx.set_focus(Some(btn2)).unwrap();
45        assert_eq!(ctx.focus(), Some(btn2));
46    }
47
48    #[test]
49    fn test_state_mutations() {
50        let viewport = Rect::new(0, 0, 320, 240);
51        let mut ctx: GuiContext<32, 16, 16> = GuiContext::new(viewport);
52
53        let progress_id = ctx
54            .add_themed_progress_bar(Rect::new(10, 10, 100, 10), 0.5)
55            .unwrap();
56        ctx.set_progress(progress_id, 0.75).unwrap();
57
58        let toggle_id = ctx
59            .add_themed_toggle(Rect::new(10, 30, 40, 20), "Toggle", false)
60            .unwrap();
61        ctx.set_toggle(toggle_id, true).unwrap();
62
63        ctx.set_enabled(progress_id, false).unwrap();
64        assert!(!ctx.effective_enabled(progress_id));
65    }
66
67    #[test]
68    fn test_input_handling() {
69        let viewport = Rect::new(0, 0, 320, 240);
70        let mut ctx: GuiContext<32, 16, 16> = GuiContext::new(viewport);
71
72        let btn = ctx
73            .add_themed_button(Rect::new(10, 10, 80, 30), "Press")
74            .unwrap();
75
76        // Pointer down inside button
77        ctx.handle_input(InputEvent::Pointer {
78            x: 15,
79            y: 15,
80            state: crate::input::PointerState::Pressed,
81            button: PointerButton::Primary,
82        })
83        .unwrap();
84
85        // Pointer up emits click event
86        ctx.handle_input(InputEvent::Pointer {
87            x: 15,
88            y: 15,
89            state: crate::input::PointerState::Released,
90            button: PointerButton::Primary,
91        })
92        .unwrap();
93
94        let events = &ctx.events;
95        assert!(
96            events
97                .iter()
98                .any(|e| matches!(e, UiEvent::Clicked(id) if id == &btn))
99        );
100    }
101}