1pub mod delegation;
12pub mod dispatcher;
13pub mod emitter;
14pub mod event;
15pub mod hit_testing;
16
17pub use delegation::*;
18pub use dispatcher::Dispatcher;
19pub use emitter::EventEmitter;
20pub use event::Event;
21pub use hit_testing::*;
22
23use crate::{
24 component::ComponentId,
25 layout::{LayoutNode, Point},
26};
27
28#[derive(Debug)]
30pub struct EventSystem {
31 hit_tester: HitTester,
33 delegator: EventDelegate,
35}
36
37impl EventSystem {
38 pub fn new() -> Self {
40 Self {
41 hit_tester: HitTester::new(),
42 delegator: EventDelegate::new(None),
43 }
44 }
45
46 pub fn process_pointer_event<E: Event + Clone>(
48 &mut self,
49 event: E,
50 position: Point,
51 layout_root: &LayoutNode,
52 ) -> Result<Vec<ComponentId>, EventError> {
53 let hit_targets = self.hit_tester.hit_test(position, layout_root)?;
55
56 let mut processed_targets = Vec::new();
58
59 for target_id in hit_targets {
60 let _delegated_event = DelegatedEvent::new(event.clone(), PropagationPhase::Target); self.delegator
62 .dispatch(&event, Some(target_id.id() as usize));
63 processed_targets.push(target_id);
64 }
65
66 Ok(processed_targets)
67 }
68
69 pub fn hit_tester_mut(&mut self) -> &mut HitTester {
71 &mut self.hit_tester
72 }
73
74 pub fn delegator(&self) -> &EventDelegate {
76 &self.delegator
77 }
78
79 pub fn delegator_mut(&mut self) -> &mut EventDelegate {
81 &mut self.delegator
82 }
83}
84
85impl Default for EventSystem {
86 fn default() -> Self {
87 Self::new()
88 }
89}
90
91#[derive(Debug, thiserror::Error)]
93pub enum EventError {
94 #[error("Hit testing failed: {0}")]
95 HitTestingFailed(String),
96
97 #[error("Event delegation failed: {0}")]
98 DelegationFailed(String),
99
100 #[error("Component not found: {0:?}")]
101 ComponentNotFound(ComponentId),
102
103 #[error("Invalid event data: {0}")]
104 InvalidEventData(String),
105}