use vizia_id::GenerationalId;
#[derive(Debug, Copy, Clone, PartialEq)]
pub enum MouseButton {
Left,
Right,
Middle,
Other(u16),
Back,
Forward,
}
#[derive(Debug, Copy, Clone, PartialEq)]
pub enum MouseButtonState {
Pressed,
Released,
}
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct MouseButtonData<I>
where
I: GenerationalId,
{
pub state: MouseButtonState,
pub pos_down: (f32, f32),
pub pos_up: (f32, f32),
pub pressed: I,
pub released: I,
}
impl<I> Default for MouseButtonData<I>
where
I: GenerationalId,
{
fn default() -> Self {
MouseButtonData {
state: MouseButtonState::Released,
pos_down: (0.0, 0.0),
pos_up: (0.0, 0.0),
pressed: I::null(),
released: I::null(),
}
}
}
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct MouseState<I>
where
I: GenerationalId,
{
pub cursor_x: f32,
pub cursor_y: f32,
pub previous_cursor_x: f32,
pub previous_cursor_y: f32,
pub left: MouseButtonData<I>,
pub right: MouseButtonData<I>,
pub middle: MouseButtonData<I>,
}
impl<I> Default for MouseState<I>
where
I: GenerationalId,
{
fn default() -> Self {
MouseState {
cursor_x: -1.0,
cursor_y: -1.0,
previous_cursor_x: -1.0,
previous_cursor_y: -1.0,
left: MouseButtonData::default(),
right: MouseButtonData::default(),
middle: MouseButtonData::default(),
}
}
}
impl<I> MouseState<I>
where
I: GenerationalId,
{
pub fn delta(&self) -> (f32, f32) {
(self.cursor_x - self.previous_cursor_x, self.cursor_y - self.previous_cursor_y)
}
pub fn button_delta(&self, button: MouseButton) -> (f32, f32) {
match button {
MouseButton::Left => {
(self.cursor_x - self.left.pos_down.0, self.cursor_y - self.left.pos_down.1)
}
MouseButton::Right => {
(self.cursor_x - self.right.pos_down.0, self.cursor_y - self.right.pos_down.1)
}
MouseButton::Middle => {
(self.cursor_x - self.middle.pos_down.0, self.cursor_y - self.middle.pos_down.1)
}
_ => (0.0, 0.0),
}
}
}