working extension system

This commit is contained in:
2025-06-29 11:49:11 -05:00
parent af719d83db
commit 85bfa0f45f
5 changed files with 115 additions and 7 deletions
+22 -5
View File
@@ -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<Arc<Widget>>,
extensions: Vec<Arc<Box<dyn Extension>>>,
}
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<E: Extension + 'static>(&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<Widget>) -> std::io::Result<()> {
for ext in &self.extensions {
ext.render(&wi);
}
Ok(())
}
}