|
| 1 | +use anyhow::{bail, Result}; |
| 2 | +use bitflags::bitflags; |
| 3 | +use crossterm::event::MouseEventKind; |
| 4 | +use serde::{Deserialize, Serialize}; |
| 5 | + |
| 6 | +bitflags! { |
| 7 | + #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Deserialize, Serialize)] |
| 8 | + #[serde(try_from = "Vec<String>", into = "Vec<String>")] |
| 9 | + pub struct MouseEvents: u8 { |
| 10 | + const CLICK = 0b00001; |
| 11 | + const SCROLL = 0b00010; |
| 12 | + const TOUCH = 0b00100; |
| 13 | + const MOVE = 0b01000; |
| 14 | + const DRAG = 0b10000; |
| 15 | + } |
| 16 | +} |
| 17 | + |
| 18 | +impl MouseEvents { |
| 19 | + #[inline] |
| 20 | + pub const fn draggable(self) -> bool { self.contains(Self::DRAG) } |
| 21 | +} |
| 22 | + |
| 23 | +impl TryFrom<Vec<String>> for MouseEvents { |
| 24 | + type Error = anyhow::Error; |
| 25 | + |
| 26 | + fn try_from(value: Vec<String>) -> Result<Self, Self::Error> { |
| 27 | + value.into_iter().try_fold(Self::empty(), |aac, s| { |
| 28 | + Ok(match s.as_str() { |
| 29 | + "click" => aac | Self::CLICK, |
| 30 | + "scroll" => aac | Self::SCROLL, |
| 31 | + "touch" => aac | Self::TOUCH, |
| 32 | + "move" => aac | Self::MOVE, |
| 33 | + "drag" => aac | Self::DRAG, |
| 34 | + _ => bail!("Invalid mouse event: {s}"), |
| 35 | + }) |
| 36 | + }) |
| 37 | + } |
| 38 | +} |
| 39 | + |
| 40 | +impl From<MouseEvents> for Vec<String> { |
| 41 | + fn from(value: MouseEvents) -> Self { |
| 42 | + let events = [ |
| 43 | + (MouseEvents::CLICK, "click"), |
| 44 | + (MouseEvents::SCROLL, "scroll"), |
| 45 | + (MouseEvents::TOUCH, "touch"), |
| 46 | + (MouseEvents::MOVE, "move"), |
| 47 | + (MouseEvents::DRAG, "drag"), |
| 48 | + ]; |
| 49 | + events.into_iter().filter(|v| value.contains(v.0)).map(|v| v.1.to_owned()).collect() |
| 50 | + } |
| 51 | +} |
| 52 | + |
| 53 | +impl From<crossterm::event::MouseEventKind> for MouseEvents { |
| 54 | + fn from(value: crossterm::event::MouseEventKind) -> Self { |
| 55 | + match value { |
| 56 | + MouseEventKind::Down(_) | MouseEventKind::Up(_) => Self::CLICK, |
| 57 | + MouseEventKind::ScrollDown | MouseEventKind::ScrollUp => Self::SCROLL, |
| 58 | + MouseEventKind::ScrollLeft | MouseEventKind::ScrollRight => Self::TOUCH, |
| 59 | + MouseEventKind::Moved => Self::MOVE, |
| 60 | + MouseEventKind::Drag(_) => Self::DRAG, |
| 61 | + } |
| 62 | + } |
| 63 | +} |
0 commit comments