orbit/events/
mod.rs

1//! Enhanced event system for Orbit UI framework
2//!
3//! The event system provides:
4//! - Generic event trait with downcasting support
5//! - Event emitter for general event handling with type erasure
6//! - Dispatcher for strongly-typed event handling
7//! - Event delegation for component event propagation
8//! - Layout-aware hit testing for precise event targeting
9//! - Component ID integration for efficient event routing
10
11pub 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/// Enhanced event system that integrates with layout and components
29#[derive(Debug)]
30pub struct EventSystem {
31    /// Hit testing engine for layout-aware event targeting
32    hit_tester: HitTester,
33    /// Event delegation system
34    delegator: EventDelegate,
35}
36
37impl EventSystem {
38    /// Create a new event system
39    pub fn new() -> Self {
40        Self {
41            hit_tester: HitTester::new(),
42            delegator: EventDelegate::new(None),
43        }
44    }
45
46    /// Process a pointer event (mouse, touch) with layout hit testing
47    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        // Perform hit testing to find target components
54        let hit_targets = self.hit_tester.hit_test(position, layout_root)?;
55
56        // Create a delegated event for each hit target
57        let mut processed_targets = Vec::new();
58
59        for target_id in hit_targets {
60            let _delegated_event = DelegatedEvent::new(event.clone(), PropagationPhase::Target); // Process the event through delegation
61            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    /// Get mutable reference to the hit tester for configuration
70    pub fn hit_tester_mut(&mut self) -> &mut HitTester {
71        &mut self.hit_tester
72    }
73
74    /// Get reference to the event delegator
75    pub fn delegator(&self) -> &EventDelegate {
76        &self.delegator
77    }
78
79    /// Get mutable reference to the event delegator
80    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/// Errors that can occur in the event system
92#[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}