PBToolboxAI v4 ← Site

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 #

Userobjectu_pbt_statusbar
Clase de itemsn_pbt_statusbar_panel (panel) · n_pbt_statusbar_menu_item (entrada de lista)
Sirve paraMostrar 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:

// 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 #

PropiedadTipoPredeterminadoFunción
ib_show_resize_gripbooleanfalseMuestra 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_stylestring""Estilo visual del componente (constantes THEME_STYLE_*); vacío = el de la aplicación, seguido en cada cambio
is_theme_modestring""Variante clara u oscura (constantes THEME_MODE_*); vacío = la de la aplicación, seguida en cada cambio
il_theme_accentlong-1Color de acento de este componente (-1 = acento de la aplicación, o el del tema)
is_tooltipstring""Tooltip simple mostrado al pasar el ratón por el componente
is_super_tooltip_titlestring""Título del tooltip enriquecido (prevalece sobre is_tooltip)
is_super_tooltip_textstring""Texto del tooltip enriquecido (se acepta el marcado enriquecido)
is_super_tooltip_imagestring""Imagen del tooltip enriquecido

Métodos #

MétodoFunció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_panelDevuelve 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_itemDevuelve 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 #

ArgumentoValoresEfecto
as_keyslibre, o ""Clave del panel, con la que se le vuelve a encontrar después. Vacío = panel decorativo, ni direccionable ni pulsable
as_texttextoContenido del panel. Se acepta el texto enriquecido con etiquetas
as_icon_fileruta de imagen, o ""Icono mostrado antes del texto (formas aceptadas)
as_alignALIGN_START (predeterminado) o ALIGN_ENDLado 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_widthpíxeles, o 0Anchura fija. 0 = el panel se ajusta a su contenido

En un panel — n_pbt_statusbar_panel #

MiembroTipoPredeterminadoFunción
is_textstring""Texto del panel, se acepta el texto enriquecido con etiquetas
is_imagestring""Icono del panel, modificable en cualquier momento
ib_enabledbooleantruePanel atenuado y sin clic
ib_visiblebooleantruePanel oculto, sin ser retirado de la barra
ii_progressinteger—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_statestring""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_indeterminatebooleanfalseBarra animada sin valor, para un tratamiento de duración desconocida. Independiente de ii_progress, que sigue siendo el porcentaje exacto
ib_clickablebooleanfalse¿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.

MiembroTipoPredeterminadoFunción
is_labelstring""Texto de la entrada
is_imagestring""Imagen delante del texto, modificable en cualquier momento
ib_enabledbooleantrueEntrada atenuada: se muestra, pero no se puede elegir
ib_checkedbooleanfalseMarca delante de la entrada, para el valor en uso
ib_visiblebooleantrueEntrada 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 #

ConstanteValorUso
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 #

EventoSe 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.

TeclaEfecto
FlechasPasan al panel interactivo anterior / siguiente, en bucle; los paneles de visualización y los desactivados se saltan
Inicio / FinPrimer / último panel interactivo
Intro o EspacioDispara 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 #

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.

MiembrosFunciónDetallado en
of_count · of_keys_at · of_hasRecorrer lo que el componente contiene3.2 Los items
of_resetPoner el componente a cero3.6 Poner un componente a cero: of_reset()
of_register_shortcut · of_clear_shortcutsAtajos de teclado del componente3.5 Los atajos de teclado
of_is_created · of_is_ready · of_get_last_errorSi ha nacido, si está listo, qué ha fallado3.7 Diagnóstico
of_save_as_png · of_save_as_jpgExportar el render como imagen3.8 Exportar la representación como imagen
of_set_redrawAgrupar los cambios en un solo repintado3.10 Buenas prácticas
of_preload_iconsIconos mostrados sin retardoVisualización instantánea: of_icon
of_set_translationTraducir una etiqueta del componente5.2 Adaptar una etiqueta: of_set_translation
of_focus_webviewDar el foco al componente6.4 Teclado y foco
of_print · of_print_to_pdfImprimir, o escribir un PDF6.9 Imprimir
of_set_property · of_get_property · of_component_nameControlar una propiedad por su nombre3.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.


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