Widget injection

This commit is contained in:
2025-07-28 19:24:50 +02:00
parent a8e832892b
commit a59a8eeb73
4 changed files with 108 additions and 78 deletions
+23 -20
View File
@@ -24,34 +24,37 @@ impl Element for Arc<Div> {
fn draw_child(&self, element: &Arc<Widget>) { fn draw_child(&self, element: &Arc<Widget>) {
let r = self.clone(); let r = self.clone();
element.component(Handler::new(move |elem, e: &RenderWrapperEvent| { element.inject(move |w| {
let scope = e.get_scope(); let r = r.clone();
scope.clear(); w.component(Handler::new(move |elem, e: &RenderWrapperEvent| {
let scope = e.get_scope();
scope.clear();
let transform = r.transform.lock().unwrap(); let transform = r.transform.lock().unwrap();
let (w, h) = scope.get_parent_size(); let (w, h) = scope.get_parent_size();
scope.set_parent_size(transform.width, transform.height); scope.set_parent_size(transform.width, transform.height);
if let Some(t) = elem.get() { if let Some(t) = elem.get() {
scope.set_transform(&t); scope.set_transform(&t);
} }
elem.0.lock().unwrap().render(scope); elem.0.lock().unwrap().render(scope);
if let Some(t) = elem.get() { if let Some(t) = elem.get() {
scope.set_transform(&t); scope.set_transform(&t);
} }
let elem_transform = scope.get_transform_mut(); let elem_transform = scope.get_transform_mut();
elem_transform.x += transform.x; elem_transform.x += transform.x;
elem_transform.y += transform.y; elem_transform.y += transform.y;
scope.draw(); scope.draw();
elem.0.lock().unwrap().after_render(&scope); elem.0.lock().unwrap().after_render(&scope);
scope.set_parent_size(w, h); scope.set_parent_size(w, h);
})); }))
})
} }
fn as_any(&self) -> &dyn std::any::Any { fn as_any(&self) -> &dyn std::any::Any {
+60 -54
View File
@@ -38,43 +38,46 @@ impl Element for Arc<VGrid> {
fn draw_child(&self, element: &Arc<Widget>) { fn draw_child(&self, element: &Arc<Widget>) {
let r = self.clone(); let r = self.clone();
element.component(Handler::new(move |elem, e: &RenderWrapperEvent| { element.inject(move |w| {
let scope = e.get_scope(); let r = r.clone();
scope.clear(); w.component(Handler::new(move |elem, e: &RenderWrapperEvent| {
let scope = e.get_scope();
scope.clear();
let mut transform = r.transform.lock().unwrap(); let mut transform = r.transform.lock().unwrap();
let (w, h) = scope.get_parent_size(); let (w, h) = scope.get_parent_size();
scope.set_parent_size(transform.width, transform.height); scope.set_parent_size(transform.width, transform.height);
if let Some(t) = elem.get() { if let Some(t) = elem.get() {
scope.set_transform(&t); scope.set_transform(&t);
} }
elem.0.lock().unwrap().render(scope); elem.0.lock().unwrap().render(scope);
if let Some(t) = elem.get() { if let Some(t) = elem.get() {
scope.set_transform(&t); scope.set_transform(&t);
} }
let elem_transform = scope.get_transform_mut(); let elem_transform = scope.get_transform_mut();
transform.height += if transform.height == 0 { transform.height += if transform.height == 0 {
elem_transform.height elem_transform.height
} else { } else {
elem_transform.height + r.gap elem_transform.height + r.gap
}; };
transform.width = transform.width.max(elem_transform.width); transform.width = transform.width.max(elem_transform.width);
elem_transform.x = transform.x; elem_transform.x = transform.x;
elem_transform.y = transform.y; elem_transform.y = transform.y;
transform.y += elem_transform.height + r.gap; transform.y += elem_transform.height + r.gap;
scope.draw(); scope.draw();
elem.0.lock().unwrap().after_render(&scope); elem.0.lock().unwrap().after_render(&scope);
scope.set_parent_size(w, h); scope.set_parent_size(w, h);
})); }))
})
} }
fn as_any(&self) -> &dyn std::any::Any { fn as_any(&self) -> &dyn std::any::Any {
@@ -116,43 +119,46 @@ impl Element for Arc<HGrid> {
fn draw_child(&self, element: &Arc<Widget>) { fn draw_child(&self, element: &Arc<Widget>) {
let r = self.clone(); let r = self.clone();
element.component(Handler::new(move |elem, e: &RenderWrapperEvent| { element.inject(move |w| {
let scope = e.get_scope(); let r = r.clone();
scope.clear(); w.component(Handler::new(move |elem, e: &RenderWrapperEvent| {
let scope = e.get_scope();
scope.clear();
let mut transform = r.transform.lock().unwrap(); let mut transform = r.transform.lock().unwrap();
let (w, h) = scope.get_parent_size(); let (w, h) = scope.get_parent_size();
scope.set_parent_size(transform.width, transform.height); scope.set_parent_size(transform.width, transform.height);
if let Some(t) = elem.get() { if let Some(t) = elem.get() {
scope.set_transform(&t); scope.set_transform(&t);
} }
elem.0.lock().unwrap().render(scope); elem.0.lock().unwrap().render(scope);
if let Some(t) = elem.get() { if let Some(t) = elem.get() {
scope.set_transform(&t); scope.set_transform(&t);
} }
let elem_transform = scope.get_transform_mut(); let elem_transform = scope.get_transform_mut();
transform.width += if transform.width == 0 { transform.width += if transform.width == 0 {
elem_transform.width elem_transform.width
} else { } else {
elem_transform.width + r.gap elem_transform.width + r.gap
}; };
transform.height = transform.height.max(elem_transform.height); transform.height = transform.height.max(elem_transform.height);
elem_transform.x = transform.x; elem_transform.x = transform.x;
elem_transform.y = transform.y; elem_transform.y = transform.y;
transform.x += elem_transform.width + r.gap; transform.x += elem_transform.width + r.gap;
scope.draw(); scope.draw();
elem.0.lock().unwrap().after_render(&scope); elem.0.lock().unwrap().after_render(&scope);
scope.set_parent_size(w, h); scope.set_parent_size(w, h);
})); }))
});
} }
fn as_any(&self) -> &dyn std::any::Any { fn as_any(&self) -> &dyn std::any::Any {
+2 -2
View File
@@ -105,9 +105,9 @@ impl Screen {
scope.draw(); scope.draw();
elem.0.lock().unwrap().after_render(&scope); elem.0.lock().unwrap().after_render(&scope);
elem.auto_refresh();
} }
elem.auto_refresh();
} }
Ok(()) Ok(())
} }
+23 -2
View File
@@ -30,6 +30,7 @@ pub struct Widget(
Mutex<HashMap<TypeId, BoxedComponent>>, Mutex<HashMap<TypeId, BoxedComponent>>,
Mutex<Box<dyn FnMut() -> WidgetLoad + Send + Sync>>, Mutex<Box<dyn FnMut() -> WidgetLoad + Send + Sync>>,
Mutex<Vec<Box<dyn DependencyHandler>>>, Mutex<Vec<Box<dyn DependencyHandler>>>,
Mutex<Option<Box<dyn FnMut(WidgetLoad) -> WidgetLoad + Send + Sync>>>,
); );
impl Widget { impl Widget {
@@ -40,13 +41,33 @@ impl Widget {
Mutex::new(wl.1), Mutex::new(wl.1),
Mutex::new(Box::new(e)), Mutex::new(Box::new(e)),
Mutex::new(Vec::new()), Mutex::new(Vec::new()),
Mutex::new(None),
) )
} }
pub fn inject<F: FnMut(WidgetLoad) -> WidgetLoad + 'static + Send + Sync>(
self: &Arc<Self>,
f: F,
) {
{
*self.4.lock().unwrap() = Some(Box::new(f));
}
self.refresh();
}
pub fn refresh(self: &Arc<Self>) { pub fn refresh(self: &Arc<Self>) {
let w = (self.2.lock().unwrap())(); let w = (self.2.lock().unwrap())();
*self.0.lock().unwrap() = w.0; match &mut *self.4.lock().unwrap() {
*self.1.lock().unwrap() = w.1; Some(inject) => {
let w = inject(w);
*self.0.lock().unwrap() = w.0;
*self.1.lock().unwrap() = w.1;
}
None => {
*self.0.lock().unwrap() = w.0;
*self.1.lock().unwrap() = w.1;
}
}
} }
pub fn auto_refresh(self: &Arc<Self>) { pub fn auto_refresh(self: &Arc<Self>) {