Skip to main content

App

Trait App 

Source
pub trait App: 'static {
    type Model: 'static;
    type Msg: Clone + Send + 'static;

Show 20 methods // Required methods fn init(handle: &Handle<Self::Msg>) -> Self::Model; fn update( model: Self::Model, msg: Self::Msg, handle: &Handle<Self::Msg>, ) -> Self::Model; fn view(model: &Self::Model) -> View<Self::Msg>; // Provided methods fn on_key(_model: &Self::Model, _event: &KeyEvent) -> Option<Self::Msg> { ... } fn on_focus(_model: &Self::Model, _id: Option<u64>) -> Option<Self::Msg> { ... } fn ime_allowed() -> bool { ... } fn on_ime(_model: &Self::Model, _event: &ImeEvent) -> Option<Self::Msg> { ... } fn ime_cursor_area(_model: &Self::Model) -> Option<(f32, f32, f32, f32)> { ... } fn on_wheel( _model: &Self::Model, _delta: WheelDelta, _cursor: (f32, f32), _modifiers: Modifiers, ) -> Option<Self::Msg> { ... } fn view_overlay(_model: &Self::Model) -> Option<View<Self::Msg>> { ... } fn on_file_drop(_model: &Self::Model, _path: PathBuf) -> Option<Self::Msg> { ... } fn on_resize( _model: &Self::Model, _width: u32, _height: u32, ) -> Option<Self::Msg> { ... } fn on_scale_factor(_model: &Self::Model, _scale: f64) -> Option<Self::Msg> { ... } fn title() -> &'static str { ... } fn window_title(_model: &Self::Model) -> Option<String> { ... } fn secondary_view( _model: &Self::Model, _key: u64, ) -> Option<View<Self::Msg>> { ... } fn secondary_title(_model: &Self::Model, _key: u64) -> Option<String> { ... } fn on_secondary_close(_model: &Self::Model, _key: u64) -> Option<Self::Msg> { ... } fn app_id() -> Option<&'static str> { ... } fn initial_size() -> (u32, u32) { ... }
}
Expand description

Aplicación Elm: estado inmutable, transición pura, vista pura.

init y update reciben un Handle que permite hablar con el runtime desde dentro de la transición (cerrar la ventana, lanzar trabajo en otro hilo y reentrar con un Msg al terminar). Mantener la transición pura del modelo sigue siendo el contrato — Handle sólo escala efectos.

Required Associated Types§

Source

type Model: 'static

Source

type Msg: Clone + Send + 'static

Required Methods§

Source

fn init(handle: &Handle<Self::Msg>) -> Self::Model

Source

fn update( model: Self::Model, msg: Self::Msg, handle: &Handle<Self::Msg>, ) -> Self::Model

Source

fn view(model: &Self::Model) -> View<Self::Msg>

Provided Methods§

Source

fn on_key(_model: &Self::Model, _event: &KeyEvent) -> Option<Self::Msg>

Maneja una pulsación de tecla. Devuelve Some(Msg) para disparar una transición; None (default) ignora la tecla.

Source

fn on_focus(_model: &Self::Model, _id: Option<u64>) -> Option<Self::Msg>

El foco cambió: el runtime movió el foco a id (None = nada enfocado). Pasa al pulsar Tab/Shift+Tab (recorre los nodos View::focusable en orden de árbol, envolviendo) o al clickear un nodo enfocable. La app guarda id en su Model para (a) pintar el focus-ring (if model.focus == Some(id) { … } en view) y (b) rutear el teclado al campo activo desde on_key. Devolver Some(Msg) dispara una transición; None (default) ignora.

El foco lo administra el runtime (única fuente de verdad), así que Tab y click-to-focus quedan consistentes sin que la app los cablee.

Source

fn ime_allowed() -> bool

¿Habilitar IME (input method editor) en esta ventana? Default false. Con IME activo, el texto compuesto (CJK, acentos muertos, emoji picker) llega por App::on_ime como Commit, no por KeyEvent.text — por eso es opt-in: las apps que sólo leen on_key siguen funcionando igual. Las que editan texto (text-input, text-editor) la activan e implementan on_ime.

Source

fn on_ime(_model: &Self::Model, _event: &ImeEvent) -> Option<Self::Msg>

Maneja un evento de IME (sólo llega si App::ime_allowed es true). El flujo típico: Enabled → uno o más Preedit (texto en composición, a pintar subrayado en el caret) → Commit(texto) (el texto final, a insertar como si se hubiera tecleado) o Disabled. El Preedit no es definitivo: cada uno reemplaza al anterior, y un Commit o Preedit vacío lo cierra. Devolver Some(Msg) dispara una transición.

Source

fn ime_cursor_area(_model: &Self::Model) -> Option<(f32, f32, f32, f32)>

Área del caret en píxeles físicos (x, y, w, h) para posicionar la ventana de candidatos del IME (CJK) junto al cursor de texto. El runtime la consulta por frame cuando App::ime_allowed es true. None (default) deja que el sistema la ubique por defecto.

