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