diff options
author | 2019-12-09 22:39:28 +0100 | |
---|---|---|
committer | 2019-12-09 22:39:28 +0100 | |
commit | e189c22bb09e471e8f899ef184d2a99e2e22c484 (patch) | |
tree | cf5d7d5556186581d4eed3d70fbb3cf7c6d39131 /examples/events.rs | |
parent | 98160406f714728afe718f305bf9d12be1676b2d (diff) | |
download | iced-e189c22bb09e471e8f899ef184d2a99e2e22c484.tar.gz iced-e189c22bb09e471e8f899ef184d2a99e2e22c484.tar.bz2 iced-e189c22bb09e471e8f899ef184d2a99e2e22c484.zip |
Rename `clock` example to `events`
Diffstat (limited to 'examples/events.rs')
-rw-r--r-- | examples/events.rs | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/examples/events.rs b/examples/events.rs new file mode 100644 index 00000000..290aa975 --- /dev/null +++ b/examples/events.rs @@ -0,0 +1,129 @@ +use iced::{ + Align, Application, Checkbox, Column, Command, Container, Element, Length, + Settings, Subscription, Text, +}; + +pub fn main() { + env_logger::init(); + + Events::run(Settings::default()) +} + +#[derive(Debug, Default)] +struct Events { + last: Vec<iced_native::Event>, + enabled: bool, +} + +#[derive(Debug, Clone)] +enum Message { + EventOccurred(iced_native::Event), + Toggled(bool), +} + +impl Application for Events { + type Message = Message; + + fn new() -> (Events, Command<Message>) { + (Events::default(), Command::none()) + } + + fn title(&self) -> String { + String::from("Events - Iced") + } + + fn update(&mut self, message: Message) -> Command<Message> { + match message { + Message::EventOccurred(event) => { + self.last.push(event); + + if self.last.len() > 5 { + let _ = self.last.remove(0); + } + } + Message::Toggled(enabled) => { + self.enabled = enabled; + } + }; + + Command::none() + } + + fn subscriptions(&self) -> Subscription<Message> { + if self.enabled { + events::all(Message::EventOccurred) + } else { + Subscription::none() + } + } + + fn view(&mut self) -> Element<Message> { + let events = self.last.iter().fold( + Column::new().width(Length::Shrink).spacing(10), + |column, event| { + column.push( + Text::new(format!("{:?}", event)) + .size(40) + .width(Length::Shrink), + ) + }, + ); + + let toggle = Checkbox::new(self.enabled, "Enabled", Message::Toggled) + .width(Length::Shrink); + + let content = Column::new() + .width(Length::Shrink) + .align_items(Align::Center) + .spacing(20) + .push(events) + .push(toggle); + + Container::new(content) + .width(Length::Fill) + .height(Length::Fill) + .center_x() + .center_y() + .into() + } +} + +mod events { + use std::sync::Arc; + + pub fn all<Message>( + f: impl Fn(iced_native::Event) -> Message + 'static + Send + Sync, + ) -> iced::Subscription<Message> + where + Message: Send + 'static, + { + All(Arc::new(f)).into() + } + + struct All<Message>( + Arc<dyn Fn(iced_native::Event) -> Message + Send + Sync>, + ); + + impl<Message> iced_native::subscription::Connection for All<Message> + where + Message: 'static, + { + type Input = iced_native::subscription::Input; + type Output = Message; + + fn id(&self) -> u64 { + 0 + } + + fn stream( + &self, + input: iced_native::subscription::Input, + ) -> futures::stream::BoxStream<'static, Message> { + use futures::StreamExt; + + let function = self.0.clone(); + + input.map(move |event| function(event)).boxed() + } + } +} |