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