Skip to main content

ohos_arkui_binding/api/node_custom_event/
event.rs

1//! Module api::node_custom_event::event wrappers and related types.
2
3use std::{os::raw::c_void, ptr::NonNull};
4
5use ohos_arkui_sys::{
6    ArkUI_NodeCustomEvent, OH_ArkUI_NodeCustomEvent_GetCustomSpanDrawInfo,
7    OH_ArkUI_NodeCustomEvent_GetCustomSpanMeasureInfo,
8    OH_ArkUI_NodeCustomEvent_GetDrawContextInDraw, OH_ArkUI_NodeCustomEvent_GetEventTargetId,
9    OH_ArkUI_NodeCustomEvent_GetEventType, OH_ArkUI_NodeCustomEvent_GetLayoutConstraintInMeasure,
10    OH_ArkUI_NodeCustomEvent_GetNodeHandle, OH_ArkUI_NodeCustomEvent_GetPositionInLayout,
11    OH_ArkUI_NodeCustomEvent_GetUserData, OH_ArkUI_NodeCustomEvent_SetCustomSpanMetrics,
12};
13
14use crate::{check_arkui_status, ArkUINode, ArkUIResult};
15
16use super::{
17    CustomSpanDrawInfo, CustomSpanMeasureInfo, CustomSpanMetrics, DrawContext, IntOffset,
18    LayoutConstraintHandle,
19};
20
21/// Wrapper for node custom-event payload delivered by ArkUI.
22pub struct NodeCustomEvent {
23    raw: NonNull<ArkUI_NodeCustomEvent>,
24}
25
26impl NodeCustomEvent {
27    pub(crate) fn from_raw(raw: *mut ArkUI_NodeCustomEvent) -> Option<Self> {
28        NonNull::new(raw).map(|raw| Self { raw })
29    }
30
31    fn raw(&self) -> *mut ArkUI_NodeCustomEvent {
32        self.raw.as_ptr()
33    }
34
35    /// Returns layout constraint info for measure callbacks.
36    pub fn layout_constraint_in_measure(&self) -> Option<LayoutConstraintHandle> {
37        let constraint =
38            unsafe { OH_ArkUI_NodeCustomEvent_GetLayoutConstraintInMeasure(self.raw()) };
39        LayoutConstraintHandle::from_raw(constraint)
40    }
41
42    /// Returns measured/layout position offset.
43    pub fn position_in_layout(&self) -> IntOffset {
44        unsafe { OH_ArkUI_NodeCustomEvent_GetPositionInLayout(self.raw()) }.into()
45    }
46
47    /// Returns drawing context for draw-related callbacks.
48    pub fn draw_context_in_draw(&self) -> Option<DrawContext> {
49        let draw_context = unsafe { OH_ArkUI_NodeCustomEvent_GetDrawContextInDraw(self.raw()) };
50        DrawContext::from_raw(draw_context)
51    }
52
53    /// Returns target id of the event source.
54    pub fn event_target_id(&self) -> i32 {
55        unsafe { OH_ArkUI_NodeCustomEvent_GetEventTargetId(self.raw()) }
56    }
57
58    /// Returns user data attached by ArkUI callback registration.
59    pub fn user_data(&self) -> Option<NonNull<c_void>> {
60        let user_data = unsafe { OH_ArkUI_NodeCustomEvent_GetUserData(self.raw()) };
61        NonNull::new(user_data)
62    }
63
64    /// Returns associated node handle.
65    pub fn node_handle(&self) -> Option<ArkUINode> {
66        let node = unsafe { OH_ArkUI_NodeCustomEvent_GetNodeHandle(self.raw()) };
67        ArkUINode::from_raw_handle(node)
68    }
69
70    /// Returns custom event category.
71    pub fn event_type(&self) -> crate::NodeCustomEventType {
72        unsafe { OH_ArkUI_NodeCustomEvent_GetEventType(self.raw()).into() }
73    }
74
75    pub fn get_custom_span_measure_info(
76        &self,
77        info: &mut CustomSpanMeasureInfo,
78    ) -> ArkUIResult<()> {
79        unsafe {
80            check_arkui_status!(OH_ArkUI_NodeCustomEvent_GetCustomSpanMeasureInfo(
81                self.raw(),
82                info.raw()
83            ))
84        }
85    }
86
87    pub fn set_custom_span_metrics(&self, metrics: &mut CustomSpanMetrics) -> ArkUIResult<()> {
88        unsafe {
89            check_arkui_status!(OH_ArkUI_NodeCustomEvent_SetCustomSpanMetrics(
90                self.raw(),
91                metrics.raw()
92            ))
93        }
94    }
95
96    pub fn get_custom_span_draw_info(&self, info: &mut CustomSpanDrawInfo) -> ArkUIResult<()> {
97        unsafe {
98            check_arkui_status!(OH_ArkUI_NodeCustomEvent_GetCustomSpanDrawInfo(
99                self.raw(),
100                info.raw()
101            ))
102        }
103    }
104}