1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
use itertools::Itertools; pub trait Mouse { fn press(&self, button: MouseButton) -> bool; fn release(&self, button: MouseButton) -> bool; fn is_pressed(&self, button: MouseButton) -> bool; fn is_pressed_all(&self, buttons: Vec<MouseButton>) -> Vec<bool> { buttons .into_iter() .map(|b| self.is_pressed(b)) .collect_vec() } fn move_to(&self, x: u16, y: u16, display_index: Option<usize>) -> bool; fn get_position(&self) -> MousePosition; } #[derive(Debug, Eq, PartialEq, Copy, Clone)] pub enum MouseButton { Left, Middle, Right, } #[derive(Debug, Copy, Clone)] pub struct MousePosition { pub display_index: usize, pub x: u16, pub y: u16, } pub struct MouseOptedToDisplay<M> { mouse: M, display_index: usize, } impl<M: Mouse> MouseOptedToDisplay<M> { pub fn new(mouse: M, display_index: usize) -> Self { MouseOptedToDisplay { mouse, display_index, } } } impl<M: Mouse> Mouse for MouseOptedToDisplay<M> { fn press(&self, button: MouseButton) -> bool { self.mouse.press(button) } fn release(&self, button: MouseButton) -> bool { self.mouse.release(button) } fn is_pressed(&self, button: MouseButton) -> bool { self.mouse.is_pressed(button) } fn move_to(&self, x: u16, y: u16, display_index: Option<usize>) -> bool { match display_index { None => self.move_to(x, y, Some(self.display_index)), Some(display_index) => self.mouse.move_to(x, y, Some(display_index)), } } fn get_position(&self) -> MousePosition { self.mouse.get_position() } }