PBToolboxAI v3 ← Site

toaster — n_pbt_toaster #

← Referencia de componentes · Índice de la guía

Notificaciones «toast» en una esquina de la pantalla: un mensaje que aparece, informa y desaparece sin bloquear al usuario ni interrumpir lo que está escribiendo.

▶ Verlo en vivo — Aplicación de demostración, mosaico Toaster: la vista previa, el código que lo genera y esta página, uno al lado del otro.


De un vistazo #

Objeton_pbt_toaster — no visual: no hay nada que colocar en la ventana
Sirve paraConfirmar una acción realizada con éxito, señalar una advertencia o un error, sin detener el trabajo en curso
RetornoNo bloqueante: of_show() devuelve el control de inmediato; las reacciones del usuario vuelven por eventos

El toast es una ventana independiente: flota por encima de su aplicación (o de toda la pantalla) y se cierra solo.

n_pbt_toaster lnv_toast

lnv_toast = create n_pbt_toaster
// ... configuracion ...
destroy lnv_toast

Inicio rápido #

n_pbt_toaster lnv_toast

lnv_toast = create n_pbt_toaster

lnv_toast.ipo_owner = this                       // ventana a la que se engancha el toast
lnv_toast.is_kind   = lnv_toast.KIND_SUCCESS     // icono verde + filete de exito
lnv_toast.is_text   = "Sus modificaciones se han [b]guardado[/b]."
lnv_toast.of_show()

destroy lnv_toast

Todo se configura mediante propiedades, y luego of_show() — que no acepta ningún argumento — hace aparecer la notificación.


Propiedades #

Deben establecerse antes de of_show.

PropiedadTipoPredeterminadoFunción
is_textstring""Cuerpo del mensaje. Admite el texto enriquecido con etiquetas
is_kindstringKIND_INFONivel: gobierna el icono y el color del filete. Constantes KIND_*
is_positionstringPOSITION_BOTTOM_RIGHTEsquina de anclaje. Constantes POSITION_*
ib_screenbooleanfalsefalse = anclado a la esquina de la ventana; true = anclado a la esquina de la pantalla, flotando por encima de todo
il_timeoutlongTIMEOUT_AUTOTiempo de visualización en milisegundos antes del cierre automático. TIMEOUT_AUTO (-1, el valor predeterminado) vale 4 s para una información pero hasta el clic para un error — un error que se borra en cuatro segundos es un error perdido. TIMEOUT_UNTIL_CLICKED (0) hace persistente cualquier toast; una duración explícita se respeta tal cual. Mientras el puntero permanece sobre un toast su cuenta atrás está suspendida, y una barra muestra el tiempo restante
is_titlestring""Línea de título en negrita encima del mensaje (toast enriquecido)
is_imagestring""Imagen ilustrativa a la izquierda, en lugar del icono de nivel (formas admitidas: ruta, mono:, recurso de DLL)
is_keystring""Clave del toast: volver a mostrar la misma clave actualiza el toast ya en pantalla en lugar de abrir un segundo. Es lo que necesita una notificación de progreso («Exportación 3/10» y luego «4/10»): cerrar y reabrir reiniciaría la animación y descolocaría la pila. Déjela vacía para un toast corriente
il_max_visiblelong5Número máximo de toasts en pantalla en la misma esquina (1 a 20). Más allá, los siguientes esperan y aparecen a medida que se libera sitio: un bucle de proceso que emite un toast por fila apilaba si no las ventanas fuera de la pantalla
ipo_ownerpowerobject—El objeto visual al que está enganchado el toast (su esquina de ventana sirve de referencia). Los eventos del toast también le llegan — es la única conexión que hacer
ipo_receiverpowerobject—Opcional, heredado: un objeto visual distinto en el que entregar los eventos, en lugar de ipo_owner. Déjelo vacío — el toaster ahora entrega sus eventos él mismo mediante ipo_owner

Constantes #

ConstanteValorUso
KIND_INFO"info"Información neutra
KIND_SUCCESS"success"Operación realizada con éxito
KIND_WARNING"warning"Advertencia
KIND_ERROR"error"Fallo
POSITION_TOP_LEFT"top-left"Esquina superior izquierda
POSITION_TOP_CENTER"top-center"Arriba, centrado
POSITION_TOP_RIGHT"top-right"Esquina superior derecha
POSITION_BOTTOM_LEFT"bottom-left"Esquina inferior izquierda
POSITION_BOTTOM_CENTER"bottom-center"Abajo, centrado
POSITION_BOTTOM_RIGHT"bottom-right"Esquina inferior derecha (predeterminado)

