1
2use wasm_bindgen::prelude::*;
3use crate::io::MouseButton;
4
5#[wasm_bindgen]
6extern {
7 fn copperCreatePointer(element_id: &str) -> usize;
8
9 fn copperPointerIsMouse(pointer: usize) -> bool;
10 fn copperPointerPressing(pointer: usize, button: usize) -> bool;
11 fn copperPointerMouseX(pointer: usize) -> f32;
12 fn copperPointerMouseY(pointer: usize) -> f32;
13 fn copperPointerTouchCount(pointer: usize) -> usize;
14 fn copperPointerTouchX(pointer: usize, index: usize) -> f32;
15 fn copperPointerTouchY(pointer: usize, index: usize) -> f32;
16
17 fn copperDropPointer(pointer: usize);
18}
19
20fn get_mouse_button_js(button: MouseButton) -> usize {
21 match button {
22 MouseButton::Left => 0,
23 MouseButton::Scrollwheel => 1,
24 MouseButton::Right => 2,
25 }
26}
27
28pub struct Pointer {
29 pointer: usize
30}
31
32impl Pointer {
33 pub fn from_document() -> Pointer { Pointer { pointer: copperCreatePointer("") } }
34 pub fn from_element(element_id: &str) -> Pointer { Pointer { pointer: copperCreatePointer(element_id) } }
35
36 pub fn is_mouse(&self) -> bool { copperPointerIsMouse(self.pointer) }
37 pub fn pressing(&self, button: MouseButton) -> bool { copperPointerPressing(self.pointer, get_mouse_button_js(button)) }
38 pub fn mouse_x(&self) -> f32 { copperPointerMouseX(self.pointer) }
39 pub fn mouse_y(&self) -> f32 { copperPointerMouseY(self.pointer) }
40
41 pub fn is_touch(&self) -> bool { !copperPointerIsMouse(self.pointer) }
42 pub fn touches(&self) -> Vec<[f32; 2]> {
43 let mut result: Vec<[f32; 2]> = vec![[0.0; 2]; copperPointerTouchCount(self.pointer)];
44 for i in 0..result.len() {
45 result[i] = [copperPointerTouchX(self.pointer, i), copperPointerTouchY(self.pointer, i)];
46 }
47 result
48 }
49}
50
51impl Drop for Pointer {
52 fn drop(&mut self) {
53 copperDropPointer(self.pointer);
54 }
55}