diff --git a/src/demos/mod.rs b/src/demos/mod.rs index baa05a6..f832b29 100644 --- a/src/demos/mod.rs +++ b/src/demos/mod.rs @@ -1,6 +1,8 @@ +use std::sync::Arc; + use osui::prelude::*; -pub fn app() -> Rsx { +pub fn app(screen: Arc) -> Rsx { let count = use_state(0); std::thread::spawn({ @@ -12,9 +14,11 @@ pub fn app() -> Rsx { }); rsx! { - @Handler::new(|_, _: &crossterm::event::Event| { - panic!("idk lol"); - }); + @Handler::new({ + let screen = screen.clone(); + move |_, _: &crossterm::event::Event| { + screen.close(); + }}); FlexRow { FlexCol { @Transform::new().padding(2, 2); diff --git a/src/extensions/input_handling.rs b/src/extensions/input_handling.rs index 76a9792..399bc0f 100644 --- a/src/extensions/input_handling.rs +++ b/src/extensions/input_handling.rs @@ -15,6 +15,10 @@ impl Extension for InputExtension { } }); } + + fn on_close(&mut self, _screen: std::sync::Arc) { + crossterm::terminal::disable_raw_mode().unwrap(); + } } impl crate::extensions::Event for crossterm::event::Event { diff --git a/src/extensions/mod.rs b/src/extensions/mod.rs index b9bbb15..a2d98f6 100644 --- a/src/extensions/mod.rs +++ b/src/extensions/mod.rs @@ -22,6 +22,7 @@ use crate::{ pub trait Extension { fn init(&mut self, _screen: Arc) {} + fn on_close(&mut self, _screen: Arc) {} fn render_widget(&mut self, _scope: &mut RenderScope, _widget: &Arc) {} } diff --git a/src/lib.rs b/src/lib.rs index 4182f4c..1d43782 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -75,6 +75,8 @@ pub struct Screen { pub widgets: Mutex>>, /// Registered extensions for the screen. extensions: Mutex>>>>, + /// If it's still running + running: Mutex, } event!(RenderWrapperEvent(*mut RenderScope)); @@ -99,6 +101,7 @@ impl Screen { Arc::new(Self { widgets: Mutex::new(Vec::new()), extensions: Mutex::new(Vec::new()), + running: Mutex::new(true), }) } @@ -159,10 +162,12 @@ impl Screen { utils::hide_cursor()?; - loop { + while *self.running.lock().unwrap() { self.render()?; std::thread::sleep(std::time::Duration::from_millis(28)); } + + Ok(()) } /// Renders all widgets and applies extensions. @@ -213,4 +218,17 @@ impl Screen { } Ok(()) } + + /// Closes the loop and calls `on_close` in the extensions + pub fn close(self: &Arc) { + *self.running.lock().unwrap() = false; + + utils::show_cursor().unwrap(); + + utils::clear().unwrap(); + + for ext in self.extensions.lock().unwrap().iter() { + ext.lock().unwrap().on_close(self.clone()); + } + } } diff --git a/src/main.rs b/src/main.rs index 66c252a..d6cfd88 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,7 +5,7 @@ fn main() -> std::io::Result<()> { let screen = Screen::new(); screen.extension(InputExtension); - demos::app().draw(&screen); + demos::app(screen.clone()).draw(&screen); screen.run() }