use crate::key::KeyMod;
use std::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MouseButton {
MouseNone = 0,
MouseLeft = 1,
MouseMiddle = 2,
MouseRight = 3,
MouseWheelUp = 4,
MouseWheelDown = 5,
MouseWheelLeft = 6,
MouseWheelRight = 7,
MouseBackward = 8,
MouseForward = 9,
MouseButton10 = 10,
MouseButton11 = 11,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Mouse {
pub x: usize,
pub y: usize,
pub button: MouseButton,
pub mod_keys: KeyMod,
}
impl fmt::Display for Mouse {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "({};{}) {:?}", self.x, self.y, self.button)
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct MouseClickMsg(pub Mouse);
impl fmt::Display for MouseClickMsg {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.0)
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct MouseReleaseMsg(pub Mouse);
impl fmt::Display for MouseReleaseMsg {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.0)
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct MouseWheelMsg(pub Mouse);
impl fmt::Display for MouseWheelMsg {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.0)
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct MouseMotionMsg(pub Mouse);
impl fmt::Display for MouseMotionMsg {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if self.0.button != MouseButton::MouseNone {
write!(f, "{}+motion", self.0)
} else {
write!(f, "{} motion", self.0)
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum MouseMsg {
Click(MouseClickMsg),
Release(MouseReleaseMsg),
Wheel(MouseWheelMsg),
Motion(MouseMotionMsg),
}
impl MouseMsg {
pub fn mouse(&self) -> &Mouse {
match self {
MouseMsg::Click(m) => &m.0,
MouseMsg::Release(m) => &m.0,
MouseMsg::Wheel(m) => &m.0,
MouseMsg::Motion(m) => &m.0,
}
}
}
impl fmt::Display for MouseMsg {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.mouse())
}
}