diff options
author | 2023-09-07 03:10:57 +0200 | |
---|---|---|
committer | 2023-09-07 03:10:57 +0200 | |
commit | c8fed143eb14d790da0592c5e24c741f6fda101e (patch) | |
tree | cf7f002d1ac7e2a8c036f1d420238d69ab45407b /futures/src/keyboard.rs | |
parent | a56b25b9096d47ada3c4349f5b91110dfaa92bf6 (diff) | |
parent | d21f0698b505d699c44e9414f902dbeca9474e39 (diff) | |
download | iced-c8fed143eb14d790da0592c5e24c741f6fda101e.tar.gz iced-c8fed143eb14d790da0592c5e24c741f6fda101e.tar.bz2 iced-c8fed143eb14d790da0592c5e24c741f6fda101e.zip |
Merge pull request #2073 from iced-rs/event-helpers
Add `keyboard` subscriptions and rename `subscription::events` to `event::listen`
Diffstat (limited to 'futures/src/keyboard.rs')
-rw-r--r-- | futures/src/keyboard.rs | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/futures/src/keyboard.rs b/futures/src/keyboard.rs new file mode 100644 index 00000000..af68e1f2 --- /dev/null +++ b/futures/src/keyboard.rs @@ -0,0 +1,61 @@ +//! Listen to keyboard events. +use crate::core; +use crate::core::keyboard::{Event, KeyCode, Modifiers}; +use crate::subscription::{self, Subscription}; +use crate::MaybeSend; + +/// Listens to keyboard key presses and calls the given function +/// map them into actual messages. +/// +/// If the function returns `None`, the key press will be simply +/// ignored. +pub fn on_key_press<Message>( + f: fn(KeyCode, Modifiers) -> Option<Message>, +) -> Subscription<Message> +where + Message: MaybeSend + 'static, +{ + #[derive(Hash)] + struct OnKeyPress; + + subscription::filter_map((OnKeyPress, f), move |event, status| { + match (event, status) { + ( + core::Event::Keyboard(Event::KeyPressed { + key_code, + modifiers, + }), + core::event::Status::Ignored, + ) => f(key_code, modifiers), + _ => None, + } + }) +} + +/// Listens to keyboard key releases and calls the given function +/// map them into actual messages. +/// +/// If the function returns `None`, the key release will be simply +/// ignored. +pub fn on_key_release<Message>( + f: fn(KeyCode, Modifiers) -> Option<Message>, +) -> Subscription<Message> +where + Message: MaybeSend + 'static, +{ + #[derive(Hash)] + struct OnKeyRelease; + + subscription::filter_map((OnKeyRelease, f), move |event, status| { + match (event, status) { + ( + core::Event::Keyboard(Event::KeyReleased { + key_code, + modifiers, + }), + core::event::Status::Ignored, + ) => f(key_code, modifiers), + _ => None, + } + }) +} |