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/event.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/event.rs')
-rw-r--r-- | futures/src/event.rs | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/futures/src/event.rs b/futures/src/event.rs new file mode 100644 index 00000000..214d2d40 --- /dev/null +++ b/futures/src/event.rs @@ -0,0 +1,59 @@ +//! Listen to runtime events. +use crate::core::event::{self, Event}; +use crate::core::window; +use crate::subscription::{self, Subscription}; +use crate::MaybeSend; + +/// Returns a [`Subscription`] to all the ignored runtime events. +/// +/// This subscription will notify your application of any [`Event`] that was +/// not captured by any widget. +pub fn listen() -> Subscription<Event> { + listen_with(|event, status| match status { + event::Status::Ignored => Some(event), + event::Status::Captured => None, + }) +} + +/// Creates a [`Subscription`] that listens and filters all the runtime events +/// with the provided function, producing messages accordingly. +/// +/// This subscription will call the provided function for every [`Event`] +/// handled by the runtime. If the function: +/// +/// - Returns `None`, the [`Event`] will be discarded. +/// - Returns `Some` message, the `Message` will be produced. +pub fn listen_with<Message>( + f: fn(Event, event::Status) -> Option<Message>, +) -> Subscription<Message> +where + Message: 'static + MaybeSend, +{ + #[derive(Hash)] + struct EventsWith; + + subscription::filter_map( + (EventsWith, f), + move |event, status| match event { + Event::Window(window::Event::RedrawRequested(_)) => None, + _ => f(event, status), + }, + ) +} + +/// Creates a [`Subscription`] that produces a message for every runtime event, +/// including the redraw request events. +/// +/// **Warning:** This [`Subscription`], if unfiltered, may produce messages in +/// an infinite loop. +pub fn listen_raw<Message>( + f: fn(Event, event::Status) -> Option<Message>, +) -> Subscription<Message> +where + Message: 'static + MaybeSend, +{ + #[derive(Hash)] + struct RawEvents; + + subscription::filter_map((RawEvents, f), f) +} |