copper_rs/io/
pointer.rs

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}