diff --git a/src/app/tile.rs b/src/app/tile.rs index fc31d80..85547a3 100644 --- a/src/app/tile.rs +++ b/src/app/tile.rs @@ -98,6 +98,7 @@ pub struct Tile { pub config: Config, /// The opening hotkey hotkey: HotKey, + clipboard_hotkey: Option, clipboard_content: Vec, tray_icon: Option, sender: Option, diff --git a/src/app/tile/elm.rs b/src/app/tile/elm.rs index df952f4..80af3c5 100644 --- a/src/app/tile/elm.rs +++ b/src/app/tile/elm.rs @@ -73,6 +73,10 @@ pub fn new(hotkey: HotKey, config: &Config) -> (Tile, Task) { emoji_apps: AppIndex::from_apps(App::emoji_apps()), hotkey, visible: true, + clipboard_hotkey: config + .clipboard_hotkey + .clone() + .and_then(|x| x.parse::().ok()), frontmost: None, focused: false, config: config.clone(), diff --git a/src/app/tile/update.rs b/src/app/tile/update.rs index e6095cb..3b90982 100644 --- a/src/app/tile/update.rs +++ b/src/app/tile/update.rs @@ -199,29 +199,39 @@ pub fn handle_update(tile: &mut Tile, message: Message) -> Task { } Message::KeyPressed(hk_id) => { - if hk_id == tile.hotkey.id { + let is_clipboard_hotkey = tile + .clipboard_hotkey + .map(|hotkey| hotkey.id == hk_id) + .unwrap_or(true); + let is_open_hotkey = hk_id == tile.hotkey.id; + + let clipboard_page_task = if is_clipboard_hotkey { + Task::done(Message::SwitchToPage(Page::ClipboardHistory)) + } else if is_open_hotkey { + Task::done(Message::SwitchToPage(Page::Main)) + } else { + Task::none() + }; + + if is_open_hotkey || is_clipboard_hotkey { + if !tile.visible { + return Task::batch([open_window(), clipboard_page_task]); + } + tile.visible = !tile.visible; - if tile.visible { - Task::chain( - window::open(default_settings()) - .1 - .map(|_| Message::OpenWindow), - operation::focus("query"), - ) + + let clear_search_query = if tile.config.buffer_rules.clear_on_hide { + Task::done(Message::ClearSearchQuery) } else { - let clear_search_query = if tile.config.buffer_rules.clear_on_hide { - Task::done(Message::ClearSearchQuery) - } else { - Task::none() - }; - - let to_close = window::latest().map(|x| x.unwrap()); - Task::batch([ - to_close.map(Message::HideWindow), - clear_search_query, - Task::done(Message::ReturnFocus), - ]) - } + Task::none() + }; + + let to_close = window::latest().map(|x| x.unwrap()); + Task::batch([ + to_close.map(Message::HideWindow), + clear_search_query, + Task::done(Message::ReturnFocus), + ]) } else { Task::none() } @@ -478,3 +488,12 @@ pub fn handle_update(tile: &mut Tile, message: Message) -> Task { } } } + +fn open_window() -> Task { + Task::chain( + window::open(default_settings()) + .1 + .map(|_| Message::OpenWindow), + operation::focus("query"), + ) +} diff --git a/src/config.rs b/src/config.rs index 5fa79e5..c25f5b6 100644 --- a/src/config.rs +++ b/src/config.rs @@ -15,6 +15,7 @@ use crate::{ #[serde(default)] pub struct Config { pub toggle_hotkey: String, + pub clipboard_hotkey: Option, pub buffer_rules: Buffer, pub theme: Theme, pub placeholder: String, @@ -29,6 +30,7 @@ impl Default for Config { fn default() -> Self { Self { toggle_hotkey: "ALT+SPACE".to_string(), + clipboard_hotkey: None, buffer_rules: Buffer::default(), theme: Theme::default(), placeholder: String::from("Time to be productive!"), diff --git a/src/main.rs b/src/main.rs index 7a74dac..792367f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -44,8 +44,13 @@ fn main() -> iced::Result { let show_hide = config.toggle_hotkey.parse().unwrap(); - // Hotkeys are stored as a vec so that hyperkey support can be added later - let hotkeys = vec![show_hide]; + let mut hotkeys = vec![show_hide]; + + if let Some(show_clipboard) = &config.clipboard_hotkey + && let Some(cb_page_hk) = show_clipboard.parse().ok() + { + hotkeys.push(cb_page_hk); + } manager .register_all(&hotkeys)