- 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.
50 lines
1.5 KiB
Rust
50 lines
1.5 KiB
Rust
//! API para definir acciones que inyectan código en el flujo 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::{ActionBox, ActionDispatcher, ActionKey};
|
|
|
|
mod list;
|
|
use list::ActionsList;
|
|
|
|
mod all;
|
|
pub(crate) use all::add_action;
|
|
pub use all::dispatch_actions;
|
|
|
|
/// Facilita la implementación del método
|
|
/// [`actions()`](crate::core::extension::ExtensionTrait::actions).
|
|
///
|
|
/// Evita escribir repetidamente `Box::new(...)` para cada acción de la lista, manteniendo el código
|
|
/// más limpio.
|
|
///
|
|
/// # Ejemplo
|
|
///
|
|
/// ```rust,ignore
|
|
/// use pagetop::prelude::*;
|
|
///
|
|
/// impl ExtensionTrait for MyTheme {
|
|
/// fn actions(&self) -> Vec<ActionBox> {
|
|
/// actions_boxed![
|
|
/// action::theme::BeforeRender::<Button>::new(&Self, before_render_button),
|
|
/// action::theme::PrepareRender::<Error404>::new(&Self, render_error404),
|
|
/// ]
|
|
/// }
|
|
/// }
|
|
///
|
|
/// 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! actions_boxed {
|
|
() => {
|
|
Vec::<ActionBox>::new()
|
|
};
|
|
( $($action:expr),+ $(,)? ) => {{
|
|
vec![$(Box::new($action),)+]
|
|
}};
|
|
}
|