Source

fn on_wheel( _model: &Self::Model, _delta: WheelDelta, _cursor: (f32, f32), _modifiers: Modifiers, ) -> Option<Self::Msg>

Maneja una rueda del mouse. delta está normalizado a “líneas” (positivo arriba/izquierda, negativo abajo/derecha). En backends que reportan píxeles, llimphi-ui divide por 20 para aproximar.

Source

fn view_overlay(_model: &Self::Model) -> Option<View<Self::Msg>>

Capa de overlay opcional. Si devuelve Some(view), el runtime la pinta encima del árbol principal y los clicks/hover se rutean exclusivamente a ella (el árbol de fondo queda “bajo vidrio” hasta que se cierre el overlay). Pensado para menús contextuales, diálogos modales, popovers — el patrón usual es envolver los items en un scrim a pantalla completa con on_click = DismissOverlay para que los clicks afuera lo cierren.

La transición entre “con overlay” y “sin overlay” la maneja la app vía su Model: cuando el state diga “menu abierto”, view_overlay devuelve Some; cuando se cierre, None.

Source

fn on_file_drop(_model: &Self::Model, _path: PathBuf) -> Option<Self::Msg>

Maneja un drop de archivo desde el sistema operativo (drag&drop desde el file manager hacia la ventana). El runtime invoca este callback una vez por archivo soltado — si el usuario suelta varios, llega un evento por path. Devolver Some(Msg) dispara un update; None (default) ignora el drop.

Backend: mapea directamente winit::WindowEvent::DroppedFile(PathBuf). La posición del drop no se reporta porque winit no la expone hasta que el compositor la propague — en Wayland depende del extension data_device_manager, en X11 viene en el ClientMessage XDND.

Source

fn on_resize( _model: &Self::Model, _width: u32, _height: u32, ) -> Option<Self::Msg>

Maneja un redimensionado de la ventana. width/height son el nuevo tamaño en píxeles físicos (lo que reporta winit::WindowEvent::Resized y lo que recibe la surface). El runtime ya reconfiguró la surface y pedirá redraw; este callback es para que la app reaccione al nuevo viewport (recalcular layout dependiente del tamaño, emitir un evento resize, etc.). Devolver Some(Msg) dispara un update; None (default) lo ignora.

Source

fn on_scale_factor(_model: &Self::Model, _scale: f64) -> Option<Self::Msg>

Maneja un cambio del factor de escala de la ventana (scale_factor de winit: 1.0 en pantallas normales, 2.0 en HiDPI/Retina, fraccional con escalado del compositor). El runtime lo invoca una vez al arrancar (con el factor inicial de la ventana, tras init) y luego en cada WindowEvent::ScaleFactorChanged (mover la ventana entre monitores, cambiar el escalado del sistema). Es lo que permite, p. ej., que window.devicePixelRatio refleje el DPI real. Devolver Some(Msg) dispara un update; None (default) lo ignora.

Source

fn title() -> &'static str

Título de la ventana (sólo se lee al arrancar). Es el título inicial; para uno que cambie en runtime, ver App::window_title.

Source

fn window_title(_model: &Self::Model) -> Option<String>

Título dinámico de la ventana, derivado del modelo. El runtime lo consulta tras cada render y, si cambió, lo aplica con Window::set_title — así el título de la barra del SO puede reflejar el estado (p. ej. el medio que se reproduce). None (default) deja el título fijo de App::title; una app que no lo implemente no paga nada.

Source

fn secondary_view(_model: &Self::Model, _key: u64) -> Option<View<Self::Msg>>

Vista de una ventana OS secundaria identificada por key (la que se pasó a Handle::open_window). El runtime la pinta en su propia ventana y rutea sus eventos al mismo App::update — comparte modelo con la primaria. None (default, o para una key desconocida) deja la ventana en blanco. Las secundarias NO tienen capa de overlay (App::view_overlay es sólo de la primaria); para diálogos dentro de una secundaria, componerlos en su propio secondary_view.

Source

fn secondary_title(_model: &Self::Model, _key: u64) -> Option<String>

Título dinámico de una ventana secundaria (análogo a App::window_title para la primaria). None deja el título con el que se abrió.

Source

fn on_secondary_close(_model: &Self::Model, _key: u64) -> Option<Self::Msg>

El usuario cerró una ventana secundaria con el botón del SO. El runtime ya la destruyó; este callback es para que la app sincronice su modelo (p. ej. marcar el panel como cerrado). Devolver Some(Msg) dispara un update; None (default) no hace nada.

Source

fn app_id() -> Option<&'static str>

Identificador de aplicación. En Wayland se mapea al app_id del xdg-toplevel (lo que el compositor usa para reconocer la ventana, p. ej. mirada.greeter). None deja que el sistema asigne uno.

Source

fn initial_size() -> (u32, u32)

Tamaño lógico inicial de la ventana, en píxeles. El usuario puede redimensionar después; sólo se lee al arrancar.

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety".

Implementors§