Skip to main content

afia_component/dom/
event.rs

1//! Types related to the DOM events.
2
3use std::sync::Arc;
4
5use crate::dom::element::DomElement;
6use crate::ComponentImports;
7
8/// A DOM event.
9#[derive(Clone)]
10pub struct DomEvent {
11    inner: Arc<DomEventInner>,
12}
13struct DomEventInner {
14    event: i64,
15    imports: &'static ComponentImports,
16}
17impl DomEvent {
18    // PRIVATE: Used by the `handle_events_using_callback` macro.
19    #[doc(hidden)]
20    pub fn _private_new(event_handle: i64, imports: &'static ComponentImports) -> Self {
21        Self {
22            inner: Arc::new(DomEventInner {
23                event: event_handle,
24                imports,
25            }),
26        }
27    }
28
29    /// Get the event's target element.
30    pub fn target(&self) -> Option<DomElement> {
31        let element = unsafe {
32            afia_component_sys::dom_event_target(
33                self.inner.imports.component_imports_ptr,
34                self.inner.event,
35            )
36        };
37
38        DomElement::maybe_new(element, self.inner.imports.clone())
39    }
40
41    /// Prevent the browser's default handling of the event.
42    pub fn prevent_default(&self) {
43        unsafe {
44            afia_component_sys::dom_event_prevent_default(
45                self.inner.imports.component_imports_ptr,
46                self.inner.event,
47            )
48        }
49    }
50
51    /// Will be deleted once we stop using it.
52    pub fn temporary_way_to_get_i64(&self) -> i64 {
53        self.inner.event
54    }
55}
56impl Drop for DomEventInner {
57    fn drop(&mut self) {
58        // TODO: Call a function to free the `self.event`
59    }
60}