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 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 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 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 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}