From 5a3c0db50da731ddbeefc5bb91697e0c87dbe2da Mon Sep 17 00:00:00 2001
From: MrGVSV <gino.valente.code@gmail.com>
Date: Sun, 19 Dec 2021 15:05:36 -0800
Subject: [PATCH] Added convenience method for sending events

---
 examples/text_box.rs          | 4 ++--
 kayak_core/src/event.rs       | 8 ++++++++
 kayak_widgets/src/text_box.rs | 8 +++-----
 3 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/examples/text_box.rs b/examples/text_box.rs
index 1cf61d2..0c2efca 100644
--- a/examples/text_box.rs
+++ b/examples/text_box.rs
@@ -25,12 +25,12 @@ fn TextBoxExample(context: &mut KayakContext) {
     };
 
     let cloned_value = value.clone();
-    let on_change = OnChange::new(move |event| {
+    let on_change = OnChange::new_handler(move |event| {
         cloned_value.set(event.value);
     });
 
     let cloned_value2 = value2.clone();
-    let on_change2 = OnChange::new(move |event| {
+    let on_change2 = OnChange::new_handler(move |event| {
         cloned_value2.set(event.value);
     });
 
diff --git a/kayak_core/src/event.rs b/kayak_core/src/event.rs
index daf64a3..cf0bcf5 100644
--- a/kayak_core/src/event.rs
+++ b/kayak_core/src/event.rs
@@ -49,9 +49,17 @@ pub struct ChangeEvent<T> {
 pub struct OnChange<T>(pub Arc<RwLock<dyn FnMut(ChangeEvent<T>) + Send + Sync + 'static>>);
 
 impl<T> OnChange<T> {
+    /// Create a new handler for a [ChangeEvent]
     pub fn new<F: FnMut(ChangeEvent<T>) + Send + Sync + 'static>(f: F) -> Self {
         Self(Arc::new(RwLock::new(f)))
     }
+
+    /// Send the given event to be handled by the current handler
+    pub fn send(&self, event: ChangeEvent<T>) {
+        if let Ok(mut on_change) = self.0.write() {
+            on_change(event);
+        }
+    }
 }
 
 impl<T> PartialEq for OnChange<T> {
diff --git a/kayak_widgets/src/text_box.rs b/kayak_widgets/src/text_box.rs
index 6a878f4..41a0903 100644
--- a/kayak_widgets/src/text_box.rs
+++ b/kayak_widgets/src/text_box.rs
@@ -47,11 +47,9 @@ pub fn TextBox(value: String, on_change: Option<OnChange<String>>) {
                 current_value.push(c);
             }
             if let Some(on_change) = cloned_on_change.as_ref() {
-                if let Ok(mut on_change) = on_change.0.write() {
-                    on_change(ChangeEvent {
-                        value: current_value.clone(),
-                    });
-                }
+                on_change.send(ChangeEvent {
+                    value: current_value.clone(),
+                });
             }
         }
         EventType::Focus => cloned_has_focus.set(Focus(true)),
-- 
GitLab