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§
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§
Sourcefn on_key(_model: &Self::Model, _event: &KeyEvent) -> Option<Self::Msg>
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.
Sourcefn on_focus(_model: &Self::Model, _id: Option<u64>) -> Option<Self::Msg>
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.
Sourcefn ime_allowed() -> bool
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.
Sourcefn on_ime(_model: &Self::Model, _event: &ImeEvent) -> Option<Self::Msg>
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.
Sourcefn ime_cursor_area(_model: &Self::Model) -> Option<(f32, f32, f32, f32)>
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.
Sourcefn on_wheel(
_model: &Self::Model,
_delta: WheelDelta,
_cursor: (f32, f32),
_modifiers: Modifiers,
) -> Option<Self::Msg>
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.
Sourcefn view_overlay(_model: &Self::Model) -> Option<View<Self::Msg>>
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.
Sourcefn on_file_drop(_model: &Self::Model, _path: PathBuf) -> Option<Self::Msg>
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.
Sourcefn on_resize(
_model: &Self::Model,
_width: u32,
_height: u32,
) -> Option<Self::Msg>
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.
Sourcefn on_scale_factor(_model: &Self::Model, _scale: f64) -> Option<Self::Msg>
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.
Sourcefn title() -> &'static str
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.
Sourcefn window_title(_model: &Self::Model) -> Option<String>
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.
Sourcefn secondary_view(_model: &Self::Model, _key: u64) -> Option<View<Self::Msg>>
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.
Sourcefn secondary_title(_model: &Self::Model, _key: u64) -> Option<String>
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ó.
Sourcefn on_secondary_close(_model: &Self::Model, _key: u64) -> Option<Self::Msg>
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.
Sourcefn app_id() -> Option<&'static str>
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.
Sourcefn initial_size() -> (u32, u32)
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".