Added a close function #18

This commit is contained in:
2025-08-02 06:58:13 -05:00
parent 911968a1cb
commit 34b5799644
5 changed files with 33 additions and 6 deletions
+8 -4
View File
@@ -1,6 +1,8 @@
use std::sync::Arc;
use osui::prelude::*; use osui::prelude::*;
pub fn app() -> Rsx { pub fn app(screen: Arc<Screen>) -> Rsx {
let count = use_state(0); let count = use_state(0);
std::thread::spawn({ std::thread::spawn({
@@ -12,9 +14,11 @@ pub fn app() -> Rsx {
}); });
rsx! { rsx! {
@Handler::new(|_, _: &crossterm::event::Event| { @Handler::new({
panic!("idk lol"); let screen = screen.clone();
}); move |_, _: &crossterm::event::Event| {
screen.close();
}});
FlexRow { FlexRow {
FlexCol { FlexCol {
@Transform::new().padding(2, 2); @Transform::new().padding(2, 2);
+4
View File
@@ -15,6 +15,10 @@ impl Extension for InputExtension {
} }
}); });
} }
fn on_close(&mut self, _screen: std::sync::Arc<crate::Screen>) {
crossterm::terminal::disable_raw_mode().unwrap();
}
} }
impl crate::extensions::Event for crossterm::event::Event { impl crate::extensions::Event for crossterm::event::Event {
+1
View File
@@ -22,6 +22,7 @@ use crate::{
pub trait Extension { pub trait Extension {
fn init(&mut self, _screen: Arc<Screen>) {} fn init(&mut self, _screen: Arc<Screen>) {}
fn on_close(&mut self, _screen: Arc<Screen>) {}
fn render_widget(&mut self, _scope: &mut RenderScope, _widget: &Arc<Widget>) {} fn render_widget(&mut self, _scope: &mut RenderScope, _widget: &Arc<Widget>) {}
} }
+19 -1
View File
@@ -75,6 +75,8 @@ pub struct Screen {
pub widgets: Mutex<Vec<Arc<Widget>>>, pub widgets: Mutex<Vec<Arc<Widget>>>,
/// Registered extensions for the screen. /// Registered extensions for the screen.
extensions: Mutex<Vec<Arc<Mutex<Box<dyn Extension + Send + Sync>>>>>, extensions: Mutex<Vec<Arc<Mutex<Box<dyn Extension + Send + Sync>>>>>,
/// If it's still running
running: Mutex<bool>,
} }
event!(RenderWrapperEvent(*mut RenderScope)); event!(RenderWrapperEvent(*mut RenderScope));
@@ -99,6 +101,7 @@ impl Screen {
Arc::new(Self { Arc::new(Self {
widgets: Mutex::new(Vec::new()), widgets: Mutex::new(Vec::new()),
extensions: Mutex::new(Vec::new()), extensions: Mutex::new(Vec::new()),
running: Mutex::new(true),
}) })
} }
@@ -159,10 +162,12 @@ impl Screen {
utils::hide_cursor()?; utils::hide_cursor()?;
loop { while *self.running.lock().unwrap() {
self.render()?; self.render()?;
std::thread::sleep(std::time::Duration::from_millis(28)); std::thread::sleep(std::time::Duration::from_millis(28));
} }
Ok(())
} }
/// Renders all widgets and applies extensions. /// Renders all widgets and applies extensions.
@@ -213,4 +218,17 @@ impl Screen {
} }
Ok(()) Ok(())
} }
/// Closes the loop and calls `on_close` in the extensions
pub fn close(self: &Arc<Self>) {
*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());
}
}
} }
+1 -1
View File
@@ -5,7 +5,7 @@ fn main() -> std::io::Result<()> {
let screen = Screen::new(); let screen = Screen::new();
screen.extension(InputExtension); screen.extension(InputExtension);
demos::app().draw(&screen); demos::app(screen.clone()).draw(&screen);
screen.run() screen.run()
} }