statusbar — u_pbt_statusbar #
← Referencia de componentes · Índice de la guía
Barra de estado con paneles: texto enriquecido, iconos, anchuras fijas o automáticas, alineación a la izquierda o a la derecha, paneles en los que se puede hacer clic, mini barra de progreso y estados con color.
▶ Verlo en vivo — Aplicación de demostración, mosaico Statusbar: la vista previa, el código que lo genera y esta página, uno al lado del otro.
De un vistazo #
| Userobject | u_pbt_statusbar |
| Clase de items | n_pbt_statusbar_panel (panel) · n_pbt_statusbar_menu_item (entrada de lista) |
| Sirve para | Mostrar en la parte inferior de la ventana el estado de la aplicación: contexto, avance, avisos discretos |
| Opciones opt-in | — |
Inicio rápido #
// event open de la ventana
// of_add_panel(id, texto, icono, alineacion, anchura)
// la clave encuentra el panel mas tarde ; anchura 0 = ajustada al texto
uo_status.of_add_panel(/*key*/ "state", /*text*/ "Listo", /*icon_file*/ "", /*align*/ uo_status.ALIGN_START, /*width*/ 0)
uo_status.of_add_panel(/*key*/ "pos", /*text*/ "Línea 12, Col 4", /*icon_file*/ "", /*align*/ uo_status.ALIGN_START, /*width*/ 0)
uo_status.of_add_panel(/*key*/ "clock", /*text*/ "12:00", /*icon_file*/ "", /*align*/ uo_status.ALIGN_END, /*width*/ 140)
// Actualizar un panel en cualquier momento, mediante su identificador
uo_status.of_panel(/*key*/ "state").is_text = "Guardando..."
El modelo: paneles con clave #
La barra es una sucesión de paneles, añadidos por orden. Un panel recibe un identificador al crearse: es por él como se le encuentra después para cambiar su texto, su icono o su estado.
El identificador es una clave de direccionamiento, no un interruptor de interactividad:
- Identificador indicado: el panel se puede volver a encontrar — se cambia su contenido, se le pone una información sobre herramientas. Sigue siendo inerte: una barra de estado muestra ante todo, y un panel como
Línea 12, Col 4no debe parecer pulsable. Recibe sin embargo el clic derecho (ue_panel_rclicked) : un menú contextual « Copiar » no es una activación. - Identificador vacío: el panel es puramente decorativo. No se puede encontrar ni pulsar, y no se le puede adjuntar ninguna información sobre herramientas. Dé un identificador a todos sus paneles: no cuesta nada y deja la puerta abierta. Cuenta sin embargo en
of_county en las posiciones, yof_keys_atdevuelve para él una clave vacía. - Para hacer un panel pulsable, pídalo:
of_panel(/*key*/ "id").ib_clickable = true. Un panel dotado de una lista desplegable (of_add_menu_item) ya lo es.
// El panel muestra un texto nuevo
uo_status.of_panel(/*key*/ "state").is_text = "3 registros modificados"
Véase Base común · Los items.
Propiedades #
| Propiedad | Tipo | Predeterminado | Función |
|---|---|---|---|
ib_show_resize_grip | boolean | false | Muestra el asa de redimensionamiento en la esquina del final de la barra; arrastrarla redimensiona la ventana (desde la esquina inferior izquierda en lectura de derecha a izquierda). Solo se dibuja mientras la ventana pueda redimensionarse así: maximizada o sin borde redimensionable, desaparece y la propiedad sigue establecida |
is_theme_style | string | "" | Estilo visual del componente (constantes THEME_STYLE_*); vacío = el de la aplicación, seguido en cada cambio |
is_theme_mode | string | "" | Variante clara u oscura (constantes THEME_MODE_*); vacío = la de la aplicación, seguida en cada cambio |
il_theme_accent | long | -1 | Color de acento de este componente (-1 = acento de la aplicación, o el del tema) |
is_tooltip | string | "" | Tooltip simple mostrado al pasar el ratón por el componente |
is_super_tooltip_title | string | "" | Título del tooltip enriquecido (prevalece sobre is_tooltip) |
is_super_tooltip_text | string | "" | Texto del tooltip enriquecido (se acepta el marcado enriquecido) |
is_super_tooltip_image | string | "" | Imagen del tooltip enriquecido |
Métodos #
| Método | Función | |
|---|---|---|
of_add_panel (string as_key, string as_text, string as_icon_file, string as_align, integer ai_width) | Añade un panel al final de la barra. Devuelve 0 una vez aplicado, -5 si la clave ya está tomada o contiene / o ` | (una clave vacía añade un panel decorativo), -2` si el componente no está creado |
of_add_sep ( ) | Inserta una ruptura de grupo en la posición actual. Los paneles ya se separan con una línea fina : esta es más ancha, para que los paneles de antes y de después se lean como dos grupos. Llámela entre dos of_add_panel ; abre el grupo del panel que la sigue (del lado del anterior cuando viene la última). Un separador no es un panel : no cuenta ni para of_count / of_keys_at ni en las posiciones. Devuelve 0 una vez aplicado, -2 si el componente no está creado | |
of_insert_panel (string as_key, string as_text, string as_icon_file, string as_align, integer ai_width, integer ai_index) | Inserta un panel en una posición concreta, contada en paneles a partir de 1 (0 o menos = el primero, más allá del último = al final). Mismos rechazos que of_add_panel. Devuelve 0 una vez aplicado, -5 si la clave ya está tomada o contiene / o ` | , -2` si el componente no está creado |
of_move_panel (string as_key, integer ai_index) | Desplaza un panel existente a otra posición, contada en paneles a partir de 1. Devuelve 0 una vez aplicado, -5 ante una clave vacía o que la barra nunca recibió, -2 si el componente no está creado | |
of_remove_panel (string as_key) | Elimina un solo panel, con su lista desplegable ; los demás conservan su estado. Devuelve 0 una vez aplicado, -5 ante una clave vacía o que la barra nunca recibió, -2 si el componente no está creado | |
of_panel (string as_key) → n_pbt_statusbar_panel | Devuelve el handle de un panel (creado en el primer acceso). Una clave vacía (panel decorativo), una dirección o una lista no designan nada: su handle no escribe en ninguna parte y se relee vacío | |
of_flash_panel (string as_key, string as_text, long al_ms) | Muestra un mensaje durante al_ms milisegundos y luego vuelve a mostrar el texto del panel (al_ms ≤ 0 = 2 segundos). El mensaje pasa POR ENCIMA del texto: is_text se relee siempre como el texto del panel, nunca como el mensaje. Devuelve 0 una vez aplicado, -5 ante una clave vacía, una dirección o una clave que la barra nunca recibió, -2 si el componente no está creado | |
of_add_menu_item (string as_keys, string as_label) · (as_keys, as_label, as_image) | Añade una entrada a la lista desplegable de un panel : as_keys tiene dos niveles, el panel y luego la entrada ("enc/utf8"). Desde la primera entrada el panel se vuelve un selector : el clic abre la lista, y la elección vuelve por ue_panel_menu_clicked con la misma dirección. Una etiqueta vacía toma la clave. Devuelve 0 una vez aplicado, -5 ante una dirección que no tiene dos niveles, un panel que la barra nunca recibió o una entrada ya tomada, -2 si el componente no está creado | |
of_insert_menu_item (string as_keys, string as_label, integer ai_index) · (as_keys, as_label, as_image, ai_index) | Inserta una entrada en una posición precisa (contada desde 1). Devuelve 0 una vez aplicado, -5 ante un argumento no válido (clave vacía, dirección errónea), -2 si el componente no está creado | |
of_add_menu_separator (string as_key) | Línea de separación en la lista del panel as_key. Un separador no tiene dirección: solo of_clear_menu lo retira, y una lista hecha solo de separadores no es una lista (ni flecha ni clic). Devuelve 0 una vez aplicado, -5 ante una clave vacía o un panel que la barra nunca recibió, -2 si el componente no está creado | |
of_remove_menu_item (string as_keys) | Quita una sola entrada; ida la última, el panel recupera el comportamiento que le da ib_clickable. Devuelve 0 una vez aplicado, -5 ante un argumento no válido (clave vacía, dirección errónea), -2 si el componente no está creado | |
of_move_menu_item (string as_keys, integer ai_index) | Mueve una entrada a otra posición de su lista. Devuelve 0 una vez aplicado, -5 ante un argumento no válido (clave vacía, dirección errónea), -2 si el componente no está creado | |
of_menu_item (string as_keys) → n_pbt_statusbar_menu_item | Devuelve el handle de una entrada (creado en el primer acceso), para atenuarla, marcarla o renombrarla. Una dirección sin dos niveles no designa nada : su handle no escribe en ningún sitio y se relee vacío | |
of_clear_menu (string as_key) | Quita toda la lista desplegable; el panel recupera el comportamiento que le da ib_clickable. Devuelve 0 una vez aplicado, -5 ante un argumento no válido (clave vacía, dirección errónea), -2 si el componente no está creado | |
of_clear ( ) | Vacía la barra: todos los paneles y todos los separadores. Devuelve 0 una vez aplicado, -2 si el componente no está creado | |
of_reset ( ) | Vacía la barra y devuelve las propiedades a su valor predeterminado. Devuelve 0 una vez aplicado, -2 si el componente no está creado |
Los argumentos de of_add_panel #
| Argumento | Valores | Efecto |
|---|---|---|
as_keys | libre, o "" | Clave del panel, con la que se le vuelve a encontrar después. Vacío = panel decorativo, ni direccionable ni pulsable |
as_text | texto | Contenido del panel. Se acepta el texto enriquecido con etiquetas |
as_icon_file | ruta de imagen, o "" | Icono mostrado antes del texto (formas aceptadas) |
as_align | ALIGN_START (predeterminado) o ALIGN_END | Lado hacia el que se empuja el panel. Valores lógicos: START = inicio de la lectura (izquierda en escritura de izquierda a derecha). Los alias físicos "left" / "right" siguen aceptándose |
ai_width | píxeles, o 0 | Anchura fija. 0 = el panel se ajusta a su contenido |
En un panel — n_pbt_statusbar_panel #
| Miembro | Tipo | Predeterminado | Función |
|---|---|---|---|
is_text | string | "" | Texto del panel, se acepta el texto enriquecido con etiquetas |
is_image | string | "" | Icono del panel, modificable en cualquier momento |
ib_enabled | boolean | true | Panel atenuado y sin clic |
ib_visible | boolean | true | Panel oculto, sin ser retirado de la barra |
ii_progress | integer | — | Minibarra de progreso en el panel, junto al texto, de 0 a 100 (por encima de 100 la barra está llena y se relee 100); un valor negativo la hace desaparecer. Se relee -1 cuando el panel no tiene barra (y 0 para una barra al 0 %) |
is_state | string | "" | Estado semántico del panel, que colorea su texto y marca su borde inicial: véanse las constantes más abajo. Cualquier otro valor equivale a « ningún estado » y se relee vacío; un panel desactivado aparece atenuado, marca de estado incluida |
ib_indeterminate | boolean | false | Barra animada sin valor, para un tratamiento de duración desconocida. Independiente de ii_progress, que sigue siendo el porcentaje exacto |
ib_clickable | boolean | false | ¿Reacciona el panel al clic? Opt-in: un panel permanece inerte mientras no se pida, conservando su clave — se pilota y lleva una información sobre herramientas. Un panel con lista desplegable ya es pulsable |
En una entrada de lista — n_pbt_statusbar_menu_item #
Obtenida con of_menu_item(/*keys*/ "enc/utf8"): la dirección tiene dos niveles, el panel y luego la entrada. La lista es un menú nativo: una propiedad cambiada mientras está abierto se ve en la siguiente apertura.
| Miembro | Tipo | Predeterminado | Función |
|---|---|---|---|
is_label | string | "" | Texto de la entrada |
is_image | string | "" | Imagen delante del texto, modificable en cualquier momento |
ib_enabled | boolean | true | Entrada atenuada: se muestra, pero no se puede elegir |
ib_checked | boolean | false | Marca delante de la entrada, para el valor en uso |
ib_visible | boolean | true | Entrada retirada de la lista sin ser eliminada: volver a mostrarla no requiere nada más |
// The menu of the encoding panel, entry by entry
uo_status.of_add_menu_item(/*keys*/ "enc/utf8", /*label*/ "UTF-8")
uo_status.of_add_menu_item(/*keys*/ "enc/ansi", /*label*/ "ANSI")
uo_status.of_menu_item(/*keys*/ "enc/utf8").ib_checked = true // the current value
uo_status.of_menu_item(/*keys*/ "enc/ansi").ib_enabled = false // not available here
Constantes de estado #
| Constante | Valor | Uso |
|---|---|---|
STATE_NONE | "" | Ningún estado: apariencia normal |
STATE_INFO | "info" | Información |
STATE_WARNING | "warning" | Advertencia |
STATE_ERROR | "error" | Error |
STATE_SUCCESS | "success" | Éxito |
Como para toda propiedad con valores predefinidos, utilice la constante en lugar de la cadena:
// The panel takes the colors of a warning
uo_status.of_panel(/*key*/ "state").is_state = n_pbt_statusbar_panel.STATE_WARNING
Eventos #
| Evento | Se activa cuando |
|---|---|
ue_panel_clicked (string as_key) | Se hace clic en un panel pulsable (ib_clickable) |
ue_panel_double_clicked (string as_key) | Un panel pulsable recibe un doble clic — el atajo clásico detrás de Línea 12, Col 4 que abre un "Ir a la línea". Nunca en un panel con lista desplegable: su primer clic abrió la lista |
ue_panel_rclicked (string as_key, long al_x, long al_y) | Un panel con clave recibe un clic derecho — clicable o no (un menú contextual no es una activación), nunca si está desactivado. Un solo evento por clic derecho. al_x y al_y son píxeles de pantalla ; para un menú PowerBuilder, PopMenu(PointerX(), PointerY()) de su ventana |
ue_panel_menu_clicked (string as_keys) | Se ha elegido una entrada de una lista desplegable de panel (véase of_add_menu_item). as_keys lleva los dos niveles: el panel, luego la entrada — "enc/utf8". Con el teclado, Intro, Espacio, Flecha arriba o abajo abren la lista. Un panel retirado, desactivado u ocultado mientras su lista está abierta la cierra, y no se activa nada |
ue_ready ( ) | El componente ha terminado de cargarse; todo lo enviado antes se ha reproducido |
ue_runtime_missing ( ) | El runtime WebView2 está ausente: el componente permanece vacío |
ue_bg_color (long al_color) | El componente ha calculado el color de fondo de su tema; el userobject ya lo ha adoptado (backcolor) |
Con el teclado #
La barra es una sola parada de tabulación: solo entran en ella los paneles hechos para ser pulsados, y las flechas los recorren.
| Tecla | Efecto |
|---|---|
| Flechas | Pasan al panel interactivo anterior / siguiente, en bucle; los paneles de visualización y los desactivados se saltan |
| Inicio / Fin | Primer / último panel interactivo |
| Intro o Espacio | Dispara el panel — es decir, ue_panel_clicked, o la apertura de su lista desplegable si la tiene |
Un panel que se limita a mostrar no es un control: no es enfocable ni se anuncia como tal. Un panel pulsable pero desactivado sí permanece anunciado como no disponible, en lugar de pasar por texto. Una barra de progreso anuncia su valor, y una indeterminada no anuncia ninguno — esa ausencia es el sentido de la palabra.
El foco sobrevive a la reconstrucción de la barra: se redibuja en cada cambio de texto, y sin esto el foco caería cada segundo en una barra que muestra un reloj.
Ejemplos #
Anchuras fijas y anchuras automáticas #
// Anchura 0 : el panel ocupa exactamente el espacio de su texto
uo_status.of_add_panel(/*key*/ "", /*text*/ "Panel ajustado al contenido", /*icon_file*/ "", /*align*/ uo_status.ALIGN_START, /*width*/ 0)
// Anchura fija en pixeles : util cuando el texto cambia a menudo,
// para que los paneles vecinos no se muevan en cada actualizacion
uo_status.of_add_panel(/*key*/ "pos", /*text*/ "Línea 1, Col 1", /*icon_file*/ "", /*align*/ uo_status.ALIGN_START, /*width*/ 150)
// Un panel empujado al extremo opuesto
uo_status.of_add_panel(/*key*/ "clock", /*text*/ "12:00", /*icon_file*/ "", /*align*/ uo_status.ALIGN_END, /*width*/ 140)
Iconos y paneles con clic #
// Una clave hace el panel direccionable ; ib_clickable lo hace pulsable
uo_status.of_add_panel(/*key*/ "save", /*text*/ "Guardado", /*icon_file*/ "mono:img\save.svg", /*align*/ uo_status.ALIGN_START, /*width*/ 0)
uo_status.of_add_sep() // linea de separacion entre dos grupos de paneles
uo_status.of_add_panel(/*key*/ "conn", /*text*/ "Conectado", /*icon_file*/ "mono:img\plug.svg", /*align*/ uo_status.ALIGN_START, /*width*/ 0)
uo_status.of_add_panel(/*key*/ "user", /*text*/ "Alex Martin", /*icon_file*/ "mono:img\user.svg", /*align*/ uo_status.ALIGN_END, /*width*/ 160)
// Solo estos dos responden al clic (ue_panel_clicked)
uo_status.of_panel(/*key*/ "conn").ib_clickable = true
uo_status.of_panel(/*key*/ "user").ib_clickable = true
// event ue_panel_clicked de uo_status
choose case as_key
case "conn" ; open(w_connection_settings)
case "user" ; open(w_profile)
end choose
Texto enriquecido en un panel #
Los paneles aceptan el texto enriquecido con etiquetas: estilos, colores y pequeñas imágenes directamente en el texto.
// Una bienvenida a la izquierda
uo_status.of_add_panel(/*key*/ "", /*text*/ "Bienvenido [b]a[/b] [accent]PBToolboxAI[/accent]", &
/*icon_file*/ "", /*align*/ uo_status.ALIGN_START, /*width*/ 0)
// El estado de la conexion a la derecha
uo_status.of_add_panel(/*key*/ "", /*text*/ "[green]En línea[/green] [picture=mono:img\plug.svg,14,14]", &
/*icon_file*/ "", /*align*/ uo_status.ALIGN_END, /*width*/ 0)
// El texto enriquecido vale tambien para las actualizaciones
uo_status.of_panel(/*key*/ "state").is_text = "[b]" + String(ll_changed) + "[/b] registros modificados"
Seguir un proceso largo #
// Local variables
n_pbt_statusbar_panel lnv_import
// El panel de importacion, luego su handle para seguirlo
uo_status.of_add_panel(/*key*/ "import", /*text*/ "Importación", /*icon_file*/ "", /*align*/ uo_status.ALIGN_START, /*width*/ 220)
lnv_import = uo_status.of_panel(/*key*/ "import")
// En el bucle de proceso : la mini barra sigue el avance
lnv_import.ii_progress = ll_percent
lnv_import.is_text = "Importación " + String(ll_percent) + " %"
// Al final : ocultar la mini barra y senalar el resultado
lnv_import.ii_progress = -1 // valor negativo = barra oculta
lnv_import.is_text = "Importación finalizada"
lnv_import.is_state = lnv_import.STATE_SUCCESS
Señalar un aviso discreto #
// Local variables
n_pbt_statusbar_panel lnv_panel
// El panel de la conexion
lnv_panel = uo_status.of_panel(/*key*/ "conn")
// Sin conexion : el panel muestra un error ; conectado : vuelve a la normalidad
if not ib_connected then
lnv_panel.is_text = "Sin conexión"
lnv_panel.is_state = lnv_panel.STATE_ERROR
else
lnv_panel.is_text = "Conectado"
lnv_panel.is_state = lnv_panel.STATE_NONE // vuelta a la apariencia normal
end if
Adaptar la barra al contexto #
// Ocultar un panel sin eliminarlo : mas tarde recuperara su sitio
uo_status.of_panel(/*key*/ "user").ib_visible = ib_user_signed_in
// Atenuarlo cuando la accion correspondiente no tiene sentido
uo_status.of_panel(/*key*/ "save").ib_enabled = ib_document_open
// Reorganizar : colocar el panel de estado al principio (posiciones contadas a partir de 1)
uo_status.of_move_panel(/*key*/ "state", /*index*/ 1)
// Retirar un panel que ya no sirve
uo_status.of_remove_panel(/*key*/ "import")
El asa de redimensionamiento #
// Arrastrar el asa de esquina redimensiona la ventana (oculta mientras esta maximizada)
uo_status.ib_show_resize_grip = true
Buenas prácticas #
- Dé una anchura fija a los paneles cuyo texto cambia a menudo (posición del cursor, contadores): los paneles vecinos dejarán de saltar en cada actualización.
- Un panel es inerte por defecto: pida el clic con
ib_clickable, y deje sin reacción los paneles que solo muestran. - Reserve el final de la barra (
ALIGN_END) a la información estable (hora, usuario, conexión) y el principio (ALIGN_START) al contexto actual; en lectura de derecha a izquierda, los dos lados se invierten solos. - Emplee
is_stateen lugar de colores en el texto: el estado sigue tanto el tema claro como el oscuro. - Recuerde devolver
is_stateaSTATE_NONEyii_progressa un valor negativo en cuanto el aviso o el proceso haya terminado. - Una barra de estado no es un registro: más allá de cinco o seis paneles, es preferible una notificación toaster.
- Si el avance merece más que una mini barra de panel, pase a la progressbar.
Heredado de la base común #
Estos miembros existen en todos los componentes visuales — no son propios de este. Se detallan una sola vez, en los capítulos transversales; esta tabla solo dice dónde leerlos.
| Miembros | Función | Detallado en |
|---|---|---|
of_count · of_keys_at · of_has | Recorrer lo que el componente contiene | 3.2 Los items |
of_reset | Poner el componente a cero | 3.6 Poner un componente a cero: of_reset() |
of_register_shortcut · of_clear_shortcuts | Atajos de teclado del componente | 3.5 Los atajos de teclado |
of_is_created · of_is_ready · of_get_last_error | Si ha nacido, si está listo, qué ha fallado | 3.7 Diagnóstico |
of_save_as_png · of_save_as_jpg | Exportar el render como imagen | 3.8 Exportar la representación como imagen |
of_set_redraw | Agrupar los cambios en un solo repintado | 3.10 Buenas prácticas |
of_preload_icons | Iconos mostrados sin retardo | Visualización instantánea: of_icon |
of_set_translation | Traducir una etiqueta del componente | 5.2 Adaptar una etiqueta: of_set_translation |
of_focus_webview | Dar el foco al componente | 6.4 Teclado y foco |
of_print · of_print_to_pdf | Imprimir, o escribir un PDF | 6.9 Imprimir |
of_set_property · of_get_property · of_component_name | Controlar una propiedad por su nombre | 3.1 El motor de propiedades |
Dos ayudas no se heredan: of_icon y of_escape_markup viven en n_pbt_utils. Declare uno — n_pbt_utils lnv_utils, nada que crear — y llámelas sobre él.