dioxus_gestures/state/
state.rs

1use dioxus::{document, html::PointerData, prelude::Event};
2use nanoid::nanoid;
3
4use crate::state::{
5    events::PointerEventReceiver,
6    external_handlers::ExternalHandlers,
7    gestures::{
8        down_pointer::DownPointerGestureState,
9        drag::Drag,
10        hover::{Hover, HoverGestureState},
11        pinch::Pinch,
12    },
13};
14
15#[derive(Clone)]
16pub struct UseGesturesState {
17    pub target_unique_id: String,
18    external: ExternalHandlers,
19    hover: HoverGestureState,
20    down_pointer: DownPointerGestureState,
21}
22
23impl UseGesturesState {
24    pub fn new(external: ExternalHandlers, hover: Hover, drag: Drag, pinch: Pinch) -> Self {
25        let target_unique_id = nanoid!();
26        Self {
27            target_unique_id: target_unique_id.clone(),
28            external,
29            hover: HoverGestureState::new(hover),
30            down_pointer: DownPointerGestureState::new(drag, pinch),
31        }
32    }
33}
34
35impl UseGesturesState {
36    fn set_pointer_capture(&self, pointer_id: i32) {
37        let target_unique_id = &self.target_unique_id;
38        document::eval(&format!(
39            r#"document.querySelector("*[data-gestures-id='{target_unique_id}']").setPointerCapture({:?})"#,
40            pointer_id
41        ));
42    }
43}
44
45impl UseGesturesState {
46    fn release_pointer_capture(&self, pointer_id: i32) {
47        let target_unique_id = &self.target_unique_id;
48        document::eval(&format!(
49            r#"document.querySelector("*[data-gestures-id='{target_unique_id}']").releasePointerCapture("{:?}")"#,
50            pointer_id
51        ));
52    }
53}
54
55impl PointerEventReceiver<Event<PointerData>> for UseGesturesState {
56    fn pointer_over(&mut self, event: Event<PointerData>) {
57        self.hover.pointer_over(&event);
58        self.down_pointer.pointer_over(&event);
59        self.external.pointer_over(event);
60    }
61
62    fn pointer_enter(&mut self, event: Event<PointerData>) {
63        self.hover.pointer_enter(&event);
64        self.down_pointer.pointer_enter(&event);
65        self.external.pointer_enter(event);
66    }
67
68    fn pointer_down(&mut self, event: Event<PointerData>) {
69        self.set_pointer_capture(event.pointer_id());
70
71        self.hover.pointer_down(&event);
72        self.down_pointer.pointer_down(&event);
73        self.external.pointer_down(event);
74    }
75
76    fn pointer_move(&mut self, event: Event<PointerData>) {
77        self.hover.pointer_move(&event);
78        self.down_pointer.pointer_move(&event);
79        self.external.pointer_move(event);
80    }
81
82    fn pointer_up(&mut self, event: Event<PointerData>) {
83        self.release_pointer_capture(event.pointer_id());
84
85        self.hover.pointer_up(&event);
86        self.down_pointer.pointer_up(&event);
87        self.external.pointer_up(event);
88    }
89
90    fn pointer_cancel(&mut self, event: Event<PointerData>) {
91        self.release_pointer_capture(event.pointer_id());
92
93        self.hover.pointer_cancel(&event);
94        self.down_pointer.pointer_cancel(&event);
95        self.external.pointer_cancel(event);
96    }
97
98    fn pointer_out(&mut self, event: Event<PointerData>) {
99        self.hover.pointer_out(&event);
100        self.down_pointer.pointer_out(&event);
101        self.external.pointer_out(event);
102    }
103
104    fn pointer_leave(&mut self, event: Event<PointerData>) {
105        self.hover.pointer_leave(&event);
106        self.down_pointer.pointer_leave(&event);
107        self.external.pointer_leave(event);
108    }
109}