use crate::Position;
use action::{self, MouseButton};
use actor::{Actor, ChainedAction};
use action::InputAction;
use crate::platform::current;
#[derive(Debug)]
pub struct Mouse {
position: Position,
actual_position: Position,
}
impl Mouse {
pub(crate) fn new() -> Mouse {
Mouse {
position: Position::new(0, 0),
actual_position: Position::new(0, 0),
}
}
fn is_placed(&self) -> bool {
self.position == self.actual_position
}
#[allow(dead_code)]
fn sync(self) -> Mouse {
if !self.is_placed() {
let p = self.position;
self.move_to(p)
} else {
self
}
}
pub fn at(self, new_pos: Position) -> Mouse {
Mouse {
position: new_pos,
..self
}
}
pub fn move_to(self, new_pos: Position) -> Mouse {
let mouse = Mouse {
position: new_pos,
actual_position: new_pos,
};
mouse.event(action::InputAction::MouseMove)
}
pub fn drag_to(self, new_pos: Position) -> Mouse {
self.left_drag_to(new_pos)
}
pub fn left_drag_to(self, new_pos: Position) -> Mouse {
self.drag_to_with(new_pos, MouseButton::Left)
}
pub fn right_drag_to(self, new_pos: Position) -> Mouse {
self.drag_to_with(new_pos, MouseButton::Right)
}
pub fn drag_to_with(self, new_pos: Position, button: MouseButton) -> Mouse {
let start_pos = self.position;
self.move_to(start_pos)
.down(button)
.at(new_pos)
.event(action::InputAction::MouseDrag(button))
.up(button)
}
pub fn down(self, button: MouseButton) -> Mouse {
self.event(action::InputAction::MouseDown(button))
}
pub fn up(self, button: MouseButton) -> Mouse {
self.event(action::InputAction::MouseUp(button))
}
pub fn click(self) -> Mouse {
self.left_click()
}
pub fn left_click(self) -> Mouse {
self.click_with(MouseButton::Left)
}
pub fn right_click(self) -> Mouse {
self.click_with(MouseButton::Right)
}
pub fn click_with(self, button: MouseButton) -> Mouse {
self.event(action::InputAction::MouseClickN(button, 1))
}
pub fn doubleclick(self) -> Mouse {
self.event(action::InputAction::MouseClickN(MouseButton::Left, 2))
}
pub fn left_doubleclick(self) -> Mouse {
self.event(action::InputAction::MouseClickN(MouseButton::Left, 2))
}
pub fn right_doubleclick(self) -> Mouse {
self.doubleclick_with(MouseButton::Right)
}
pub fn doubleclick_with(self, button: MouseButton) -> Mouse {
self.event(action::InputAction::MouseClickN(button, 2))
}
}
impl Actor for Mouse {
fn event(self, t: InputAction) -> Self {
current::process_event(t, Some(self.position));
self
}
}
impl ChainedAction for Mouse {}