use itertools::Itertools;
use strum_macros::EnumIter;
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, EnumIter)]
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()
}
}