working extension system
This commit is contained in:
+22
-5
@@ -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(())
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user