use super::ModifierKey;
use crate::display;
use std::fmt;
#[derive(Debug)]
pub struct KeyboardShortcut {
key: String,
modifiers: Vec<ModifierKey>,
}
impl KeyboardShortcut {
pub fn new(key: impl AsRef<str>) -> Self {
Self {
key: key.as_ref().to_owned(),
modifiers: Vec::new(),
}
}
pub fn builder(key: impl AsRef<str>) -> KeyboardShortcutBuilder {
KeyboardShortcutBuilder::new(key)
}
pub fn with_modifiers(key: impl AsRef<str>, modifiers: &[ModifierKey]) -> Self {
Self::builder(key).modifiers(modifiers).build()
}
pub fn with_alt(key: impl AsRef<str>) -> Self {
Self::builder(key).alt_key().build()
}
pub fn with_ctrl(key: impl AsRef<str>) -> Self {
Self::builder(key).ctrl_key().build()
}
pub fn with_ctrl_meta(key: impl AsRef<str>) -> Self {
Self::builder(key)
.modifiers(&[ModifierKey::CtrlKey, ModifierKey::MetaKey])
.build()
}
pub fn with_ctrl_shift(key: impl AsRef<str>) -> Self {
Self::builder(key)
.modifiers(&[ModifierKey::CtrlKey, ModifierKey::ShiftKey])
.build()
}
pub fn with_meta(key: impl AsRef<str>) -> Self {
Self::builder(key).meta_key().build()
}
pub fn with_shift(key: impl AsRef<str>) -> Self {
Self::builder(key).shift_key().build()
}
pub fn with_shift_alt(key: impl AsRef<str>) -> Self {
Self::builder(key)
.modifiers(&[ModifierKey::ShiftKey, ModifierKey::AltKey])
.build()
}
pub fn with_shift_meta(key: impl AsRef<str>) -> Self {
Self::builder(key)
.modifiers(&[ModifierKey::ShiftKey, ModifierKey::MetaKey])
.build()
}
pub fn key(&self) -> &str {
&self.key
}
pub fn modifiers(&self) -> &[ModifierKey] {
self.modifiers.as_slice()
}
}
impl fmt::Display for KeyboardShortcut {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", display::keyboard(&self.key, &self.modifiers))
}
}
#[derive(Debug)]
pub struct KeyboardShortcutBuilder {
key: String,
modifiers: Vec<ModifierKey>,
}
impl KeyboardShortcutBuilder {
pub fn new(key: impl AsRef<str>) -> Self {
Self {
key: key.as_ref().to_owned(),
modifiers: Vec::new(),
}
}
#[must_use]
pub fn modifier(mut self, modifier: ModifierKey) -> Self {
self.modifiers.push(modifier);
self
}
#[must_use]
pub fn modifiers(mut self, modifiers: &[ModifierKey]) -> Self {
self.modifiers.extend_from_slice(modifiers);
self
}
#[must_use]
pub fn alt_key(mut self) -> Self {
self.modifiers.push(ModifierKey::AltKey);
self
}
#[must_use]
pub fn ctrl_key(mut self) -> Self {
self.modifiers.push(ModifierKey::CtrlKey);
self
}
#[must_use]
pub fn meta_key(mut self) -> Self {
self.modifiers.push(ModifierKey::MetaKey);
self
}
#[must_use]
pub fn shift_key(mut self) -> Self {
self.modifiers.push(ModifierKey::ShiftKey);
self
}
pub fn build(self) -> KeyboardShortcut {
KeyboardShortcut {
key: self.key,
modifiers: self.modifiers,
}
}
}