Mejora el uso de referencias en los componentes

Sin embargo requiere duplicar todos los métodos para recibir una
referencia mutable a self en uno y directamente self en otro.
This commit is contained in:
Manuel Cillero 2022-04-06 23:54:38 +02:00
parent 93d6d455c8
commit e11b36f7ed
5 changed files with 18 additions and 9 deletions

View file

@ -77,6 +77,11 @@ impl Row {
self
}
pub fn set_classes_ref(&mut self, classes: &str) -> &Self {
self.classes.set_classes(classes);
self
}
pub fn add_classes(mut self, classes: &str) -> Self {
self.classes.add_classes(classes);
self

View file

@ -34,17 +34,21 @@ impl ThemeTrait for BulmixTheme {
fn render_component(
&self,
component: &dyn PageComponent,
component: &mut dyn PageComponent,
assets: &mut PageAssets
) -> Option<Markup> {
match component.name() {
"GridRow" => {
let row = component.downcast_ref::<grid::Row>().unwrap();
let row = component.downcast_mut::<grid::Row>().unwrap();
row.set_classes_ref("Prueba");
None
/*
Some(html! {
div id=[row.id()] class=[row.classes("columns")] {
(row.columns().render(assets))
}
})
*/
},
"GridColumn" => {
let col = component.downcast_ref::<grid::Column>().unwrap();

View file

@ -1,10 +1,10 @@
use crate::html::{Markup, html};
use crate::response::page::{PageAssets, PageComponent, render_component};
use std::sync::Arc;
use std::sync::{Arc, RwLock};
#[derive(Clone)]
pub struct PageContainer(Vec<Arc<dyn PageComponent>>);
pub struct PageContainer(Vec<Arc<RwLock<dyn PageComponent>>>);
impl PageContainer {
pub fn new() -> Self {
@ -18,15 +18,15 @@ impl PageContainer {
}
pub fn add(&mut self, component: impl PageComponent) {
self.0.push(Arc::new(component));
self.0.push(Arc::new(RwLock::new(component)));
}
pub fn render(&self, assets: &mut PageAssets) -> Markup {
let mut components = self.0.clone();
components.sort_by_key(|c| c.weight());
components.sort_by_key(|c| c.read().unwrap().weight());
html! {
@for c in components.iter() {
(render_component(&**c, assets))
(render_component(&mut *c.write().unwrap(), assets))
}
}
}

View file

@ -193,7 +193,7 @@ impl<'a> Page<'a> {
}
pub fn render_component(
component: &dyn PageComponent,
component: &mut dyn PageComponent,
assets: &mut PageAssets
) -> Markup {
match component.is_renderable() {

View file

@ -77,7 +77,7 @@ pub trait ThemeTrait: Send + Sync {
#[allow(unused_variables)]
fn render_component(
&self,
component: &dyn PageComponent,
component: &mut dyn PageComponent,
assets: &mut PageAssets
) -> Option<Markup> {
None