From 4cbe84b4c0a47f68dc8a661fc88dd38c8ef7c427 Mon Sep 17 00:00:00 2001 From: Manuel Cillero Date: Sun, 22 Mar 2026 08:58:15 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Implementa=20temas=20hijo=20y=20mac?= =?UTF-8?q?ro=20render=5Fcomponent!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Añade `Theme::parent()` para declarar jerarquías de herencia entre temas. Sustituye la acción `PrepareRender` por el método `Theme::prepare_component()` y la macro `render_component!`. --- README.md | 2 +- src/base/action/theme.rs | 3 - src/base/action/theme/prepare_render.rs | 65 ------------------- src/config.rs | 2 + src/core/action.rs | 9 +-- src/core/action/all.rs | 15 ----- src/core/action/list.rs | 17 ----- src/core/component/definition.rs | 49 +++++++------- src/core/theme.rs | 44 +++++++++++++ src/core/theme/definition.rs | 85 +++++++++++++++++++++++-- src/lib.rs | 3 +- src/locale.rs | 2 + src/prelude.rs | 2 + src/service.rs | 2 + 14 files changed, 161 insertions(+), 139 deletions(-) delete mode 100644 src/base/action/theme/prepare_render.rs diff --git a/README.md b/README.md index 4c421edd..f44adf7d 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ según las necesidades de cada proyecto, incluyendo: * **Extensiones** (*extensions*): añaden, extienden o personalizan funcionalidades usando las APIs de PageTop o de terceros. * **Temas** (*themes*): son extensiones que permiten modificar la apariencia de páginas y - componentes sin comprometer su funcionalidad. + componentes. Pueden crearse temas hijo que heredan y refinan el comportamiento de su tema padre. ## ⚡️ Guía rápida diff --git a/src/base/action/theme.rs b/src/base/action/theme.rs index 40988574..a3db61a0 100644 --- a/src/base/action/theme.rs +++ b/src/base/action/theme.rs @@ -5,6 +5,3 @@ pub use before_render_component::*; mod after_render_component; pub use after_render_component::*; - -mod prepare_render; -pub use prepare_render::*; diff --git a/src/base/action/theme/prepare_render.rs b/src/base/action/theme/prepare_render.rs deleted file mode 100644 index 108fd4b8..00000000 --- a/src/base/action/theme/prepare_render.rs +++ /dev/null @@ -1,65 +0,0 @@ -use crate::prelude::*; - -/// Tipo de función para alterar el renderizado de un componente. -/// -/// Permite a un [tema](crate::base::action::theme) sobreescribir el renderizado predeterminado de -/// los componentes. -/// -/// Recibe una referencia al componente `component` y una referencia mutable al contexto `cx`. -pub type FnPrepareRender = fn(component: &C, cx: &mut Context) -> Result; - -/// Ejecuta [`FnPrepareRender`] para preparar el renderizado de un componente. -/// -/// Permite a un tema hacer una implementación nueva del renderizado de un componente. -pub struct PrepareRender { - f: FnPrepareRender, - theme_type_id: Option, - referer_type_id: Option, -} - -/// Filtro para despachar [`FnPrepareRender`] que modifica el renderizado de un componente `C`. -impl ActionDispatcher for PrepareRender { - /// Devuelve el identificador de tipo ([`UniqueId`]) del tema. - fn theme_type_id(&self) -> Option { - self.theme_type_id - } - - /// Devuelve el identificador de tipo ([`UniqueId`]) del componente `C`. - fn referer_type_id(&self) -> Option { - self.referer_type_id - } -} - -impl PrepareRender { - /// Permite [registrar](Extension::actions) una nueva acción [`FnPrepareRender`] para un tema - /// dado. - pub fn new(theme: ThemeRef, f: FnPrepareRender) -> Self { - PrepareRender { - f, - theme_type_id: Some(theme.type_id()), - referer_type_id: Some(UniqueId::of::()), - } - } - - /// Despacha las acciones. Se detiene en cuanto una renderiza o produce un error. - #[inline] - pub(crate) fn dispatch(component: &C, cx: &mut Context) -> Result { - let mut render_result: Result = Ok(html! {}); - dispatch_actions_until( - &ActionKey::new( - UniqueId::of::(), - Some(cx.theme().type_id()), - Some(UniqueId::of::()), - None, - ), - |action: &Self| match &render_result { - Ok(markup) if markup.is_empty() => { - render_result = (action.f)(component, cx); - std::ops::ControlFlow::Continue(()) - } - _ => std::ops::ControlFlow::Break(()), - }, - ); - render_result - } -} diff --git a/src/config.rs b/src/config.rs index 32a73083..9b7b43d2 100644 --- a/src/config.rs +++ b/src/config.rs @@ -149,6 +149,8 @@ pub static CONFIG_VALUES: LazyLock> = LazyLock::new( .expect("Failed to set application run mode") }); +// **< include_config! >**************************************************************************** + /// Incluye los ajustes necesarios de la configuración anticipando valores por defecto. /// /// # Sintaxis diff --git a/src/core/action.rs b/src/core/action.rs index 8eb724dd..92b3f1aa 100644 --- a/src/core/action.rs +++ b/src/core/action.rs @@ -12,7 +12,9 @@ use list::ActionsList; mod all; pub(crate) use all::add_action; -pub use all::{dispatch_actions, dispatch_actions_until}; +pub use all::dispatch_actions; + +// **< actions_boxed! >***************************************************************************** /// Facilita la implementación del método [`actions()`](crate::core::extension::Extension::actions). /// @@ -22,12 +24,11 @@ pub use all::{dispatch_actions, dispatch_actions_until}; /// # Ejemplo /// /// ```rust,ignore -/// # use pagetop::prelude::*; /// impl Extension for MyTheme { /// fn actions(&self) -> Vec { /// actions_boxed![ /// action::theme::BeforeRender::