use dioxus::{document, html::PointerData, prelude::Event};
use crate::state::{
events::PointerEventReceiver,
external_handlers::ExternalHandlers,
gestures::{
down_pointer::DownPointerGestureState,
drag::Drag,
hover::{Hover, HoverGestureState},
pinch::Pinch,
},
options::UseGesturesOptions,
};
#[derive(Clone)]
pub struct UseGesturesState {
external: ExternalHandlers,
hover: HoverGestureState,
down_pointer: DownPointerGestureState,
pub options: UseGesturesOptions,
}
impl UseGesturesState {
pub fn new(
external: ExternalHandlers,
hover: Hover,
drag: Drag,
pinch: Pinch,
options: UseGesturesOptions,
) -> Self {
Self {
external,
hover: HoverGestureState::new(hover),
down_pointer: DownPointerGestureState::new(drag, pinch),
options,
}
}
}
impl UseGesturesState {
fn set_pointer_capture(&self, pointer_id: i32) {
let target_id_attribute_name = &self.options.target_id_attribute_name;
let target_id = &self.options.target_id;
document::eval(&format!(
r#"document.querySelector("*[{target_id_attribute_name}='{target_id}']").setPointerCapture({pointer_id})"#,
));
}
}
impl UseGesturesState {
fn release_pointer_capture(&self, pointer_id: i32) {
let target_id_attribute_name = &self.options.target_id_attribute_name;
let target_id = &self.options.target_id;
document::eval(&format!(
r#"document.querySelector("*[{target_id_attribute_name}='{target_id}']").releasePointerCapture({pointer_id})"#,
));
}
}
impl PointerEventReceiver<Event<PointerData>> for UseGesturesState {
fn pointer_over(&mut self, event: Event<PointerData>) {
self.hover.pointer_over(&event);
self.down_pointer.pointer_over(&event);
self.external.pointer_over(event);
}
fn pointer_enter(&mut self, event: Event<PointerData>) {
self.hover.pointer_enter(&event);
self.down_pointer.pointer_enter(&event);
self.external.pointer_enter(event);
}
fn pointer_down(&mut self, event: Event<PointerData>) {
self.set_pointer_capture(event.pointer_id());
self.hover.pointer_down(&event);
self.down_pointer.pointer_down(&event);
self.external.pointer_down(event);
}
fn pointer_move(&mut self, event: Event<PointerData>) {
self.hover.pointer_move(&event);
self.down_pointer.pointer_move(&event);
self.external.pointer_move(event);
}
fn pointer_up(&mut self, event: Event<PointerData>) {
self.release_pointer_capture(event.pointer_id());
self.hover.pointer_up(&event);
self.down_pointer.pointer_up(&event);
self.external.pointer_up(event);
}
fn pointer_cancel(&mut self, event: Event<PointerData>) {
self.release_pointer_capture(event.pointer_id());
self.hover.pointer_cancel(&event);
self.down_pointer.pointer_cancel(&event);
self.external.pointer_cancel(event);
}
fn pointer_out(&mut self, event: Event<PointerData>) {
self.hover.pointer_out(&event);
self.down_pointer.pointer_out(&event);
self.external.pointer_out(event);
}
fn pointer_leave(&mut self, event: Event<PointerData>) {
self.hover.pointer_leave(&event);
self.down_pointer.pointer_leave(&event);
self.external.pointer_leave(event);
}
}