From e189c22bb09e471e8f899ef184d2a99e2e22c484 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez <hector0193@gmail.com> Date: Mon, 9 Dec 2019 22:39:28 +0100 Subject: Rename `clock` example to `events` --- examples/clock.rs | 135 ----------------------------------------------------- examples/events.rs | 129 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 129 insertions(+), 135 deletions(-) delete mode 100644 examples/clock.rs create mode 100644 examples/events.rs diff --git a/examples/clock.rs b/examples/clock.rs deleted file mode 100644 index f06762bd..00000000 --- a/examples/clock.rs +++ /dev/null @@ -1,135 +0,0 @@ -use iced::{ - Align, Application, Checkbox, Column, Command, Container, Element, Length, - Settings, Subscription, Text, -}; - -pub fn main() { - env_logger::init(); - - Clock::run(Settings::default()) -} - -#[derive(Debug)] -struct Clock { - time: chrono::DateTime<chrono::Local>, - enabled: bool, -} - -#[derive(Debug, Clone)] -enum Message { - Ticked(chrono::DateTime<chrono::Local>), - Toggled(bool), -} - -impl Application for Clock { - type Message = Message; - - fn new() -> (Clock, Command<Message>) { - ( - Clock { - time: chrono::Local::now(), - enabled: false, - }, - Command::none(), - ) - } - - fn title(&self) -> String { - String::from("Clock - Iced") - } - - fn update(&mut self, message: Message) -> Command<Message> { - match message { - Message::Ticked(time) => { - self.time = time; - } - Message::Toggled(enabled) => { - self.enabled = enabled; - } - }; - - Command::none() - } - - fn subscriptions(&self) -> Subscription<Message> { - if self.enabled { - time::every(std::time::Duration::from_millis(500), Message::Ticked) - } else { - Subscription::none() - } - } - - fn view(&mut self) -> Element<Message> { - let clock = Text::new(format!("{}", self.time.format("%H:%M:%S"))) - .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(clock) - .push(toggle); - - Container::new(content) - .width(Length::Fill) - .height(Length::Fill) - .center_x() - .center_y() - .into() - } -} - -mod time { - use std::sync::Arc; - - pub fn every<Message>( - duration: std::time::Duration, - f: impl Fn(chrono::DateTime<chrono::Local>) -> Message - + 'static - + Send - + Sync, - ) -> iced::Subscription<Message> - where - Message: Send + 'static, - { - Tick { - duration, - message: Arc::new(f), - } - .into() - } - - struct Tick<Message> { - duration: std::time::Duration, - message: Arc< - dyn Fn(chrono::DateTime<chrono::Local>) -> Message + Send + Sync, - >, - } - - impl<Message> iced_native::subscription::Connection for Tick<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.message.clone(); - - input.map(move |_| function(chrono::Local::now())).boxed() - } - } -} 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() + } + } +} -- cgit