dioxus_gestures/
use_gestures.rs

1use 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}