From 23a6f36f62b33f7aef4ebecbf986e9a59df7b76e Mon Sep 17 00:00:00 2001 From: Manuel Cillero Date: Sun, 28 May 2023 09:08:29 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Define=20OneComponent=20con=20tipad?= =?UTF-8?q?o=20restringido?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-megamenu/src/component.rs | 18 ++++---- pagetop-minimal/src/component.rs | 2 +- pagetop-minimal/src/component/anchor.rs | 4 +- .../src/component/form_element/button.rs | 2 +- .../src/component/form_element/input.rs | 4 +- pagetop-minimal/src/component/heading.rs | 2 +- pagetop/src/core/component.rs | 7 +-- pagetop/src/core/component/arc.rs | 45 ------------------- pagetop/src/core/component/bundle.rs | 12 ++--- pagetop/src/core/component/default.rs | 18 -------- pagetop/src/core/component/one.rs | 40 +++++++++++++++++ pagetop/src/response/page/definition.rs | 4 +- 12 files changed, 68 insertions(+), 90 deletions(-) delete mode 100644 pagetop/src/core/component/arc.rs delete mode 100644 pagetop/src/core/component/default.rs create mode 100644 pagetop/src/core/component/one.rs diff --git a/pagetop-megamenu/src/component.rs b/pagetop-megamenu/src/component.rs index 98819c1c..0ab90d37 100644 --- a/pagetop-megamenu/src/component.rs +++ b/pagetop-megamenu/src/component.rs @@ -2,15 +2,17 @@ use pagetop::prelude::*; define_handle!(COMPONENT_MEGAMENUITEM); +type Label = OneComponent; + #[derive(Default)] pub enum MegaMenuItemType { #[default] Void, - Label(ComponentArc), - Link(ComponentArc, String), - LinkBlank(ComponentArc, String), + Label(Label), + Link(Label, String), + LinkBlank(Label, String), Html(Markup), - Submenu(ComponentArc, MegaMenu), + Submenu(Label, MegaMenu), Separator, } @@ -85,21 +87,21 @@ impl ComponentTrait for MegaMenuItem { impl MegaMenuItem { pub fn label(label: L10n) -> Self { MegaMenuItem { - item_type: MegaMenuItemType::Label(ComponentArc::new_with(label)), + item_type: MegaMenuItemType::Label(OneComponent::new_with(label)), ..Default::default() } } pub fn link(label: L10n, path: &str) -> Self { MegaMenuItem { - item_type: MegaMenuItemType::Link(ComponentArc::new_with(label), path.to_owned()), + item_type: MegaMenuItemType::Link(OneComponent::new_with(label), path.to_owned()), ..Default::default() } } pub fn link_blank(label: L10n, path: &str) -> Self { MegaMenuItem { - item_type: MegaMenuItemType::LinkBlank(ComponentArc::new_with(label), path.to_owned()), + item_type: MegaMenuItemType::LinkBlank(OneComponent::new_with(label), path.to_owned()), ..Default::default() } } @@ -113,7 +115,7 @@ impl MegaMenuItem { pub fn submenu(label: L10n, menu: MegaMenu) -> Self { MegaMenuItem { - item_type: MegaMenuItemType::Submenu(ComponentArc::new_with(label), menu), + item_type: MegaMenuItemType::Submenu(OneComponent::new_with(label), menu), ..Default::default() } } diff --git a/pagetop-minimal/src/component.rs b/pagetop-minimal/src/component.rs index 781a47ee..1ca4807f 100644 --- a/pagetop-minimal/src/component.rs +++ b/pagetop-minimal/src/component.rs @@ -12,7 +12,7 @@ pub use heading::{Heading, HeadingDisplay, HeadingType, COMPONENT_HEADING}; mod paragraph; pub use paragraph::{Paragraph, ParagraphDisplay, COMPONENT_PARAGRAPH}; mod anchor; -pub use anchor::{Anchor, AnchorIcon, AnchorTarget, AnchorType, COMPONENT_ANCHOR}; +pub use anchor::{Anchor, AnchorTarget, AnchorType, COMPONENT_ANCHOR}; mod block; pub use block::{Block, COMPONENT_BLOCK}; mod image; diff --git a/pagetop-minimal/src/component/anchor.rs b/pagetop-minimal/src/component/anchor.rs index 3829c3f0..dfa2502c 100644 --- a/pagetop-minimal/src/component/anchor.rs +++ b/pagetop-minimal/src/component/anchor.rs @@ -22,8 +22,8 @@ pub enum AnchorTarget { Context(String), } -pub type AnchorIcon = ComponentArc; -pub type AnchorHtml = ComponentArc; +type AnchorIcon = OneComponent; +type AnchorHtml = OneComponent; #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop-minimal/src/component/form_element/button.rs b/pagetop-minimal/src/component/form_element/button.rs index b9e1d1ae..c661beaf 100644 --- a/pagetop-minimal/src/component/form_element/button.rs +++ b/pagetop-minimal/src/component/form_element/button.rs @@ -10,7 +10,7 @@ pub enum ButtonType { Reset, } -pub type ButtonValue = ComponentArc; +type ButtonValue = OneComponent; #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop-minimal/src/component/form_element/input.rs b/pagetop-minimal/src/component/form_element/input.rs index 839e0b16..f9349dd0 100644 --- a/pagetop-minimal/src/component/form_element/input.rs +++ b/pagetop-minimal/src/component/form_element/input.rs @@ -13,8 +13,8 @@ pub enum InputType { Url, } -pub type InputLabel = ComponentArc; -pub type InputHelpText = ComponentArc; +type InputLabel = OneComponent; +type InputHelpText = OneComponent; #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop-minimal/src/component/heading.rs b/pagetop-minimal/src/component/heading.rs index 81e71f09..4e1eb21b 100644 --- a/pagetop-minimal/src/component/heading.rs +++ b/pagetop-minimal/src/component/heading.rs @@ -25,7 +25,7 @@ pub enum HeadingDisplay { Subtitle, } -pub type HeadingText = ComponentArc; +type HeadingText = OneComponent; #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop/src/core/component.rs b/pagetop/src/core/component.rs index daa3dfa0..76e51904 100644 --- a/pagetop/src/core/component.rs +++ b/pagetop/src/core/component.rs @@ -4,11 +4,8 @@ pub use context::{ContextOp, RenderContext}; mod definition; pub use definition::{component_mut, component_ref, AnyComponent, BaseComponent, ComponentTrait}; -mod default; -pub(crate) use default::DefaultComponent; - -mod arc; -pub use arc::ComponentArc; +mod one; +pub use one::OneComponent; mod bundle; pub use bundle::ComponentsBundle; diff --git a/pagetop/src/core/component/arc.rs b/pagetop/src/core/component/arc.rs deleted file mode 100644 index 3b8c68f4..00000000 --- a/pagetop/src/core/component/arc.rs +++ /dev/null @@ -1,45 +0,0 @@ -use crate::core::component::{ComponentTrait, DefaultComponent, RenderContext}; -use crate::html::{html, Markup}; - -use std::sync::{Arc, RwLock}; - -#[derive(Clone)] -pub struct ComponentArc(Arc>); - -impl Default for ComponentArc { - fn default() -> Self { - ComponentArc(Arc::new(RwLock::new(DefaultComponent))) - } -} - -impl ComponentArc { - pub fn new() -> Self { - ComponentArc::default() - } - - pub fn new_with(component: impl ComponentTrait) -> Self { - ComponentArc(Arc::new(RwLock::new(component))) - } - - pub fn set(&mut self, component: impl ComponentTrait) { - self.0 = Arc::new(RwLock::new(component)); - } - - pub fn weight(&self) -> isize { - self.0.read().unwrap().weight() - } - - // ComponentArc RENDER. - - pub fn render(&self, rcx: &mut RenderContext) -> Markup { - self.0.write().unwrap().render(rcx) - } - - pub fn optional_render(&self, rcx: &mut RenderContext) -> Option { - let render = self.0.write().unwrap().render(rcx).into_string(); - if !render.trim().is_empty() { - return Some(html! { (render) }); - } - None - } -} diff --git a/pagetop/src/core/component/bundle.rs b/pagetop/src/core/component/bundle.rs index a56d0350..8b8e3a72 100644 --- a/pagetop/src/core/component/bundle.rs +++ b/pagetop/src/core/component/bundle.rs @@ -1,8 +1,10 @@ -use crate::core::component::{ComponentArc, ComponentTrait, RenderContext}; +use crate::core::component::{ComponentTrait, RenderContext}; use crate::html::{html, Markup}; +use std::sync::{Arc, RwLock}; + #[derive(Clone, Default)] -pub struct ComponentsBundle(Vec); +pub struct ComponentsBundle(Vec>>); impl ComponentsBundle { pub fn new() -> Self { @@ -16,7 +18,7 @@ impl ComponentsBundle { } pub fn add(&mut self, component: impl ComponentTrait) { - self.0.push(ComponentArc::new_with(component)); + self.0.push(Arc::new(RwLock::new(component))); } pub fn clear(&mut self) { @@ -25,10 +27,10 @@ impl ComponentsBundle { pub fn render(&self, rcx: &mut RenderContext) -> 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() { - (" ")(c.render(rcx))(" ") + (" ")(c.write().unwrap().render(rcx))(" ") } } } diff --git a/pagetop/src/core/component/default.rs b/pagetop/src/core/component/default.rs deleted file mode 100644 index 0482473c..00000000 --- a/pagetop/src/core/component/default.rs +++ /dev/null @@ -1,18 +0,0 @@ -use crate::core::component::{AnyComponent, ComponentTrait}; - -#[derive(Default)] -pub struct DefaultComponent; - -impl ComponentTrait for DefaultComponent { - fn new() -> Self { - DefaultComponent::default() - } - - fn as_ref_any(&self) -> &dyn AnyComponent { - self - } - - fn as_mut_any(&mut self) -> &mut dyn AnyComponent { - self - } -} diff --git a/pagetop/src/core/component/one.rs b/pagetop/src/core/component/one.rs new file mode 100644 index 00000000..bafa3b0b --- /dev/null +++ b/pagetop/src/core/component/one.rs @@ -0,0 +1,40 @@ +use crate::core::component::{ComponentTrait, RenderContext}; +use crate::html::{html, Markup}; + +use std::sync::{Arc, RwLock}; + +#[derive(Clone, Default)] +pub struct OneComponent(Option>>); + +impl OneComponent { + pub fn new() -> Self { + OneComponent::::default() + } + + pub fn new_with(component: T) -> Self { + OneComponent(Some(Arc::new(RwLock::new(component)))) + } + + pub fn set(&mut self, component: T) { + self.0 = Some(Arc::new(RwLock::new(component))); + } + + // OneComponent RENDER. + + pub fn render(&self, rcx: &mut RenderContext) -> Markup { + if let Some(component) = &self.0 { + return component.write().unwrap().render(rcx); + } + html! {} + } + + pub fn optional_render(&self, rcx: &mut RenderContext) -> Option { + if let Some(component) = &self.0 { + let render = component.write().unwrap().render(rcx).into_string(); + if !render.trim().is_empty() { + return Some(html! { (render) }); + } + } + None + } +} diff --git a/pagetop/src/response/page/definition.rs b/pagetop/src/response/page/definition.rs index 74f26f01..eae78720 100644 --- a/pagetop/src/response/page/definition.rs +++ b/pagetop/src/response/page/definition.rs @@ -32,8 +32,8 @@ pub enum TextDirection { RightToLeft, } -pub type PageTitle = ComponentArc; -pub type PageDescription = ComponentArc; +type PageTitle = OneComponent; +type PageDescription = OneComponent; #[rustfmt::skip] pub struct Page {