dioxus_gestures/
use_gestures.rs1use paste;
2use std::{cell::RefCell, rc::Rc};
3
4use dioxus::{
5 core::{AttributeValue, Event, ListenerCallback},
6 html::PlatformEventData,
7 prelude::{use_hook, Attribute},
8};
9
10use crate::state::{
11 events::PointerEventReceiver,
12 gestures::{drag::Drag, hover::Hover, pinch::Pinch}, options::UseGesturesOptions,
13};
14use crate::state::{external_handlers::ExternalHandlers, state::UseGesturesState};
15
16#[derive(Clone)]
17pub struct UseGestures {
18 state: Rc<RefCell<UseGesturesState>>,
19}
20
21impl From<Gestures> for UseGestures {
22 fn from(value: Gestures) -> Self {
23 let Gestures {
24 external_handlers,
25 hover,
26 drag,
27 pinch,
28 options
29 } = value;
30 Self {
31 state: Rc::new(RefCell::new(UseGesturesState::new(
32 external_handlers,
33 hover,
34 drag,
35 pinch,
36 options
37 ))),
38 }
39 }
40}
41
42impl UseGestures {
43 pub fn event_handlers(self) -> Vec<Attribute> {
44 macro_rules! pointer_event_handler {
45 ($attribute_name: ident, $function_name: ident) => {{
46 let pointer_ref = Rc::clone(&self.state);
47 Attribute::new(
48 paste::paste! { stringify!([<$attribute_name:camel:lower>])},
49 AttributeValue::Listener(
50 ListenerCallback::new(move |e: Event<PlatformEventData>| {
51 let _ = pointer_ref
52 .try_borrow_mut()
53 .map(|mut s| s.$function_name(e.map(|data| data.into())));
54 })
55 .erase(),
56 ),
57 None,
58 true,
59 )
60 }};
61 }
62
63 vec![
64 Attribute::new(
65 self.state.borrow().options.target_id_attribute_name,
66 AttributeValue::Text(self.state.borrow().options.target_id.to_string()),
67 None,
68 true,
69 ),
70 pointer_event_handler!(on_pointer_over, pointer_over),
71 pointer_event_handler!(on_pointer_enter, pointer_enter),
72 pointer_event_handler!(on_pointer_down, pointer_down),
73 pointer_event_handler!(on_pointer_move, pointer_move),
74 pointer_event_handler!(on_pointer_up, pointer_up),
75 pointer_event_handler!(on_pointer_cancel, pointer_cancel),
76 pointer_event_handler!(on_pointer_out, pointer_out),
77 pointer_event_handler!(on_pointer_leave, pointer_leave),
78 ]
79 }
80}
81
82pub fn use_gestures<'a>(props: Gestures) -> UseGestures {
83 use_hook(|| UseGestures::from(props))
84}
85
86#[derive(Default)]
87pub struct Gestures {
88 pub external_handlers: ExternalHandlers,
89 pub hover: Hover,
90 pub drag: Drag,
91 pub pinch: Pinch,
92 pub options: UseGesturesOptions
93}
94
95impl Gestures {
96 pub fn external_handlers(mut self, external_handlers: ExternalHandlers) -> Self {
97 self.external_handlers = external_handlers;
98 self
99 }
100
101 pub fn hover(mut self, hover: Hover) -> Self {
102 self.hover = hover;
103 self
104 }
105
106 pub fn drag(mut self, drag: Drag) -> Self {
107 self.drag = drag;
108 self
109 }
110
111 pub fn pinch(mut self, pinch: Pinch) -> Self {
112 self.pinch = pinch;
113 self
114 }
115
116 pub fn options(mut self, options: UseGesturesOptions) -> Self {
117 self.options = options;
118 self
119 }
120}