PBToolboxAI v4 ← Site

statusbar — u_pbt_statusbar #

← Referência dos componentes · Índice do guia

Barra de estado com painéis: texto rico, ícones, larguras fixas ou automáticas, alinhamento à esquerda ou à direita, painéis clicáveis, mini-barra de progresso e estados coloridos.

▶ Ver ao vivo — Aplicação de demonstração, mosaico Statusbar: a pré-visualização, o código que o produz e esta página, lado a lado.


Em resumo #

Userobjectu_pbt_statusbar
Classe de itemsn_pbt_statusbar_panel (painel) · n_pbt_statusbar_menu_item (entrada de lista)
Serve paraApresentar no fundo da janela o estado da aplicação: contexto, progresso, alertas discretos
Opções opt-in—

Início rápido #

// event open da janela
// of_add_panel(id, texto, icone, alinhamento, largura)
// a chave encontra o painel mais tarde ; largura 0 = ajustada ao texto
uo_status.of_add_panel(/*key*/ "state",  /*text*/ "Pronto",         /*icon_file*/ "", /*align*/ uo_status.ALIGN_START,  /*width*/ 0)
uo_status.of_add_panel(/*key*/ "pos",   /*text*/ "Linha 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)
// Atualizar um painel a qualquer momento, pelo seu identificador
uo_status.of_panel(/*key*/ "state").is_text = "A guardar..."

O modelo: painéis com chave #

A barra é uma sequência de painéis, adicionados por ordem. Um painel recebe um identificador na criação: é através dele que se volta a encontrá-lo mais tarde, para mudar o seu texto, o seu ícone ou o seu estado.

O identificador é uma chave de endereçamento, não um interruptor de interatividade:

// O painel mostra um novo texto
uo_status.of_panel(/*key*/ "state").is_text = "3 registos modificados"

Ver Base comum · Os items.


Propriedades #

PropriedadeTipoPredefiniçãoFunção
ib_show_resize_gripbooleanfalseApresenta a pega de redimensionamento no canto final da barra; arrastá-la redimensiona a janela (a partir do canto inferior esquerdo na leitura da direita para a esquerda). Só é desenhada enquanto a janela se puder redimensionar assim: maximizada ou sem rebordo redimensionável, desaparece e a propriedade continua definida
is_theme_stylestring""Estilo visual do componente (constantes THEME_STYLE_*); vazio = o da aplicação, seguido a cada mudança
is_theme_modestring""Variante clara ou escura (constantes THEME_MODE_*); vazio = a da aplicação, seguida a cada mudança
il_theme_accentlong-1Cor de destaque deste componente (-1 = destaque da aplicação, ou o do tema)
is_tooltipstring""Tooltip simples apresentado ao passar sobre o componente
is_super_tooltip_titlestring""Título do tooltip enriquecido (prevalece sobre is_tooltip)
is_super_tooltip_textstring""Texto do tooltip enriquecido (aceita marcação enriquecida)
is_super_tooltip_imagestring""Imagem do tooltip enriquecido

Métodos #

MétodoFunção
of_add_panel (string as_key, string as_text, string as_icon_file, string as_align, integer ai_width)Acrescenta um painel no fim da barra. Devolve 0 depois de aplicado, -5 se a chave já estiver tomada ou contiver / ou ` (uma chave vazia acrescenta um painel decorativo), -2` se o componente não estiver criado
of_add_sep ( )Insere uma quebra de grupo na posição atual. Os painéis já se separam por um traço fino : esta é mais larga, para que os painéis antes e depois se leiam como dois grupos. Chame-a entre dois of_add_panel ; abre o grupo do painel que a segue (do lado do anterior quando vem em último). Um separador não é um painel : não conta nem para of_count / of_keys_at nem nas posições. Devolve 0 depois de aplicado, -2 se o componente não estiver criado
of_insert_panel (string as_key, string as_text, string as_icon_file, string as_align, integer ai_width, integer ai_index)Insere um painel numa posição precisa, contada em painéis a partir de 1 (0 ou menos = em primeiro, além do último = no fim). Mesmas recusas que of_add_panel. Devolve 0 depois de aplicado, -5 se a chave já estiver tomada ou contiver / ou `, -2` se o componente não estiver criado
of_move_panel (string as_key, integer ai_index)Desloca um painel existente para outra posição, contada em painéis a partir de 1. Devolve 0 depois de aplicado, -5 perante uma chave vazia ou que a barra nunca recebeu, -2 se o componente não estiver criado
of_remove_panel (string as_key)Remove um único painel, com a sua lista pendente ; os restantes conservam o seu estado. Devolve 0 depois de aplicado, -5 perante uma chave vazia ou que a barra nunca recebeu, -2 se o componente não estiver criado
of_panel (string as_key) → n_pbt_statusbar_panelDevolve o handle de um painel (criado no primeiro acesso). Uma chave vazia (painel decorativo), um endereço ou uma lista não designam nada: o seu handle não escreve em lado nenhum e relê-se vazio
of_flash_panel (string as_key, string as_text, long al_ms)Mostra uma mensagem durante al_ms milissegundos e depois volta a mostrar o texto do painel (al_ms ≤ 0 = 2 segundos). A mensagem passa POR CIMA do texto: is_text relê-se sempre como o texto do painel, nunca como a mensagem. Devolve 0 depois de aplicado, -5 perante uma chave vazia, um endereço ou uma chave que a barra nunca recebeu, -2 se o componente não estiver criado
of_add_menu_item (string as_keys, string as_label) · (as_keys, as_label, as_image)Acrescenta uma entrada à lista pendente de um painel : as_keys tem dois níveis, o painel e depois a entrada ("enc/utf8"). A partir da primeira entrada o painel torna-se um seletor : o clique abre a lista, e a escolha volta por ue_panel_menu_clicked com o mesmo endereço. Um rótulo vazio retoma a chave. Devolve 0 depois de aplicado, -5 perante um endereço que não tenha dois níveis, um painel que a barra nunca recebeu ou uma entrada já tomada, -2 se o componente não estiver criado
of_insert_menu_item (string as_keys, string as_label, integer ai_index) · (as_keys, as_label, as_image, ai_index)Insere uma entrada numa posição precisa (contada a partir de 1). Devolve 0 depois de aplicado, -5 perante um argumento inválido (chave vazia, endereço errado), -2 se o componente não estiver criado
of_add_menu_separator (string as_key)Linha de separação na lista do painel as_key. Um separador não tem endereço: só of_clear_menu o retira, e uma lista feita apenas de separadores não é uma lista (nem seta nem clique). Devolve 0 depois de aplicado, -5 perante uma chave vazia ou um painel que a barra nunca recebeu, -2 se o componente não estiver criado
of_remove_menu_item (string as_keys)Retira uma única entrada; ida a última, o painel recupera o comportamento que ib_clickable lhe dá. Devolve 0 depois de aplicado, -5 perante um argumento inválido (chave vazia, endereço errado), -2 se o componente não estiver criado
of_move_menu_item (string as_keys, integer ai_index)Move uma entrada para outra posição da sua lista. Devolve 0 depois de aplicado, -5 perante um argumento inválido (chave vazia, endereço errado), -2 se o componente não estiver criado
of_menu_item (string as_keys) → n_pbt_statusbar_menu_itemDevolve o handle de uma entrada (criado no primeiro acesso), para a acinzentar, marcar ou renomear. Um endereço sem dois níveis não designa nada : o seu handle não escreve em lado nenhum e relê-se vazio
of_clear_menu (string as_key)Retira toda a lista pendente; o painel recupera o comportamento que ib_clickable lhe dá. Devolve 0 depois de aplicado, -5 perante um argumento inválido (chave vazia, endereço errado), -2 se o componente não estiver criado
of_clear ( )Esvazia a barra: todos os painéis e todos os separadores. Devolve 0 depois de aplicado, -2 se o componente não estiver criado
of_reset ( )Esvazia a barra e repõe as propriedades nos seus valores predefinidos. Devolve 0 depois de aplicado, -2 se o componente não estiver criado

Os argumentos de of_add_panel #

ArgumentoValoresEfeito
as_keyslivre, ou ""Chave do painel, aquela pela qual se volta a encontrá-lo. Vazio = painel decorativo, nem endereçável nem clicável
as_texttextoConteúdo do painel. As etiquetas de texto rico são aceites
as_icon_filecaminho de imagem, ou ""Ícone apresentado antes do texto (formas aceites)
as_alignALIGN_START (predefinição) ou ALIGN_ENDLado para o qual o painel é empurrado. Valores lógicos: START = início da leitura (esquerda na escrita da esquerda para a direita). Os aliases físicos "left" / "right" continuam a ser aceites
ai_widthpíxeis, ou 0Largura fixa. 0 = o painel ajusta-se ao seu conteúdo

Sobre um painel — n_pbt_statusbar_panel #

MembroTipoPredefiniçãoFunção
is_textstring""Texto do painel, etiquetas de texto rico aceites
is_imagestring""Ícone do painel, modificável a qualquer momento
ib_enabledbooleantruePainel esbatido e não clicável
ib_visiblebooleantruePainel ocultado, sem ser retirado da barra
ii_progressinteger—Mini barra de progresso no painel, ao lado do texto, de 0 a 100 (acima de 100 a barra fica cheia e relê-se 100); um valor negativo fá-la desaparecer. Relê-se -1 quando o painel não tem barra (e 0 para uma barra a 0 %)
is_statestring""Estado semântico do painel, que colore o seu texto e marca o seu rebordo inicial: ver as constantes abaixo. Qualquer outro valor equivale a « nenhum estado » e relê-se vazio; um painel desativado fica a cinzento, marca de estado incluída
ib_indeterminatebooleanfalseBarra animada sem valor, para um processamento de duração desconhecida. Independente de ii_progress, que continua a ser a percentagem exata
ib_clickablebooleanfalseO painel reage ao clique. Opt-in: um painel mantém-se inerte enquanto não for pedido, conservando a sua chave — é pilotado e traz uma dica. Um painel com lista pendente já é clicável

Sobre uma entrada de lista — n_pbt_statusbar_menu_item #

Obtida com of_menu_item(/*keys*/ "enc/utf8"): o endereço tem dois níveis, o painel e depois a entrada. A lista é um menu nativo: uma propriedade alterada enquanto está aberto vê-se na abertura seguinte.

MembroTipoPredefiniçãoFunção
is_labelstring""Texto da entrada
is_imagestring""Imagem antes do texto, alterável a qualquer momento
ib_enabledbooleantrueEntrada acinzentada: mostrada, mas impossível de escolher
ib_checkedbooleanfalseMarca antes da entrada, para o valor em uso
ib_visiblebooleantrueEntrada retirada da lista sem ser eliminada: voltar a mostrá-la não exige nada mais
// 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 #

ConstanteValorUtilização
STATE_NONE""Nenhum estado: aspeto normal
STATE_INFO"info"Informação
STATE_WARNING"warning"Aviso
STATE_ERROR"error"Erro
STATE_SUCCESS"success"Sucesso

Tal como para qualquer propriedade com valores predefinidos, deve utilizar-se a constante em vez da cadeia de caracteres:

// The panel takes the colors of a warning
uo_status.of_panel(/*key*/ "state").is_state = n_pbt_statusbar_panel.STATE_WARNING

Eventos #

EventoAcionado quando
ue_panel_clicked (string as_key)Um painel clicável (ib_clickable) é clicado
ue_panel_double_clicked (string as_key)Um painel clicável recebe um duplo clique — o atalho clássico por trás de Linha 12, Col 4 que abre um "Ir para a linha". Nunca num painel com lista pendente: o seu primeiro clique abriu a lista
ue_panel_rclicked (string as_key, long al_x, long al_y)Um painel com chave recebe um clique direito — clicável ou não (um menu de contexto não é uma ativação), nunca se estiver desativado. Um só evento por clique direito. al_x e al_y são píxeis de ecrã ; para um menu PowerBuilder, PopMenu(PointerX(), PointerY()) da sua janela
ue_panel_menu_clicked (string as_keys)Foi escolhida uma entrada de uma lista pendente de painel (ver of_add_menu_item). as_keys leva os dois níveis: o painel, depois a entrada — "enc/utf8". Pelo teclado, Enter, Espaço, Seta para cima ou para baixo abrem a lista. Um painel retirado, desativado ou ocultado enquanto a sua lista está aberta fecha-a, e nada é acionado
ue_ready ( )O componente terminou o carregamento; tudo o que foi enviado antes foi reproduzido
ue_runtime_missing ( )O runtime WebView2 está ausente: o componente permanece vazio
ue_bg_color (long al_color)O componente calculou a cor de fundo do respetivo tema; o userobject já a adotou (backcolor)

Com o teclado #

A barra é uma única paragem de tabulação: só entram nela os painéis feitos para serem clicados, e as setas percorrem-nos.

TeclaEfeito
SetasPassam ao painel interativo anterior / seguinte, em ciclo; os painéis de apresentação e os desativados são saltados
Home / EndPrimeiro / último painel interativo
Enter ou EspaçoAciona o painel — ou seja, ue_panel_clicked, ou a abertura da respetiva lista pendente, se a tiver

Um painel que se limita a apresentar não é um controlo: não é focável nem anunciado como tal. Um painel clicável mas desativado permanece, esse sim, anunciado como indisponível em vez de passar por texto. Uma barra de progresso anuncia o seu valor, e uma indeterminada não anuncia nenhum — essa ausência é o sentido da palavra.

O foco sobrevive à reconstrução da barra: ela é redesenhada a cada mudança de texto e, sem isto, o foco cairia a cada segundo numa barra que apresenta um relógio.


Exemplos #

Larguras fixas e larguras automáticas #

// Largura 0 : o painel ocupa exatamente o espaco do seu texto
uo_status.of_add_panel(/*key*/ "", /*text*/ "Painel ajustado ao conteúdo", /*icon_file*/ "", /*align*/ uo_status.ALIGN_START, /*width*/ 0)

// Largura fixa em pixeis : util quando o texto muda com frequencia,
// para que os paineis vizinhos nao se desloquem a cada atualizacao
uo_status.of_add_panel(/*key*/ "pos", /*text*/ "Linha 1, Col 1", /*icon_file*/ "", /*align*/ uo_status.ALIGN_START, /*width*/ 150)

// Um painel empurrado para a extremidade oposta
uo_status.of_add_panel(/*key*/ "clock", /*text*/ "12:00", /*icon_file*/ "", /*align*/ uo_status.ALIGN_END, /*width*/ 140)

Ícones e painéis clicáveis #

// Uma chave torna o painel enderecavel ; ib_clickable torna-o clicavel
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()   // traco de separacao entre dois grupos de paineis
uo_status.of_add_panel(/*key*/ "conn", /*text*/ "Ligado",   /*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)

// So estes dois respondem ao clique (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 rico num painel #

Os painéis aceitam as etiquetas de texto rico: estilos, cores e pequenas imagens diretamente no texto.

// Uma saudacao a esquerda
uo_status.of_add_panel(/*key*/ "", /*text*/ "Bem-vindo [b]ao[/b] [accent]PBToolboxAI[/accent]", &
                       /*icon_file*/ "", /*align*/ uo_status.ALIGN_START, /*width*/ 0)

// O estado da ligacao a direita
uo_status.of_add_panel(/*key*/ "", /*text*/ "[green]Em linha[/green] [picture=mono:img\plug.svg,14,14]", &
                       /*icon_file*/ "", /*align*/ uo_status.ALIGN_END, /*width*/ 0)
// O texto rico vale igualmente para as atualizacoes
uo_status.of_panel(/*key*/ "state").is_text = "[b]" + String(ll_changed) + "[/b] registos modificados"

Acompanhar um processamento demorado #

// Local variables
n_pbt_statusbar_panel lnv_import

// O painel de importacao, depois o seu handle para o acompanhar
uo_status.of_add_panel(/*key*/ "import", /*text*/ "Importação", /*icon_file*/ "", /*align*/ uo_status.ALIGN_START, /*width*/ 220)
lnv_import = uo_status.of_panel(/*key*/ "import")
// No ciclo de processamento : a mini-barra acompanha o progresso
lnv_import.ii_progress = ll_percent
lnv_import.is_text     = "Importação " + String(ll_percent) + " %"
// No fim : ocultar a mini-barra e assinalar o resultado
lnv_import.ii_progress = -1                       // valor negativo = barra ocultada
lnv_import.is_text     = "Importação concluída"
lnv_import.is_state    = lnv_import.STATE_SUCCESS

Assinalar um alerta discreto #

// Local variables
n_pbt_statusbar_panel lnv_panel

// O painel da ligacao
lnv_panel = uo_status.of_panel(/*key*/ "conn")

// Sem ligacao : o painel mostra um erro ; ligado : volta ao normal
if not ib_connected then
    lnv_panel.is_text  = "Sem ligação"
    lnv_panel.is_state = lnv_panel.STATE_ERROR
else
    lnv_panel.is_text  = "Ligado"
    lnv_panel.is_state = lnv_panel.STATE_NONE   // regresso ao aspeto normal
end if

Adaptar a barra ao contexto #

// Ocultar um painel sem o suprimir : voltara a ocupar o seu lugar mais tarde
uo_status.of_panel(/*key*/ "user").ib_visible = ib_user_signed_in

// Esbate-lo quando a acao correspondente nao faz sentido
uo_status.of_panel(/*key*/ "save").ib_enabled = ib_document_open

// Reorganizar : colocar o painel de estado a cabeca (posicoes contadas a partir de 1)
uo_status.of_move_panel(/*key*/ "state", /*index*/ 1)

// Retirar um painel que se tornou inutil
uo_status.of_remove_panel(/*key*/ "import")

A pega de redimensionamento #

// Arrastar a pega de canto redimensiona a janela (oculta enquanto estiver maximizada)
uo_status.ib_show_resize_grip = true

Boas práticas #

Herdado da base comum #

Estes membros existem em todos os componentes visuais — não são próprios deste. São detalhados uma só vez, nos capítulos transversais; esta tabela apenas diz onde os ler.

MembrosFunçãoDetalhado em
of_count · of_keys_at · of_hasPercorrer o que o componente contém3.2 Os items
of_resetRepor o componente a zero3.6 Repor um componente a zero: of_reset()
of_register_shortcut · of_clear_shortcutsAtalhos de teclado do componente3.5 Os atalhos de teclado
of_is_created · of_is_ready · of_get_last_errorSe nasceu, se está pronto, o que falhou3.7 Diagnóstico
of_save_as_png · of_save_as_jpgExportar a renderização como imagem3.8 Exportar a representação como imagem
of_set_redrawAgrupar as alterações num único repinte3.10 Boas práticas
of_preload_iconsÍcones mostrados sem atrasoApresentação instantânea: of_icon
of_set_translationTraduzir uma legenda do componente5.2 Adaptar uma etiqueta: of_set_translation
of_focus_webviewDar o foco ao componente6.4 Teclado e focus
of_print · of_print_to_pdfImprimir, ou escrever um PDF6.9 Imprimir
of_set_property · of_get_property · of_component_nameControlar uma propriedade pelo nome3.1 O motor de propriedades

Duas ajudas não são herdadas: of_icon e of_escape_markup vivem em n_pbt_utils. Declare um — n_pbt_utils lnv_utils, nada a criar — e chame-as nele.


← Referência dos componentes · Índice do guia