✨ Añade acciones base y renderizado de componentes
- Añade acciones BeforeRender y AfterRender para ejecutar código personalizado antes y después de renderizar un componente. - Introduce la acción PrepareRender para personalizar totalmente el renderizado de un componente. - Se actualizan las definiciones de acciones para utilizar el nuevo "trait" ActionDispatcher. - Se crea un nuevo trait ComponentTrait para definir componentes renderizables. - Se implementan las estructuras Children y Child para gestionar componentes hijos dentro de un componente padre. - Se añade OptionComponent para encapsular de forma segura componentes opcionales y poder usarlos en otros componentes.
This commit is contained in:
parent
f76a208520
commit
37df2ada75
28 changed files with 1102 additions and 147 deletions
|
@ -1,11 +1,11 @@
|
|||
//! API para definir acciones que inyectan código en el flujo de la aplicación.
|
||||
//!
|
||||
//! Permite crear acciones en las librerías para que otros *crates* puedan inyectar código usando
|
||||
//! funciones *ad hoc* que modifican el comportamiento predefinido en puntos concretos del flujo de
|
||||
//! ejecución de la aplicación.
|
||||
//! Permite crear acciones para que otros *crates* puedan inyectar código usando funciones *ad hoc*
|
||||
//! que modifican el comportamiento predefinido en puntos concretos del flujo de ejecución de la
|
||||
//! aplicación.
|
||||
|
||||
mod definition;
|
||||
pub use definition::{ActionBase, ActionBox, ActionKey, ActionTrait};
|
||||
pub use definition::{ActionBox, ActionDispatcher, ActionKey};
|
||||
|
||||
mod list;
|
||||
use list::ActionsList;
|
||||
|
@ -14,49 +14,33 @@ mod all;
|
|||
pub(crate) use all::add_action;
|
||||
pub use all::dispatch_actions;
|
||||
|
||||
/// Crea una lista de acciones para facilitar la implementación del método
|
||||
/// [`actions`](crate::core::extension::ExtensionTrait#method.actions).
|
||||
/// Facilita la implementación del método
|
||||
/// [`actions()`](crate::core::extension::ExtensionTrait::actions).
|
||||
///
|
||||
/// Esta macro crea vectores de [`ActionBox`], el tipo dinámico que encapsula cualquier acción que
|
||||
/// implemente [`ActionTrait`]. Evita escribir repetidamente `Box::new(...)` para cada acción
|
||||
/// inyectada, manteniendo el código más limpio.
|
||||
/// Evita escribir repetidamente `Box::new(...)` para cada acción de la lista, manteniendo el código
|
||||
/// más limpio.
|
||||
///
|
||||
/// # Ejemplos
|
||||
///
|
||||
/// Puede llamarse sin argumentos para crear un vector vacío:
|
||||
/// # Ejemplo
|
||||
///
|
||||
/// ```rust,ignore
|
||||
/// let my_actions = inject_actions![];
|
||||
/// ```
|
||||
/// use pagetop::prelude::*;
|
||||
///
|
||||
/// O con una lista de acciones concretas:
|
||||
///
|
||||
/// ```rust,ignore
|
||||
/// let my_actions = inject_actions![
|
||||
/// MyFirstAction::new(),
|
||||
/// MySecondAction::new().with_weight(10),
|
||||
/// ];
|
||||
/// ```
|
||||
///
|
||||
/// Internamente, expande a un `vec![Box::new(...), ...]`.
|
||||
///
|
||||
/// # Ejemplo típico en una extensión
|
||||
///
|
||||
/// ```rust,ignore
|
||||
/// impl ExtensionTrait for MyExtension {
|
||||
/// impl ExtensionTrait for MyTheme {
|
||||
/// fn actions(&self) -> Vec<ActionBox> {
|
||||
/// inject_actions![
|
||||
/// CustomizeLoginAction::new(),
|
||||
/// ModifyHeaderAction::new().with_weight(-5),
|
||||
/// actions_boxed![
|
||||
/// action::theme::BeforeRender::<Button>::new(&Self, before_render_button),
|
||||
/// action::theme::PrepareRender::<Error404>::new(&Self, render_error404),
|
||||
/// ]
|
||||
/// }
|
||||
/// }
|
||||
/// ```
|
||||
///
|
||||
/// Así, `PageTop` podrá registrar todas estas acciones durante la inicialización de la extensión y
|
||||
/// posteriormente despacharlas según corresponda.
|
||||
/// impl ThemeTrait for MyTheme {}
|
||||
///
|
||||
/// fn before_render_button(c: &mut Button, cx: &mut Context) { todo!() }
|
||||
/// fn render_error404(c: &Error404, cx: &mut Context) -> PrepareMarkup { todo!() }
|
||||
/// ```
|
||||
#[macro_export]
|
||||
macro_rules! inject_actions {
|
||||
macro_rules! actions_boxed {
|
||||
() => {
|
||||
Vec::<ActionBox>::new()
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue