From 85bfa0f45fc5cdf34f41a0ed797ddac6006b69de Mon Sep 17 00:00:00 2001 From: Leo dev Date: Sun, 29 Jun 2025 11:49:11 -0500 Subject: [PATCH] working extension system --- src/extensions/mod.rs | 10 +++++++++ src/extensions/tick.rs | 15 +++++++++++++ src/extensions/velocity.rs | 44 ++++++++++++++++++++++++++++++++++++++ src/lib.rs | 27 ++++++++++++++++++----- src/main.rs | 26 ++++++++++++++++++++-- 5 files changed, 115 insertions(+), 7 deletions(-) create mode 100644 src/extensions/mod.rs create mode 100644 src/extensions/tick.rs create mode 100644 src/extensions/velocity.rs diff --git a/src/extensions/mod.rs b/src/extensions/mod.rs new file mode 100644 index 0000000..ca821c1 --- /dev/null +++ b/src/extensions/mod.rs @@ -0,0 +1,10 @@ +pub mod tick; +pub mod velocity; + +use std::sync::Arc; + +use crate::widget::Widget; + +pub trait Extension { + fn render(&self, _widget: &Arc) {} +} diff --git a/src/extensions/tick.rs b/src/extensions/tick.rs new file mode 100644 index 0000000..4b41a1a --- /dev/null +++ b/src/extensions/tick.rs @@ -0,0 +1,15 @@ +use std::sync::Arc; + +use crate::{component, extensions::Extension, widget::Widget}; + +pub struct TickExtension; + +impl Extension for TickExtension { + fn render(&self, _widget: &Arc) { + if let Some(on_tick) = _widget.get::() { + (on_tick.0)(_widget) + } + } +} + +component!(OnTick(pub fn(&Arc))); diff --git a/src/extensions/velocity.rs b/src/extensions/velocity.rs new file mode 100644 index 0000000..230f34c --- /dev/null +++ b/src/extensions/velocity.rs @@ -0,0 +1,44 @@ +use std::sync::Arc; + +use crate::{ + component, + extensions::Extension, + style::{Position, Transform}, + widget::Widget, +}; + +pub struct VelocityExtension; + +impl Extension for VelocityExtension { + fn render(&self, _widget: &Arc) { + if let Some(velocity) = _widget.get::() { + if let Some(mut t) = _widget.get::() { + match &mut t.x { + Position::Const(x) => { + if velocity.0 > 0 { + *x += 1; + } else if velocity.0 < 0 { + *x -= 1; + } + } + _ => {} + } + + match &mut t.y { + Position::Const(y) => { + if velocity.1 > 0 { + *y += 1; + } else if velocity.1 < 0 { + *y -= 1; + } + } + _ => {} + } + + _widget.set_component(t); + } + } + } +} + +component!(Velocity(pub i32, pub i32)); diff --git a/src/lib.rs b/src/lib.rs index ef8459b..8af9919 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,12 +1,14 @@ use std::sync::Arc; use crate::{ + extensions::Extension, render_scope::RenderScope, style::Transform, widget::{Element, Widget}, }; pub mod elements; +pub mod extensions; pub mod macros; pub mod render_scope; pub mod style; @@ -15,12 +17,14 @@ pub mod widget; pub struct Screen { pub elements: Vec>, + extensions: Vec>>, } impl Screen { pub fn new() -> Screen { Screen { elements: Vec::new(), + extensions: Vec::new(), } } @@ -29,6 +33,10 @@ impl Screen { self.elements.last().unwrap() } + pub fn extension(&mut self, ext: E) { + self.extensions.push(Arc::new(Box::new(ext))); + } + pub fn run(&mut self) -> std::io::Result<()> { for elem in &mut self.elements { elem.component(Transform::new()); @@ -36,21 +44,23 @@ impl Screen { utils::hide_cursor()?; - self.render()?; - - loop {} + loop { + self.render()?; + std::thread::sleep(std::time::Duration::from_millis(50)); + } } - pub fn render(&mut self) -> std::io::Result<()> { + pub fn render(&self) -> std::io::Result<()> { let mut scope = RenderScope::new(); utils::clear()?; - for elem in &mut self.elements { + for elem in &self.elements { scope.clear(); if let Some(t) = elem.get() { scope.set_transform(&t); } + self.render_extension(elem.clone()).unwrap(); elem.0.lock().unwrap().render(&mut scope); if let Some(t) = elem.get() { @@ -60,4 +70,11 @@ 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 075cf8d..8b5ef06 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,11 +1,33 @@ -use osui::{style::Transform, Screen}; +use osui::{ + extensions::{ + tick::{OnTick, TickExtension}, + velocity::{Velocity, VelocityExtension}, + }, + style::{Position, Transform}, + Screen, +}; fn main() { let mut screen = Screen::new(); + screen.extension(VelocityExtension); + screen.extension(TickExtension); screen .draw(format!("Hello, World!")) - .component(Transform::center()); + .component(Transform::new()) + .component(Velocity(1, 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); + } + } + } + } + })); screen.run().unwrap(); }