¿Por qué LEFT/RIGHT aquí y START/END en el resto? El toast es una ventana del sistema colocada en píxeles de pantalla, no un contenido que siga un sentido de lectura: una esquina de la pantalla no tiene «inicio». Por eso estas constantes siguen siendo deliberadamente físicas y no cambian de lado cuando la aplicación pasa a escritura de derecha a izquierda. Véase Idioma y RTL.


Métodos #

MétodoFunción
of_show ( ) → longMuestra la notificación construida a partir de las propiedades. Devuelve el identificador del toast (> 0), o un valor negativo en caso de error. No bloquea
of_close ( long al_id ) → longCierra un toast todavía visible, designado por el identificador devuelto por of_show. Devuelve 0, o -5 si el identificador está vacío o designa un toast que ya ha desaparecido
of_reset ( )Devuelve todas las propiedades de contenido a su valor predeterminado y borra los botones (ipo_owner e ipo_receiver se conservan: son conexiones, no contenido). Devuelve 0 una vez aplicado, -2 si el componente no está creado
of_process_events ( )Vacía la cola de retornos del toast y activa los eventos ue_toast_* correspondientes. El componente la llama él mismo mientras un toast está en pantalla: normalmente no tiene que hacerlo — véase más abajo
of_add_button (string as_key, string as_label {, string as_image }) → longAñade un botón de acción (3 como máximo) y devuelve cuántos hay. Un clic emite ue_toast_action(id, clave); of_reset borra los botones. Una etiqueta puede contener cualquier carácter — una coma, un signo igual — sin ser cortada
of_count ( ) → integerCuántos botones de acción lleva la notificación
of_keys_at ( integer ai_index ) → stringLa clave del botón en la posición ai_index (desde 1), o "" más allá de cualquiera de los extremos
of_has ( string as_key ) → boolean¿Se añadió un botón bajo esta clave? Preguntar evita añadir un segundo bajo una clave ya ocupada

Varios toasts mostrados en la misma esquina se apilan automáticamente. Cada uno lleva un aspa de cierre; el identificador devuelto por of_show permite distinguirlos en los eventos y cerrarlos desde su código.

La cuenta atrás se detiene mientras el puntero está sobre el toast: una notificación no debe desvanecerse ante los ojos de quien la lee. Una fina barra en la parte inferior muestra el tiempo restante — y explica así su desaparición. Un clic en el cuerpo responde y cierra, en ambos modos de alojamiento.

Una notificación creada con il_timeout = 0 permanece en pantalla mientras nadie la cierre: conserve su identificador para poder retirarla cuando termine la tarea que anuncia.

long ll_toast

// Notificacion persistente : permanecera visible hasta of_close.
inv_toaster.is_text = "Exportación en curso..."
inv_toaster.il_timeout = /*ms, 0 = sin cierre automatico*/ 0
ll_toast = inv_toaster.of_show()

// ... procesamiento largo ...

inv_toaster.of_close(/*key*/ ll_toast)

Eventos — el toast le responde #

Una notificación no es un simple «mostrar y olvidar»: puede decirle que se ha hecho clic en ella, que se ha elegido un botón de acción, o que se ha cerrado.

No tiene que cablear nada: fije ipo_owner (la ventana a la que se ancla el toast) y trate los eventos. El componente los recoge él mismo mientras un toast está en pantalla y los lanza en el objeto — sin receptor, sin temporizador.

1. Fijar ipo_owner en la ventana a la que se ancla el toast:

inv_toaster.ipo_owner = this      // la ventana a la que se ancla el toast

2. Tratar los eventos activados en el toaster:

EventoSe activa cuando
ue_toast_clicked (string as_key)Se hace clic en el cuerpo del toast (no en un botón)
ue_toast_action (string as_key, string as_action)Se hace clic en un botón de acción; as_action contiene la clave pasada a of_add_button
ue_toast_dismissed (string as_key)El toast se cierra: tiempo agotado, aspa de cierre, o después de una acción

