From ec6e2be2b4eaa00f290f191cd44db33cebcd8b65 Mon Sep 17 00:00:00 2001
From: StarArawn <toasterthegamer@gmail.com>
Date: Sat, 18 Dec 2021 08:18:29 -0500
Subject: [PATCH] Showoff how we use the use_state! macro.

---
 README.md             | 13 ++++---------
 examples/counter.rs   | 12 ++++--------
 kayak_core/src/lib.rs |  2 +-
 3 files changed, 9 insertions(+), 18 deletions(-)

diff --git a/README.md b/README.md
index e2dd0de..ff4d998 100644
--- a/README.md
+++ b/README.md
@@ -88,18 +88,13 @@ Widget's can create their own state and will re-render when that state changes.
 ```rust
 #[widget]
 fn Counter(context: &mut KayakContext) {
-    let count = context.create_state(0i32).unwrap();
-    // Since we move the variable into the closure we need to clone here.
-    // Similar cost to cloning an Arc
-    let cloned_count = count.clone();
-    let on_event = OnEvent::new(move |context, event| match event.event_type {
-        EventType::Click => {
-            cloned_count.set(cloned_count.get() + 1);
-        }
+    let (count, set_count) = use_state!(0i32);
+    let on_event = OnEvent::new(move |_, event| match event.event_type {
+        EventType::Click => set_count(count + 1),
         _ => {}
     });
 
-    let count_text = format!("Current Count: {}", count.get());
+    let count_text = format!("Current Count: {}", count);
     rsx! {
         <>
             <Window position={(50.0, 50.0)} size={(300.0, 300.0)} title={"Counter Example".to_string()}>
diff --git a/examples/counter.rs b/examples/counter.rs
index a443d5c..8df23d6 100644
--- a/examples/counter.rs
+++ b/examples/counter.rs
@@ -7,7 +7,7 @@ use kayak_ui::bevy::{BevyContext, BevyKayakUIPlugin, FontMapping, UICameraBundle
 use kayak_ui::core::{
     render, rsx,
     styles::{Style, StyleProp, Units},
-    widget, Bound, EventType, Index, MutableBound, OnEvent,
+    use_state, widget, Bound, EventType, Index, MutableBound, OnEvent,
 };
 use kayak_widgets::{App, Button, Text, Window};
 
@@ -33,20 +33,16 @@ fn Counter(context: &mut KayakContext) {
         ..Default::default()
     };
 
-    let count = context.create_state(0i32).unwrap();
-    let cloned_count = count.clone();
+    let (count, set_count) = use_state!(0i32);
     let on_event = OnEvent::new(move |_, event| match event.event_type {
-        EventType::Click => {
-            cloned_count.set(cloned_count.get() + 1);
-        }
+        EventType::Click => set_count(count + 1),
         _ => {}
     });
 
-    let count_value = count.get();
     rsx! {
         <>
             <Window position={(50.0, 50.0)} size={(300.0, 300.0)} title={"Counter Example".to_string()}>
-                <Text styles={Some(text_styles)} size={32.0} content={format!("Current Count: {}", count_value).to_string()}>{}</Text>
+                <Text styles={Some(text_styles)} size={32.0} content={format!("Current Count: {}", count).to_string()}>{}</Text>
                 <Button on_event={Some(on_event)}>
                     <Text styles={Some(button_text_styles)} size={24.0} content={"Count!".to_string()}>{}</Text>
                 </Button>
diff --git a/kayak_core/src/lib.rs b/kayak_core/src/lib.rs
index cee43bb..9fa9138 100644
--- a/kayak_core/src/lib.rs
+++ b/kayak_core/src/lib.rs
@@ -26,7 +26,7 @@ pub use event::*;
 pub use fragment::Fragment;
 pub use generational_arena::{Arena, Index};
 pub use input_event::*;
-pub use kayak_render_macros::{constructor, render, rsx, widget};
+pub use kayak_render_macros::{constructor, render, rsx, use_state, widget};
 pub use keys::KeyCode;
 pub use resources::Resources;
 pub use tree::{Tree, WidgetTree};
-- 
GitLab