Skip to main content

dioxus_gestures/state/
state.rs

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