use serde::{Deserialize, Serialize};
use super::key::Modifiers;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum MouseButton {
Left,
Right,
Middle,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ClickKind {
Down,
Up,
Drag,
Moved,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub struct ClickEvent {
#[serde(skip_serializing_if = "Option::is_none")]
pub button: Option<MouseButton>,
pub kind: ClickKind,
pub column: u16,
pub row: u16,
#[serde(default, skip_serializing_if = "Modifiers::is_empty")]
pub modifiers: Modifiers,
}
impl ClickEvent {
#[must_use]
pub const fn new(button: MouseButton, kind: ClickKind, column: u16, row: u16) -> Self {
Self {
button: Some(button),
kind,
column,
row,
modifiers: Modifiers::NONE,
}
}
#[must_use]
pub const fn moved(column: u16, row: u16) -> Self {
Self {
button: None,
kind: ClickKind::Moved,
column,
row,
modifiers: Modifiers::NONE,
}
}
#[must_use]
pub const fn drag(button: MouseButton, column: u16, row: u16) -> Self {
Self {
button: Some(button),
kind: ClickKind::Drag,
column,
row,
modifiers: Modifiers::NONE,
}
}
#[must_use]
pub const fn is_down(&self) -> bool {
matches!(self.kind, ClickKind::Down)
}
#[must_use]
pub const fn is_up(&self) -> bool {
matches!(self.kind, ClickKind::Up)
}
#[must_use]
pub const fn is_drag(&self) -> bool {
matches!(self.kind, ClickKind::Drag)
}
#[must_use]
pub const fn is_moved(&self) -> bool {
matches!(self.kind, ClickKind::Moved)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ScrollDirection {
Up,
Down,
Left,
Right,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub struct ScrollEvent {
pub direction: ScrollDirection,
pub column: u16,
pub row: u16,
#[serde(default, skip_serializing_if = "Modifiers::is_empty")]
pub modifiers: Modifiers,
}
impl ScrollEvent {
#[must_use]
pub const fn new(direction: ScrollDirection, column: u16, row: u16) -> Self {
Self {
direction,
column,
row,
modifiers: Modifiers::NONE,
}
}
}
#[cfg(test)]
#[path = "mouse_tests.rs"]
mod tests;