use bitmask_enum::bitmask;
macro_rules! mouse_btn_confusion_doc {
() => {
r#"
# WARNING
The order relation for [`MouseButtonId::Auxiliary`] and [`MouseButtonId::RightOrSecondary`]
is reversed for [`MouseButtonsBitmask::Auxiliary`] and [`MouseButtonsBitmask::RightOrSecondary`].
This behavior is preserved for compatibility with the
[`MouseEvent`](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent) API."#
};
}
#[doc = mouse_btn_confusion_doc!()]
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub struct MouseButtonId(pub i16);
#[allow(non_upper_case_globals)]
impl MouseButtonId {
pub const LeftOrPrimary: Self = Self(0);
pub const RightOrSecondary: Self = Self(2);
pub const Auxiliary: Self = Self(1);
pub const BrowserBackOr4th: Self = Self(3);
pub const BrowserForwardOr5th: Self = Self(4);
}
#[doc = mouse_btn_confusion_doc!()]
#[bitmask(u16)]
pub enum MouseButtonsBitmask {
LeftOrPrimary,
RightOrSecondary,
Auxiliary,
BrowserBackOr4th,
BrowserForwardOr5th,
}
impl MouseButtonsBitmask {
pub fn new(buttons: u16) -> Self {
MouseButtonsBitmask { bits: buttons }
}
}
pub trait MouseEventExt {
fn buttons_mask(&self) -> MouseButtonsBitmask;
fn button_id(&self) -> MouseButtonId;
}
#[cfg(any(feature = "web-sys", doc))]
impl MouseEventExt for web_sys::MouseEvent {
fn buttons_mask(&self) -> MouseButtonsBitmask {
MouseButtonsBitmask::new(self.buttons())
}
fn button_id(&self) -> MouseButtonId {
MouseButtonId(self.button())
}
}
pub trait MouseButtonEventHandler {
fn handle_mousedown(&self);
fn handle_mouseup(&self);
fn handle_click(&self);
fn handle_dblclick(&self);
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn weird_behavior_is_preserved() {
assert!(MouseButtonsBitmask::Auxiliary.bits() == 4);
assert!(MouseButtonsBitmask::RightOrSecondary.bits() == 2);
assert!(MouseButtonsBitmask::Auxiliary.bits() > MouseButtonsBitmask::RightOrSecondary.bits());
assert!(MouseButtonId::Auxiliary.0 == 1);
assert!(MouseButtonId::RightOrSecondary.0 == 2);
assert!(MouseButtonId::Auxiliary < MouseButtonId::RightOrSecondary);
}
}