diff --git a/pagetop-megamenu/src/component.rs b/pagetop-megamenu/src/component.rs index 97d3a267..ad6da656 100644 --- a/pagetop-megamenu/src/component.rs +++ b/pagetop-megamenu/src/component.rs @@ -153,7 +153,7 @@ impl MegaMenuItem { define_handle!(COMPONENT_MEGAMENU); -action_before_render_component!(ACTION_BEFORE_RENDER_MENU, MegaMenu); +action_before_render_component!(ACTION_BEFORE_RENDER_MENU for MegaMenu); #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop-minimal/src/component/container.rs b/pagetop-minimal/src/component/container.rs index c3f14247..82a4d8c1 100644 --- a/pagetop-minimal/src/component/container.rs +++ b/pagetop-minimal/src/component/container.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; define_handle!(COMPONENT_CONTAINER); -action_before_render_component!(ACTION_BEFORE_RENDER_CONTAINER, Container); +action_before_render_component!(ACTION_BEFORE_RENDER_CONTAINER for Container); #[derive(Default)] pub enum ContainerType { diff --git a/pagetop-minimal/src/component/form_element/form.rs b/pagetop-minimal/src/component/form_element/form.rs index 6eaa7a91..979d9a78 100644 --- a/pagetop-minimal/src/component/form_element/form.rs +++ b/pagetop-minimal/src/component/form_element/form.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; define_handle!(COMPONENT_FORM); -action_before_render_component!(ACTION_BEFORE_RENDER_FORM, Form); +action_before_render_component!(ACTION_BEFORE_RENDER_FORM for Form); #[derive(Default)] pub enum FormMethod { diff --git a/pagetop-minimal/src/component/grid/column.rs b/pagetop-minimal/src/component/grid/column.rs index f3f4d895..f623b942 100644 --- a/pagetop-minimal/src/component/grid/column.rs +++ b/pagetop-minimal/src/component/grid/column.rs @@ -2,7 +2,7 @@ use pagetop::prelude::*; define_handle!(COMPONENT_COLUMN); -action_before_render_component!(ACTION_BEFORE_RENDER_COLUMN, Column); +action_before_render_component!(ACTION_BEFORE_RENDER_COLUMN for Column); const SIZE__DEFAULT: &str = "col-md"; const SIZE__1_OF_12: &str = "col-md-1"; diff --git a/pagetop-minimal/src/component/grid/row.rs b/pagetop-minimal/src/component/grid/row.rs index a4f78bd4..c167617a 100644 --- a/pagetop-minimal/src/component/grid/row.rs +++ b/pagetop-minimal/src/component/grid/row.rs @@ -4,7 +4,7 @@ use crate::component::grid; define_handle!(COMPONENT_ROW); -action_before_render_component!(ACTION_BEFORE_RENDER_ROW, Row); +action_before_render_component!(ACTION_BEFORE_RENDER_ROW for Row); #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop/src/base.rs b/pagetop/src/base.rs index 29705be6..acfd1dbe 100644 --- a/pagetop/src/base.rs +++ b/pagetop/src/base.rs @@ -1,3 +1,5 @@ +pub mod action; + pub mod component; pub mod theme; diff --git a/pagetop/src/base/action.rs b/pagetop/src/base/action.rs new file mode 100644 index 00000000..f1f99699 --- /dev/null +++ b/pagetop/src/base/action.rs @@ -0,0 +1 @@ +mod before_render_component; \ No newline at end of file diff --git a/pagetop/src/base/action/before_render_component.rs b/pagetop/src/base/action/before_render_component.rs new file mode 100644 index 00000000..1acf30ff --- /dev/null +++ b/pagetop/src/base/action/before_render_component.rs @@ -0,0 +1,64 @@ +#[macro_export] +macro_rules! action_before_render_component { + ( $ACTION_HANDLE:ident for $Component:ty ) => { + $crate::paste! { + $crate::define_handle!($ACTION_HANDLE); + + type Action = fn(&$Component, &mut RenderContext); + + pub struct [< BeforeRender $Component >] { + action: Option, + weight: isize, + } + + impl ActionTrait for [< BeforeRender $Component >] { + fn new() -> Self { + [< BeforeRender $Component >] { + action: None, + weight: 0, + } + } + + fn handle(&self) -> Handle { + $ACTION_HANDLE + } + + fn weight(&self) -> isize { + self.weight + } + + fn as_ref_any(&self) -> &dyn AnyAction { + self + } + } + + impl [< BeforeRender $Component >] { + #[allow(dead_code)] + pub fn with_action(mut self, action: Action) -> Self { + self.action = Some(action); + self + } + + #[allow(dead_code)] + pub fn with_weight(mut self, weight: isize) -> Self { + self.weight = weight; + self + } + + pub fn run(&self, component: &mut $Component, rcx: &mut RenderContext) { + if let Some(action) = self.action { + action(component, rcx) + } + } + } + + #[inline(always)] + pub fn before_render_inline(component: &mut $Component, rcx: &mut RenderContext) { + run_actions($ACTION_HANDLE, |action| + action_ref::<[< BeforeRender $Component >]>(&**action) + .run(component, rcx) + ); + } + } + }; +} diff --git a/pagetop/src/base/component/block.rs b/pagetop/src/base/component/block.rs index b51db15e..5153d6bf 100644 --- a/pagetop/src/base/component/block.rs +++ b/pagetop/src/base/component/block.rs @@ -2,7 +2,7 @@ use crate::prelude::*; define_handle!(COMPONENT_BLOCK); -action_before_render_component!(ACTION_BEFORE_RENDER_BLOCK, Block); +action_before_render_component!(ACTION_BEFORE_RENDER_BLOCK for Block); #[rustfmt::skip] #[derive(Default)] diff --git a/pagetop/src/base/component/l10n.rs b/pagetop/src/base/component/l10n.rs index fb178681..f1735259 100644 --- a/pagetop/src/base/component/l10n.rs +++ b/pagetop/src/base/component/l10n.rs @@ -11,20 +11,18 @@ pub enum L10nOp { Escaped(&'static str, &'static Locales), } +impl Default for L10nOp { + fn default() -> Self { + L10nOp::None + } +} + +#[derive(Default)] pub struct L10n { op: L10nOp, args: HashMap<&'static str, String>, } -impl Default for L10n { - fn default() -> Self { - L10n { - op: L10nOp::None, - args: HashMap::new(), - } - } -} - impl ComponentTrait for L10n { fn new() -> Self { L10n::default() diff --git a/pagetop/src/core/component/definition.rs b/pagetop/src/core/component/definition.rs index 666cc1a0..d153b65e 100644 --- a/pagetop/src/core/component/definition.rs +++ b/pagetop/src/core/component/definition.rs @@ -74,68 +74,3 @@ pub fn component_ref(component: &dyn ComponentTrait) -> &C { pub fn component_mut(component: &mut dyn ComponentTrait) -> &mut C { component.as_mut_any().downcast_mut::().unwrap() } - -#[macro_export] -macro_rules! action_before_render_component { - ( $ACTION_HANDLE:ident, $Component:ty ) => { - $crate::paste! { - $crate::define_handle!($ACTION_HANDLE); - - type Action = fn(&$Component, &mut RenderContext); - - pub struct [< BeforeRender $Component >] { - action: Option, - weight: isize, - } - - impl ActionTrait for [< BeforeRender $Component >] { - fn new() -> Self { - [< BeforeRender $Component >] { - action: None, - weight: 0, - } - } - - fn handle(&self) -> Handle { - $ACTION_HANDLE - } - - fn weight(&self) -> isize { - self.weight - } - - fn as_ref_any(&self) -> &dyn AnyAction { - self - } - } - - impl [< BeforeRender $Component >] { - #[allow(dead_code)] - pub fn with_action(mut self, action: Action) -> Self { - self.action = Some(action); - self - } - - #[allow(dead_code)] - pub fn with_weight(mut self, weight: isize) -> Self { - self.weight = weight; - self - } - - pub fn run(&self, component: &mut $Component, rcx: &mut RenderContext) { - if let Some(action) = self.action { - action(component, rcx) - } - } - } - - #[inline(always)] - pub fn before_render_inline(component: &mut $Component, rcx: &mut RenderContext) { - run_actions($ACTION_HANDLE, |action| - action_ref::<[< BeforeRender $Component >]>(&**action) - .run(component, rcx) - ); - } - } - }; -} diff --git a/pagetop/src/locale.rs b/pagetop/src/locale.rs index 09d9e06c..4a3a0865 100644 --- a/pagetop/src/locale.rs +++ b/pagetop/src/locale.rs @@ -78,7 +78,7 @@ //! //! define_locale!(LOCALE_SAMPLE, "static/locales"); //! ``` -//! Y utiliza el componente [L10n](crate::core::component::L10n) para incluir, en respuestas a las +//! Y utiliza el componente [L10n](crate::base::component::L10n) para incluir, en respuestas a las //! peticiones web, textos y contenidos opcionalmente traducibles segĂșn el contexto de renderizado. use crate::{args, config, trace, LazyStatic};