Si no espera ninguna respuesta — ni botón de acción, ni clic en el cuerpo — no tiene ninguno de estos eventos que tratar: la notificación aparece y desaparece sola. Es el modo más sencillo, perfecto para una simple confirmación.


Ejemplos #

Los cuatro niveles #

inv_toaster.of_reset()
inv_toaster.is_kind = inv_toaster.KIND_INFO
inv_toaster.is_text = "Operación terminada."
inv_toaster.of_show()

inv_toaster.of_reset()
inv_toaster.is_kind = inv_toaster.KIND_SUCCESS
inv_toaster.is_text = "Sus modificaciones se han [b]guardado[/b]."
inv_toaster.of_show()

inv_toaster.of_reset()
inv_toaster.is_kind    = inv_toaster.KIND_WARNING
inv_toaster.il_timeout = 5000                        // un poco mas largo
inv_toaster.is_text    = "Poco espacio en disco en la unidad C:."
inv_toaster.of_show()

inv_toaster.of_reset()
inv_toaster.is_kind    = inv_toaster.KIND_ERROR
inv_toaster.il_timeout = 6000
inv_toaster.is_text    = "No se puede contactar con el servidor."
inv_toaster.of_show()

Elegir la esquina, en la ventana o en la pantalla #

// Anclado a la esquina superior derecha de la VENTANA (predeterminado : sigue a la aplicacion)
inv_toaster.is_position = inv_toaster.POSITION_TOP_RIGHT
inv_toaster.ib_screen   = false
inv_toaster.is_text     = "Anclado a la esquina de la ventana."
inv_toaster.of_show()
// Independiente : anclado a la esquina de la PANTALLA, visible aunque la ventana este minimizada
inv_toaster.is_position = inv_toaster.POSITION_TOP_RIGHT
inv_toaster.ib_screen   = true
inv_toaster.is_text     = "Proceso nocturno terminado."
inv_toaster.of_show()

Toast enriquecido: título, imagen y duración #

inv_toaster.of_reset()

inv_toaster.is_title    = "Copia de seguridad terminada"
inv_toaster.is_text     = "1 240 ficheros copiados en [b]\\servidor\backup[/b]."
inv_toaster.is_image    = "mono:img\backup.svg"
inv_toaster.il_timeout  = 8000                    // permanece 8 segundos
inv_toaster.of_show()

Notificación con botones de acción #

// event open : anclar el toaster una vez por todas ; los retornos llegan solos
inv_toaster.ipo_owner = this
// Proponer dos acciones ; timeout 0 = el toast espera la decision del usuario
inv_toaster.of_reset()

inv_toaster.is_title   = "Actualización disponible"
inv_toaster.is_text    = "La versión 2.0 está lista para instalarse."
inv_toaster.il_timeout = 0
inv_toaster.of_add_button(/*clave*/ "installer", /*etiqueta*/ "Instalar")
inv_toaster.of_add_button(/*clave*/ "plus_tard", /*etiqueta*/ "Mas tarde")
inv_toaster.of_show()
// event ue_toast_action de inv_toaster : (string as_key, string as_action)
choose case as_action
    case "installer" ; of_lancer_mise_a_jour()
    case "plus_tard" ; of_reporter(1)
end choose

Reaccionar al clic en el mensaje #

// event ue_toast_clicked de inv_toaster : (string as_key)
// El usuario ha hecho clic en el cuerpo del toast : abrir la pantalla correspondiente
Open(w_journal_import)

Notificar desde un procesamiento largo #

// Fin de una importacion : informar sin bloquear la pantalla de entrada de datos
inv_toaster.of_reset()

if ll_erreurs = 0 then
    inv_toaster.is_kind = inv_toaster.KIND_SUCCESS
    inv_toaster.is_text = "Importación terminada : [b]" + String(ll_lignes) + " líneas[/b] integradas."
else
    inv_toaster.is_kind    = inv_toaster.KIND_ERROR
    inv_toaster.il_timeout = 0                    // un error debe leerse
    inv_toaster.is_text    = "Importación interrumpida : " + String(ll_erreurs) + " errores."
end if

inv_toaster.of_show()

Buenas prácticas #


← Referencia de componentes · Índice de la guía