embedded_gui/context/
mod.rs1pub 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 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 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 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}