ohos_arkui_binding/component/attribute/
event.rs1use 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
11pub 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}