From 661756eccda0a6f14b5b1a522b90723ede7f5af3 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Sat, 5 Jul 2025 06:28:50 +0200 Subject: [PATCH] handlers and ids --- src/elements/div.rs | 31 +++++++++++++++++++++++++++++++ src/elements/mod.rs | 2 ++ src/extensions/id.rs | 31 +++++++++++++++++++++++++++++++ src/extensions/mod.rs | 31 +++++++++++++++++++++++++++---- src/extensions/tick.rs | 9 +++++---- src/extensions/velocity.rs | 2 +- src/lib.rs | 20 ++++++++------------ src/main.rs | 25 +++++++------------------ 8 files changed, 112 insertions(+), 39 deletions(-) create mode 100644 src/elements/div.rs create mode 100644 src/extensions/id.rs diff --git a/src/elements/div.rs b/src/elements/div.rs new file mode 100644 index 0000000..bdc8273 --- /dev/null +++ b/src/elements/div.rs @@ -0,0 +1,31 @@ +use std::sync::Arc; + +use crate::widget::{Element, Widget}; + +#[derive(Default)] +pub struct Div { + pub children: Vec>, +} + +impl Element for Div { + fn as_any(&self) -> &dyn std::any::Any { + self + } + + fn as_any_mut(&mut self) -> &mut dyn std::any::Any { + self + } +} + +impl Div { + pub fn new() -> Self { + Div { + children: Vec::new(), + } + } + + pub fn draw(&mut self, element: E) -> &Arc { + self.children.push(Arc::new(Widget::new(Box::new(element)))); + self.children.last().unwrap() + } +} diff --git a/src/elements/mod.rs b/src/elements/mod.rs index 83f3c82..a9d82ef 100644 --- a/src/elements/mod.rs +++ b/src/elements/mod.rs @@ -1,3 +1,5 @@ +pub mod div; + use crate::Element; impl Element for String { diff --git a/src/extensions/id.rs b/src/extensions/id.rs new file mode 100644 index 0000000..66259d4 --- /dev/null +++ b/src/extensions/id.rs @@ -0,0 +1,31 @@ +use std::sync::{Arc, Mutex}; + +use crate::{component, extensions::Extension, widget::Widget}; + +pub struct IdExtension(Mutex>>); + +impl Extension for Arc { + fn init(&mut self, widgets: &Vec>) { + self.0.lock().unwrap().append(&mut widgets.clone()); + } +} + +impl IdExtension { + pub fn new() -> Arc { + Arc::new(Self(Mutex::new(Vec::new()))) + } + + pub fn get_element(self: &Arc, id: usize) -> Option> { + for elem in self.0.lock().unwrap().iter() { + if let Some(current_id) = elem.get::() { + if current_id.0 == id { + return Some(elem.clone()); + } + } + } + + None + } +} + +component!(Id(pub usize)); diff --git a/src/extensions/mod.rs b/src/extensions/mod.rs index 4935328..741f3a2 100644 --- a/src/extensions/mod.rs +++ b/src/extensions/mod.rs @@ -1,11 +1,34 @@ +pub mod id; pub mod tick; pub mod velocity; -use std::sync::Arc; +use std::{ + fmt::Debug, + sync::{Arc, Mutex}, +}; -use crate::widget::Widget; +use crate::{render_scope::RenderScope, widget::Widget}; pub trait Extension { - fn init(&self, _widgets: &Vec>) {} - fn render(&self, _widget: &Arc) {} + fn init(&mut self, _widgets: &Vec>) {} + fn render_widget(&mut self, _scope: &mut RenderScope, _widget: &Arc) {} +} + +#[derive(Clone)] +pub struct Handler(pub Arc) + Send + Sync>>); + +impl Handler { + pub fn new) + Send + Sync + 'static>(f: F) -> Handler { + Handler(Arc::new(Mutex::new(f))) + } + + pub fn call(&self, w: &Arc) { + (self.0.lock().unwrap())(w) + } +} + +impl Debug for Handler { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "Handler") + } } diff --git a/src/extensions/tick.rs b/src/extensions/tick.rs index ac072ca..0a58722 100644 --- a/src/extensions/tick.rs +++ b/src/extensions/tick.rs @@ -1,18 +1,19 @@ -use std::sync::Arc; +use std::{fmt::Debug, sync::Arc}; +use crate::extensions::Handler; use crate::{component, extensions::Extension, widget::Widget}; pub struct TickExtension(pub u16); impl Extension for TickExtension { - fn init(&self, widgets: &Vec>) { + fn init(&mut self, widgets: &Vec>) { let rate_dur = 1000 / self.0 as u64; std::thread::spawn({ let widgets = widgets.clone(); move || loop { for w in &widgets { if let Some(on_tick) = w.get::() { - (on_tick.0)(&w) + on_tick.0.call(&w) } } std::thread::sleep(std::time::Duration::from_millis(rate_dur)); @@ -21,4 +22,4 @@ impl Extension for TickExtension { } } -component!(OnTick(pub fn(&Arc))); +component!(OnTick(pub Handler)); diff --git a/src/extensions/velocity.rs b/src/extensions/velocity.rs index de2c167..c33acf5 100644 --- a/src/extensions/velocity.rs +++ b/src/extensions/velocity.rs @@ -42,7 +42,7 @@ impl VelocityExtension { } impl Extension for VelocityExtension { - fn init(&self, widgets: &Vec>) { + fn init(&mut self, widgets: &Vec>) { std::thread::spawn({ let widgets = widgets.clone(); move || { diff --git a/src/lib.rs b/src/lib.rs index 529f8d4..17f246a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,4 @@ -use std::sync::Arc; +use std::sync::{Arc, Mutex}; use crate::{ extensions::Extension, @@ -17,7 +17,7 @@ pub mod widget; pub struct Screen { pub widgets: Vec>, - extensions: Vec>>, + extensions: Vec>>>, } impl Screen { @@ -34,7 +34,7 @@ impl Screen { } pub fn extension(&mut self, ext: E) { - self.extensions.push(Arc::new(Box::new(ext))); + self.extensions.push(Arc::new(Mutex::new(Box::new(ext)))); } pub fn run(&mut self) -> std::io::Result<()> { @@ -43,7 +43,7 @@ impl Screen { } for ext in &self.extensions { - ext.init(&self.widgets); + ext.lock().unwrap().init(&self.widgets); } utils::hide_cursor()?; @@ -64,7 +64,10 @@ impl Screen { scope.set_transform(&t); } - self.render_extension(elem.clone()).unwrap(); + for ext in &self.extensions { + ext.lock().unwrap().render_widget(&mut scope, elem); + } + elem.0.lock().unwrap().render(&mut scope); if let Some(t) = elem.get() { @@ -74,11 +77,4 @@ impl Screen { } Ok(()) } - - pub fn render_extension(&self, wi: Arc) -> std::io::Result<()> { - for ext in &self.extensions { - ext.render(&wi); - } - Ok(()) - } } diff --git a/src/main.rs b/src/main.rs index 9de52a6..66b91cf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,33 +1,22 @@ use osui::{ extensions::{ + id::{Id, IdExtension}, tick::{OnTick, TickExtension}, - velocity::{Velocity, VelocityExtension}, + Handler, }, - style::{Position, Transform}, Screen, }; fn main() { let mut screen = Screen::new(); - screen.extension(VelocityExtension); - screen.extension(TickExtension(60)); + let document = IdExtension::new(); + screen.extension(document.clone()); + screen.extension(TickExtension(10)); screen .draw(format!("Hello, World!")) - .component(Transform::new()) - .component(Velocity(100, 0)) - .component(OnTick(|w| { - if let Some(mut v) = w.get::() { - if let Some(t) = w.get::() { - if let Position::Const(c) = t.x { - if c >= 30 { - v.0 = 0; - w.set_component(v); - } - } - } - } - })); + .component(OnTick(Handler::new(move |_| {}))) + .component(Id(69)); screen.run().unwrap(); }