use serde::{Deserialize, Serialize};
use super::category::Category;
use super::key_combo::KeyCombo;
#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Action {
None,
LeftClick,
RightClick,
MiddleClick,
MouseBack,
MouseForward,
Copy,
Paste,
Cut,
Undo,
Redo,
SelectAll,
Find,
Save,
BrowserBack,
BrowserForward,
NewTab,
CloseTab,
ReopenTab,
NextTab,
PrevTab,
ReloadPage,
MissionControl,
AppExpose,
PreviousDesktop,
NextDesktop,
ShowDesktop,
LaunchpadShow,
LockScreen,
Screenshot,
CaptureRegion,
PlayPause,
NextTrack,
PrevTrack,
VolumeUp,
VolumeDown,
MuteVolume,
CycleDpiPresets,
SetDpiPreset(u8),
ToggleSmartShift,
ScrollUp,
ScrollDown,
HorizontalScrollLeft,
HorizontalScrollRight,
CustomShortcut(KeyCombo),
Sleep,
TypeText(String),
RunAppleScript(String),
RunShellCommand(String),
Workflow(Vec<WorkflowStep>),
}
#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum WorkflowStep {
TypeText(String),
PressKey(KeyCombo),
Delay {
millis: u64,
},
RunAppleScript(String),
RunShellCommand(String),
}
impl Action {
#[must_use]
pub fn label(&self) -> String {
match self {
Action::None => "Do Nothing".into(),
Action::LeftClick => "Left Click".into(),
Action::RightClick => "Right Click".into(),
Action::MiddleClick => "Middle Click".into(),
Action::MouseBack => "Back (Button 4)".into(),
Action::MouseForward => "Forward (Button 5)".into(),
Action::Copy => "Copy".into(),
Action::Paste => "Paste".into(),
Action::Cut => "Cut".into(),
Action::Undo => "Undo".into(),
Action::Redo => "Redo".into(),
Action::SelectAll => "Select All".into(),
Action::Find => "Find".into(),
Action::Save => "Save".into(),
Action::BrowserBack => "Browser Back".into(),
Action::BrowserForward => "Browser Forward".into(),
Action::NewTab => "New Tab".into(),
Action::CloseTab => "Close Tab".into(),
Action::ReopenTab => "Reopen Tab".into(),
Action::NextTab => "Next Tab".into(),
Action::PrevTab => "Previous Tab".into(),
Action::ReloadPage => "Reload Page".into(),
Action::MissionControl => "Mission Control".into(),
Action::AppExpose => "App Exposé".into(),
Action::PreviousDesktop => "Previous Desktop".into(),
Action::NextDesktop => "Next Desktop".into(),
Action::ShowDesktop => "Show Desktop".into(),
Action::LaunchpadShow => "Launchpad".into(),
Action::LockScreen => "Lock Screen".into(),
Action::Screenshot => "Screenshot".into(),
Action::CaptureRegion => "Capture Region".into(),
Action::PlayPause => "Play / Pause".into(),
Action::NextTrack => "Next Track".into(),
Action::PrevTrack => "Previous Track".into(),
Action::VolumeUp => "Volume Up".into(),
Action::VolumeDown => "Volume Down".into(),
Action::MuteVolume => "Mute".into(),
Action::CycleDpiPresets => "Cycle DPI Presets".into(),
Action::SetDpiPreset(i) => format!("DPI Preset {}", i + 1),
Action::ToggleSmartShift => "Toggle SmartShift".into(),
Action::ScrollUp => "Scroll Up".into(),
Action::ScrollDown => "Scroll Down".into(),
Action::HorizontalScrollLeft => "Scroll Left".into(),
Action::HorizontalScrollRight => "Scroll Right".into(),
Action::CustomShortcut(combo) => combo.rendered_label(),
Action::Sleep => "Sleep".into(),
Action::TypeText(s) => format!("Type \"{s}\""),
Action::RunAppleScript(_) => "Run AppleScript".into(),
Action::RunShellCommand(_) => "Run Command".into(),
Action::Workflow(steps) => format!("Workflow ({} steps)", steps.len()),
}
}
#[must_use]
pub fn category(&self) -> Category {
match self {
Action::LeftClick
| Action::RightClick
| Action::MiddleClick
| Action::MouseBack
| Action::MouseForward => Category::Mouse,
Action::Copy
| Action::Paste
| Action::Cut
| Action::Undo
| Action::Redo
| Action::SelectAll
| Action::Find
| Action::Save
| Action::CustomShortcut(_)
| Action::TypeText(_)
| Action::RunAppleScript(_)
| Action::RunShellCommand(_)
| Action::Workflow(_) => Category::Editing,
Action::BrowserBack
| Action::BrowserForward
| Action::NewTab
| Action::CloseTab
| Action::ReopenTab
| Action::NextTab
| Action::PrevTab
| Action::ReloadPage => Category::Browser,
Action::MissionControl
| Action::AppExpose
| Action::PreviousDesktop
| Action::NextDesktop
| Action::ShowDesktop
| Action::LaunchpadShow => Category::Navigation,
Action::None
| Action::LockScreen
| Action::Screenshot
| Action::CaptureRegion
| Action::Sleep => Category::System,
Action::PlayPause
| Action::NextTrack
| Action::PrevTrack
| Action::VolumeUp
| Action::VolumeDown
| Action::MuteVolume => Category::Media,
Action::CycleDpiPresets | Action::SetDpiPreset(_) | Action::ToggleSmartShift => {
Category::Dpi
}
Action::ScrollUp
| Action::ScrollDown
| Action::HorizontalScrollLeft
| Action::HorizontalScrollRight => Category::Scroll,
}
}
#[must_use]
pub fn catalog() -> Vec<Action> {
vec![
Action::LeftClick,
Action::RightClick,
Action::MiddleClick,
Action::MouseBack,
Action::MouseForward,
Action::Copy,
Action::Paste,
Action::Cut,
Action::Undo,
Action::Redo,
Action::SelectAll,
Action::Find,
Action::Save,
Action::BrowserBack,
Action::BrowserForward,
Action::NewTab,
Action::CloseTab,
Action::ReopenTab,
Action::NextTab,
Action::PrevTab,
Action::ReloadPage,
Action::MissionControl,
Action::AppExpose,
Action::PreviousDesktop,
Action::NextDesktop,
Action::ShowDesktop,
Action::LaunchpadShow,
Action::None,
Action::LockScreen,
Action::Screenshot,
Action::CaptureRegion,
Action::Sleep,
Action::PlayPause,
Action::NextTrack,
Action::PrevTrack,
Action::VolumeUp,
Action::VolumeDown,
Action::MuteVolume,
Action::CycleDpiPresets,
Action::ToggleSmartShift,
Action::ScrollUp,
Action::ScrollDown,
Action::HorizontalScrollLeft,
Action::HorizontalScrollRight,
]
}
}