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 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 { pub fn add_classes(mut self, classes: &str) -> Self {
self.classes.add_classes(classes); self.classes.add_classes(classes);
self self

View file

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

View file

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

View file

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