Skip to main content

ohos_arkui_binding/component/attribute/
event.rs

1//! Module component::attribute::event wrappers and related types.
2
3use std::{cell::RefCell, rc::Rc};
4
5#[cfg(feature = "api-22")]
6use crate::TouchTestInfo;
7use crate::{Event, NodeEventType, ARK_UI_NATIVE_NODE_API_1};
8
9use super::ArkUIAttributeBasic;
10
11/// Event registration helpers shared by components.
12pub trait ArkUIEvent: ArkUIAttributeBasic {
13    fn on_event<T: Fn(&Event) + 'static>(&mut self, event_type: NodeEventType, cb: T) {
14        let node = self.borrow_mut();
15        ARK_UI_NATIVE_NODE_API_1
16            .with(|api| api.register_node_event(node, event_type))
17            .expect("ArkUI_NativeNodeAPI_1::registerNodeEvent is None");
18        node.event_handle
19            .set_event_callback(event_type, Rc::new(RefCell::new(cb)));
20    }
21
22    fn on_event_no_param<T: Fn() + 'static>(&mut self, event_type: NodeEventType, cb: T) {
23        self.on_event(event_type, move |_| cb());
24    }
25
26    fn on_custom_event<T: Fn(&crate::NodeCustomEvent) + 'static>(
27        &mut self,
28        event_type: crate::NodeCustomEventType,
29        cb: T,
30    ) {
31        let node = self.borrow_mut();
32        ARK_UI_NATIVE_NODE_API_1
33            .with(|api| api.register_node_custom_event_callback(node, event_type, 0, cb))
34            .expect("ArkUI_NativeNodeAPI_1::registerNodeCustomEvent is None");
35    }
36
37    fn on_custom_measure<T: Fn(&crate::NodeCustomEvent) + 'static>(&mut self, cb: T) {
38        self.on_custom_event(crate::NodeCustomEventType::OnMeasure, cb);
39    }
40
41    fn on_custom_layout<T: Fn(&crate::NodeCustomEvent) + 'static>(&mut self, cb: T) {
42        self.on_custom_event(crate::NodeCustomEventType::OnLayout, cb);
43    }
44
45    fn on_custom_draw<T: Fn(&crate::NodeCustomEvent) + 'static>(&mut self, cb: T) {
46        self.on_custom_event(crate::NodeCustomEventType::OnDraw, cb);
47    }
48
49    fn on_custom_foreground_draw<T: Fn(&crate::NodeCustomEvent) + 'static>(&mut self, cb: T) {
50        self.on_custom_event(crate::NodeCustomEventType::OnForegroundDraw, cb);
51    }
52
53    fn on_custom_overlay_draw<T: Fn(&crate::NodeCustomEvent) + 'static>(&mut self, cb: T) {
54        self.on_custom_event(crate::NodeCustomEventType::OnOverlayDraw, cb);
55    }
56
57    #[cfg(feature = "api-20")]
58    fn on_custom_draw_front<T: Fn(&crate::NodeCustomEvent) + 'static>(&mut self, cb: T) {
59        self.on_custom_event(crate::NodeCustomEventType::OnDrawFront, cb);
60    }
61
62    #[cfg(feature = "api-20")]
63    fn on_custom_draw_behind<T: Fn(&crate::NodeCustomEvent) + 'static>(&mut self, cb: T) {
64        self.on_custom_event(crate::NodeCustomEventType::OnDrawBehind, cb);
65    }
66
67    fn on_click<T: Fn() + 'static>(&mut self, cb: T) {
68        self.on_event_no_param(NodeEventType::OnClick, cb);
69    }
70
71    fn on_click_with_event<T: Fn(&Event) + 'static>(&mut self, cb: T) {
72        self.on_event(NodeEventType::OnClick, cb);
73    }
74
75    fn on_appear<T: Fn() + 'static>(&mut self, cb: T) {
76        self.on_event_no_param(NodeEventType::EventOnAppear, cb);
77    }
78
79    fn on_disappear<T: Fn() + 'static>(&mut self, cb: T) {
80        self.on_event_no_param(NodeEventType::EventOnDisappear, cb);
81    }
82
83    fn on_focus<T: Fn() + 'static>(&mut self, cb: T) {
84        self.on_event_no_param(NodeEventType::OnFocus, cb);
85    }
86
87    fn on_blur<T: Fn() + 'static>(&mut self, cb: T) {
88        self.on_event_no_param(NodeEventType::OnBlur, cb);
89    }
90
91    fn on_attach<T: Fn() + 'static>(&mut self, cb: T) {
92        self.on_event_no_param(NodeEventType::EventOnAttach, cb);
93    }
94
95    fn on_detach<T: Fn() + 'static>(&mut self, cb: T) {
96        self.on_event_no_param(NodeEventType::EventOnDetach, cb);
97    }
98
99    fn on_hover<T: Fn(bool) + 'static>(&mut self, cb: T) {
100        self.on_event(NodeEventType::OnHover, move |event| {
101            cb(event.i32_value(0).unwrap_or_default() != 0);
102        });
103    }
104
105    fn on_touch_event<T: Fn(&Event) + 'static>(&mut self, cb: T) {
106        self.on_event(NodeEventType::TouchEvent, cb);
107    }
108
109    fn on_area_change<T: Fn(&Event) + 'static>(&mut self, cb: T) {
110        self.on_event(NodeEventType::EventOnAreaChange, cb);
111    }
112
113    fn on_visible_area_change<T: Fn(bool, f32) + 'static>(&mut self, cb: T) {
114        self.on_event(NodeEventType::EventOnVisibleAreaChange, move |event| {
115            cb(
116                event.i32_value(0).unwrap_or_default() != 0,
117                event.f32_value(1).unwrap_or_default(),
118            );
119        });
120    }
121
122    fn on_touch_intercept<T: Fn(&Event) -> Option<bool> + 'static>(&mut self, cb: T) {
123        self.on_event(NodeEventType::OnTouchIntercept, move |event| {
124            if let Some(value) = cb(event) {
125                let _ = event.set_return_bool(value);
126            }
127        });
128    }
129
130    fn on_mouse<T: Fn(&Event) + 'static>(&mut self, cb: T) {
131        self.on_event(NodeEventType::OnMouse, cb);
132    }
133
134    fn on_accessibility_actions<T: Fn(u32) + 'static>(&mut self, cb: T) {
135        self.on_event(NodeEventType::OnAccessibilityActions, move |event| {
136            cb(event.u32_value(0).unwrap_or_default());
137        });
138    }
139
140    fn on_pre_drag<T: Fn(Option<crate::PreDragStatus>) + 'static>(&mut self, cb: T) {
141        self.on_event(NodeEventType::OnPreDrag, move |event| {
142            cb(event.pre_drag_status());
143        });
144    }
145
146    fn on_drag_start<T: Fn(&Event) + 'static>(&mut self, cb: T) {
147        self.on_event(NodeEventType::OnDragStart, cb);
148    }
149
150    fn on_drag_enter<T: Fn(&Event) + 'static>(&mut self, cb: T) {
151        self.on_event(NodeEventType::OnDragEnter, cb);
152    }
153
154    fn on_drag_move<T: Fn(&Event) + 'static>(&mut self, cb: T) {
155        self.on_event(NodeEventType::OnDragMove, cb);
156    }
157
158    fn on_drag_leave<T: Fn(&Event) + 'static>(&mut self, cb: T) {
159        self.on_event(NodeEventType::OnDragLeave, cb);
160    }
161
162    fn on_drop<T: Fn(&Event) + 'static>(&mut self, cb: T) {
163        self.on_event(NodeEventType::OnDrop, cb);
164    }
165
166    fn on_drag_end<T: Fn(&Event) + 'static>(&mut self, cb: T) {
167        self.on_event(NodeEventType::OnDragEnd, cb);
168    }
169
170    #[cfg(feature = "api-14")]
171    fn on_key_event<T: Fn(&Event) + 'static>(&mut self, cb: T) {
172        self.on_event(NodeEventType::OnKeyEvent, cb);
173    }
174
175    #[cfg(feature = "api-14")]
176    fn on_key_pre_ime<T: Fn(&Event) -> Option<bool> + 'static>(&mut self, cb: T) {
177        self.on_event(NodeEventType::OnKeyPreIme, move |event| {
178            if let Some(value) = cb(event) {
179                let _ = event.set_return_bool(value);
180            }
181        });
182    }
183
184    #[cfg(feature = "api-15")]
185    fn on_focus_axis<T: Fn(&Event) + 'static>(&mut self, cb: T) {
186        self.on_event(NodeEventType::OnFocusAxis, cb);
187    }
188
189    #[cfg(feature = "api-15")]
190    fn on_dispatch_key_event<T: Fn(&Event) -> Option<bool> + 'static>(&mut self, cb: T) {
191        self.on_event(NodeEventType::DispatchKeyEvent, move |event| {
192            if let Some(value) = cb(event) {
193                let _ = event.set_return_bool(value);
194            }
195        });
196    }
197
198    #[cfg(feature = "api-17")]
199    fn on_axis<T: Fn(&Event) + 'static>(&mut self, cb: T) {
200        self.on_event(NodeEventType::OnAxis, cb);
201    }
202
203    #[cfg(feature = "api-18")]
204    fn on_click_event<T: Fn(&Event) + 'static>(&mut self, cb: T) {
205        self.on_event(NodeEventType::OnClickEvent, cb);
206    }
207
208    #[cfg(feature = "api-17")]
209    fn on_hover_event<T: Fn(&Event) + 'static>(&mut self, cb: T) {
210        self.on_event(NodeEventType::OnHoverEvent, cb);
211    }
212
213    #[cfg(feature = "api-17")]
214    fn on_visible_area_approximate_change<T: Fn(bool, f32) + 'static>(&mut self, cb: T) {
215        self.on_event(
216            NodeEventType::VisibleAreaApproximateChangeEvent,
217            move |event| {
218                cb(
219                    event.i32_value(0).unwrap_or_default() != 0,
220                    event.f32_value(1).unwrap_or_default(),
221                );
222            },
223        );
224    }
225
226    #[cfg(feature = "api-15")]
227    fn on_hover_move<T: Fn(&Event) + 'static>(&mut self, cb: T) {
228        self.on_event(NodeEventType::OnHoverMove, cb);
229    }
230
231    #[cfg(feature = "api-21")]
232    fn on_size_change<T: Fn(&Event) + 'static>(&mut self, cb: T) {
233        self.on_event(NodeEventType::OnSizeChange, cb);
234    }
235
236    #[cfg(feature = "api-22")]
237    fn on_coasting_axis_event<T: Fn(&Event) + 'static>(&mut self, cb: T) {
238        self.on_event(NodeEventType::OnCoastingAxisEvent, cb);
239    }
240
241    #[cfg(feature = "api-22")]
242    fn on_child_touch_test<T: Fn(&Event) -> Option<bool> + 'static>(&mut self, cb: T) {
243        self.on_event(NodeEventType::OnChildTouchTest, move |event| {
244            if let Some(value) = cb(event) {
245                let _ = event.set_return_bool(value);
246            }
247        });
248    }
249
250    #[cfg(feature = "api-22")]
251    fn on_child_touch_test_with_info<
252        T: Fn(&Event, Option<TouchTestInfo>) -> Option<bool> + 'static,
253    >(
254        &mut self,
255        cb: T,
256    ) {
257        self.on_event(NodeEventType::OnChildTouchTest, move |event| {
258            if let Some(value) = cb(event, event.touch_test_info()) {
259                let _ = event.set_return_bool(value);
260            }
261        });
262    }
263
264    fn on_will_scroll<T: Fn(f32, i32, i32) -> Option<f32> + 'static>(&mut self, cb: T) {
265        self.on_event(NodeEventType::OnWillScroll, move |event| {
266            let offset = event.f32_value(0).unwrap_or_default();
267            let state = event.i32_value(1).unwrap_or_default();
268            let source = event.i32_value(2).unwrap_or_default();
269            if let Some(value) = cb(offset, state, source) {
270                let _ = event.set_return_f32(value);
271            }
272        });
273    }
274}