PBToolboxAI v4 ← Site

tilesbox — u_pbt_tilesbox #

← Referência dos componentes · Índice do guia

Painel de mosaicos agrupados ao estilo de um ecrã inicial: quatro tamanhos de mosaico, cores, emblemas, mosaicos animados, grupos recolhíveis e reorganização com o rato.

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


Em resumo #

Userobjectu_pbt_tilesbox
Classes de itemsn_pbt_tilesbox_group (grupo) → n_pbt_tilesbox_tile (mosaico)
Serve paraOferecer um ecrã inicial ou um lançador de funções: mosaicos clicáveis, legíveis à distância, arrumados por tema
Opções opt-inib_reorderable: mover e redimensionar os mosaicos com o rato

Início rápido #

// event open da janela

// Um mosaico adiciona-se no seu ENDERECO : o grupo, e depois o seu proprio identificador
uo_tiles.of_add_group(/*key*/ "office", /*title*/ "Gestão")

// Depois os seus mosaicos, cada um com o seu tamanhouo_tiles.of_add_tile(/*keys*/ "office/clients",   /*label*/ "Clientes", /*icon_file*/ "mono:img\clients.svg",   /*size*/ "medium")
uo_tiles.of_add_tile(/*keys*/ "office/invoices",  /*text*/ "Faturas",  /*image*/ "mono:img\factures.svg",  /*size*/ "medium")
uo_tiles.of_add_tile(/*keys*/ "office/stock",     /*text*/ "Stock",    /*image*/ "mono:img\stock.svg",     /*size*/ "small")
// event ue_tile_clicked de uo_tiles: (string as_keys)
choose case as_keys
    case "office/clients"  ; open(w_clients)
    case "office/invoices" ; open(w_invoices)
    case "office/stock"    ; open(w_stock)
end choose

O modelo: grupos e mosaicos #

O painel contém grupos, cada um com o seu título e o seu cabeçalho recolhível. Os mosaicos pertencem a um grupo: o respetivo identificador só é único dentro desse grupo. O acesso passa, portanto, sempre pelo caminho completo. As adições vivem no componente: um handle só transporta propriedades.

// Caminho obrigatorio: grupo e depois mosaico
uo_tiles.of_tile(/*keys*/ "office/invoices").is_badge = "12"

Os eventos transportam igualmente o endereço completo (as_keys, o grupo seguido do mosaico). Ver Base comum · Os items.


Propriedades #

PropriedadeTipoPredefiniçãoFunção
ib_reorderablebooleanfalseAutoriza o utilizador a reorganizar os mosaicos: com o rato, ou pelo teclado com Ctrl+Esquerda/Direita (uma posição no grupo, no sentido de leitura) e Ctrl+Cima/Baixo (para o grupo anterior ou seguinte); o clique direito redimensiona. Rato e teclado acionam o mesmo ue_tile_moved
is_scrollstringSCROLL_HORIZONTALSentido de deslocamento: SCROLL_VERTICAL (os mosaicos mudam de linha) ou SCROLL_HORIZONTAL (colunas ao estilo de um ecrã inicial)
ib_show_group_headersbooleantruefalse oculta os cabeçalhos de grupo. Útil quando o painel contém um único grupo: não há nada a nomear e o cabeçalho apenas consome altura. Sem cabeçalho deixa de haver galão: os grupos apresentam-se sempre expandidos
ii_anim_durationinteger180Duração em milissegundos da animação de recolher / expandir um grupo; 0 = instantâneo
ii_tile_unitinteger0Tamanho base de um mosaico, em pixels: cada formato (pequeno, médio, largo, grande) é um múltiplo dele, pelo que um valor torna todo o quadro mais denso ou mais arejado. 0 devolve-o ao tema
ii_badge_sizeinteger0Altura dos emblemas dos mosaicos em píxeis, para toda a caixa (0 = o tamanho que vem do tema). O tamanho da letra acompanha sozinho. A cor de um emblema pertence ao mosaico porque significa alguma coisa; o seu tamanho não
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_group (string as_key) → n_pbt_tilesbox_groupDevolve o handle de um grupo (criado no primeiro acesso). Num grupo que não existe não escreve nada — nunca cria o grupo, isso faz of_add_group; uma chave que não pode nomear um grupo (vazia, com / ou ``) dá um handle inerte que se relê vazio
of_add_group (string as_key, string as_title) → longAdiciona um grupo. Devolve 0 depois de aplicado, -5 se a chave estiver vazia, contiver um / ou um `, ou já estiver tomada, -2` se o componente não estiver criado
of_add_tile (string as_keys, string as_text, string as_image, string as_size) → longAdiciona um mosaico no seu endereço, "office/clients": o grupo onde aterra e depois o seu próprio identificador. Devolve 0 depois de aplicado, -5 se o endereço não for grupo/mosaico, se o grupo não tiver sido adicionado por of_add_group, se a chave já estiver tomada nesse grupo (ou vazia, ou contiver um `), -2` se o componente não estiver criado. Uma sobrecarga omite o ícone e o tamanho
of_tile (string as_keys) → n_pbt_tilesbox_tileDevolve o handle de um mosaico, pelo seu endereço (criado no primeiro acesso). Um endereço que não seja grupo/mosaico dá um handle inerte: não escreve nada e lê-se vazio
of_add_live_item (string as_keys, string as_text) → longAdiciona uma face à banda animada de um mosaico, no seu endereço; a partir de duas faces, o mosaico fá-las desfilar. A primeira face apaga is_live_text; of_tile(endereço).of_count() lê o número de faces. Devolve 0 depois de aplicado, -5 com um texto vazio ou se nenhum mosaico existir nesse endereço, -2 se o componente não estiver criado
of_clear_live_items (string as_keys) → longEsvazia a banda animada de um mosaico: deixa de desfilar e volta à sua face simples. Devolve 0 depois de aplicado, -5 se nenhum mosaico existir nesse endereço, -2 se o componente não estiver criado
of_remove_group (string as_key)Remove um grupo e todos os seus mosaicos. Devolve 0 depois de aplicado, -5 se esse grupo não existir, -2 se o componente não estiver criado
of_insert_tile (string as_keys, string as_text, integer ai_index)Insere um mosaico numa posição precisa dentro do seu grupo (posição contada a partir de 1). Devolve 0 depois de aplicado, -5 pelas mesmas recusas que of_add_tile, -2 se o componente não estiver criado
of_insert_tile (string as_keys, string as_text, string as_image, string as_size, integer ai_index)Idem, com o ícone e o tamanho (small / medium / wide / large): um mosaico é uma imagem com uma etiqueta por baixo, e o seu tamanho vê-se na grelha. Devolve 0 depois de aplicado, -5 pelas mesmas recusas que of_add_tile, -2 se o componente não estiver criado
of_move_tile (string as_keys, integer ai_index)Desloca um mosaico existente para outra posição do seu grupo, conservando o respetivo estado. Devolve 0 depois de aplicado, -5 se nenhum mosaico existir nesse endereço, -2 se o componente não estiver criado
of_remove_tile (string as_keys)Elimina um único mosaico, o resto do painel é preservado. Devolve 0 depois de aplicado, -5 se nenhum mosaico existir nesse endereço, -2 se o componente não estiver criado
of_clear ( )Esvazia o painel (grupos e mosaicos); os handles entregues para eles são libertados. Devolve 0 depois de aplicado, -2 se o componente não estiver criado
of_get_layout ( )Relê a disposição atual em JSON: os grupos pela sua ordem, recolhidos ou não, visíveis ou não, e os seus mosaicos por ordem com o tamanho e a visibilidade. Um texto opaco: guarde-o tal como está e devolva-o depois a of_set_layout
of_set_layout (string as_state_json)Restaura uma disposição lida com of_get_layout ou recebida por ue_layout_changed: ordem, grupos recolhidos, tamanhos e visibilidade. Um mosaico reencontra-se pelo seu grupo e pela sua chave; o que a disposição não nomeia mantém o seu lugar. Não lança nenhum evento. Devolve 0 depois de aplicado, -5 perante um texto vazio ou que não seja JSON, -2 se o componente não estiver criado
of_reset ( )Esvazia o conteúdo e repõe as propriedades na respetiva predefinição. Devolve 0 depois de aplicado, -2 se o componente não estiver criado

Num grupo — n_pbt_tilesbox_group #

MembroTipoPredefiniçãoFunção
is_titlestringa chaveTítulo apresentado no cabeçalho, formatação com etiquetas aceite
ib_collapsedbooleanfalseGrupo recolhido: os seus mosaicos ficam ocultos sob o cabeçalho. Defini-lo lança ue_group_toggled quando o estado muda, como um clique no cabeçalho
ib_enabledbooleantrueGrupo inteiro esbatido e inerte: o seu cabeçalho já não o recolhe, os seus mosaicos já não respondem, nenhum mosaico pode ser largado nele
ib_visiblebooleantrueGrupo oculto, sem ser eliminado do modelo
il_back_color · il_text_color · il_back_color_hover · il_text_color_hover · il_accentlong-1Cores do cabeçalho do grupo — fundo, título, ambos sob o ponteiro, e um filete de destaque sob o cabeçalho. Não descem para os mosaicos, que mantêm as suas

Num mosaico — n_pbt_tilesbox_tile #

MembroTipoPredefiniçãoFunção
is_titlestring""Texto mostrado no mosaico. Posto por of_add_tile; escrevê-lo aqui altera-o, lê-lo diz o que o mosaico mostra agora
is_imagestring""Ícone do mosaico (caminho em disco ou resources.dll:nome). Uma cadeia vazia retira o ícone
is_sizestringSIZE_MEDIUMTamanho: SIZE_SMALL, SIZE_MEDIUM, SIZE_WIDE, SIZE_LARGE
il_back_color · il_text_colorlong-1Fundo e texto deste mosaico, como RGB(r,g,b) (-1 = o que o tema der)
il_back_color_hover · il_text_color_hoverlong-1Os mesmos dois, mas sob o ponteiro
is_badgestring""Emblema apresentado no canto do mosaico (um contador, um estado curto)
il_badge_colorlong-1Fundo do emblema, em RGB do PowerBuilder (-1 = a cor que vem do tema; 0 é o preto)
is_live_textstring""Texto fixo sobreposto ao mosaico; a primeira face de of_add_live_item apaga-o (relê-se então vazio), formatação com etiquetas aceite
ib_enabledbooleantrueMosaico esbatido e não clicável
ib_visiblebooleantrueMosaico oculto, sem ser retirado do seu grupo

Os ícones aceitam todas as formas reconhecidas pela biblioteca: caminho, mono:, tint:, recurso de DLL. Num mosaico grande, é preferível uma imagem nítida em alta definição ou um SVG.


Os quatro tamanhos #

TamanhoEspaço ocupadoUtilização típica
small1 célulaAtalho secundário; a etiqueta não é apresentada, o tooltip assume esse papel
medium2 × 2 célulasTamanho de referência: ícone e etiqueta
wide4 × 2 célulasMosaico alongado, ideal para um texto animado
large4 × 4 célulasMosaico de destaque do ecrã

Eventos #

EventoAcionado quando
ue_tile_clicked (string as_keys)Um mosaico é clicado
ue_tile_moved (string as_keys, string as_to_key, long al_index)O utilizador deslocou um mosaico, com o rato ou com Ctrl+setas (of_move_tile não aciona nada): as_keys é o endereço de partida, as_to_key o grupo de destino, al_index a nova posição
ue_group_toggled (string as_key, boolean ab_collapsed)Um grupo é recolhido ou expandido: a partir do seu cabeçalho, ou pelo seu ib_collapsed definido pelo seu código (nada quando já está nesse estado)
ue_tile_context (string as_keys)Clique com o botão direito num mosaico
ue_tile_resized (string as_keys, string as_size)O utilizador deu outro tamanho a um mosaico a partir do seu menu do clique direito (só aparece enquanto ib_reorderable valer true); as_size transporta o novo tamanho
ue_layout_changed (string as_layout_json)O utilizador mudou a disposição: um mosaico deslocado, um mosaico redimensionado a partir do seu menu, um grupo recolhido ou expandido a partir do seu cabeçalho. Transporta a disposição inteira, o mesmo texto que of_get_layout. O que a aplicação muda por código não o lança (o ib_collapsed de um grupo só lança ue_group_toggled)
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)

Exemplos #

Tamanhos misturados num mesmo grupo #

// Partir de uma caixa vazia, com um grupo
uo_tiles.of_clear()
uo_tiles.of_add_group(/*key*/ "home", /*title*/ "Início")

// Quatro mosaicos, de quatro tamanhos
uo_tiles.of_add_tile(/*keys*/ "home/dashboard", /*text*/ "Painel de controlo", /*image*/ "mono:img\chart.svg",  /*size*/ "large")
uo_tiles.of_add_tile(/*keys*/ "home/clients", /*text*/ "Clientes",           /*image*/ "mono:img\users.svg",  /*size*/ "medium")
uo_tiles.of_add_tile(/*keys*/ "home/agenda",  /*text*/ "Agenda",             /*image*/ "mono:img\cal.svg",    /*size*/ "wide")
uo_tiles.of_add_tile(/*keys*/ "home/help",    /*text*/ "Ajuda",              /*image*/ "mono:img\help.svg",   /*size*/ "small")

Emblema, cor e mosaico animado #

// Local variables
n_pbt_tilesbox_tile lnv_tile

// Um emblema assinala um numero de elementos em espera
uo_tiles.of_tile(/*keys*/ "home/clients").is_badge = String(ll_new_count)

// Vermelho quando o atraso se torna critico, cor do tema caso contrario (-1)
if ll_new_count > 50 then
    uo_tiles.of_tile(/*keys*/ "home/clients").il_badge_color = RGB(/*red*/ 200, /*green*/ 30, /*blue*/ 30)
else
    uo_tiles.of_tile(/*keys*/ "home/clients").il_badge_color = -1
end if

// Uma cor propria destaca um mosaico : fundo, texto e aquilo em que cada um
// se torna sob o ponteiro
lnv_tile = uo_tiles.of_tile(/*keys*/ "home/dashboard")
lnv_tile.il_back_color = RGB(/*red*/ 0, /*green*/ 103, /*blue*/ 192)
lnv_tile.il_back_color_hover = RGB(/*red*/ 0, /*green*/ 80, /*blue*/ 150)
lnv_tile.il_text_color = RGB(/*red*/ 255, /*green*/ 255, /*blue*/ 255)

// Mosaico ANIMADO: cada face adicionada desfila a sua vez no mosaico. Uma
// face adiciona-se a partir do COMPONENTE, no endereco do mosaico
uo_tiles.of_clear_live_items(/*keys*/ "home/agenda")
uo_tiles.of_add_live_item(/*keys*/ "home/agenda", /*text*/ "3 reuniões hoje")
uo_tiles.of_add_live_item(/*keys*/ "home/agenda", /*text*/ "Reunião de equipa às 14h00")
uo_tiles.of_add_live_item(/*keys*/ "home/agenda", /*text*/ "2 lembretes em atraso")

Um texto fixo em vez de um desfile #

// is_live_text coloca UM texto permanente no mosaico (formatacao com etiquetas aceite)
uo_tiles.of_tile(/*keys*/ "home/dashboard").is_live_text = "[b]48[/b] encomendas do dia"

Grupos recolhíveis #

// Local variables
n_pbt_tilesbox_group lnv_admin

// Um grupo e os seus dois mosaicos, e depois um handle do grupo
uo_tiles.of_add_group(/*key*/ "admin", /*title*/ "Administração")
uo_tiles.of_add_tile(/*keys*/ "admin/users",  /*text*/ "Utilizadores", /*image*/ "mono:img\users.svg", /*size*/ "medium")
uo_tiles.of_add_tile(/*keys*/ "admin/params", /*text*/ "Parâmetros", /*image*/ "mono:img\gear.svg",  /*size*/ "medium")
lnv_admin = uo_tiles.of_group(/*key*/ "admin")

// Este grupo comeca recolhido: o utilizador abre-o se precisar
lnv_admin.ib_collapsed = true

// Um grupo inteiro pode tambem ser esbatido consoante os direitos
lnv_admin.ib_enabled = (is_profile = "ADMIN")
// event ue_group_toggled de uo_tiles
if as_key = "admin" and not ab_collapsed then of_trace("Abertura do painel de administração")

Um painel de grupo único, sem cabeçalho #

// Um so grupo nao tem nada a nomear: o seu cabecalho apenas consome altura.
// Sem cabecalho, tambem deixa de haver galao: os mosaicos ficam sempre visiveis.
uo_tiles.ib_show_group_headers = false
uo_tiles.of_add_group(/*key*/ "all", /*title*/ "")

Deslocar um mosaico entre dois grupos #

Com ib_reorderable = true, o utilizador arrasta um mosaico para onde quiser, incluindo de um grupo para outro. O evento ue_tile_moved fornece os dois grupos e a nova posição. Pelo teclado, o mosaico com o foco avança ou recua uma posição com Ctrl+Esquerda/Direita (no sentido de leitura: invertido da direita para a esquerda) e passa para o grupo anterior ou seguinte com Ctrl+Cima/Baixo — o mesmo ue_tile_moved, as mesmas recusas (chave já tomada, grupo desativado ou recolhido). A tecla Tab só para uma vez por grupo: as setas percorrem os mosaicos.

// Deixar o utilizador reordenar os mosaicos : false por omissao, e preciso pedir
uo_tiles.ib_reorderable = true
// event ue_tile_moved de uo_tiles
// as_keys = de onde vem, as_to_key = para onde vai, al_index = posicao
n_pbt_utils lnv_utils   // autoinstantiate: nada a criar, nada a destruir
if lnv_utils.of_parent(/*keys*/ as_keys) <> as_to_key then
    of_trace("Mosaico " + lnv_utils.of_leaf(/*keys*/ as_keys) + " deslocado de " + lnv_utils.of_parent(/*keys*/ as_keys) + " para " + as_to_key)
end if
// event ue_layout_changed de uo_tiles: conservar a disposicao escolhida
is_layout_json = as_layout_json
// Na abertura seguinte: repor o ecra tal como o utilizador o tinha arrumado
if is_layout_json <> "" then uo_tiles.of_set_layout(/*state_json*/ is_layout_json)

Para fixar o ecrã, basta desativar a reorganização:

// Freeze the screen : the tiles stay where they are
uo_tiles.ib_reorderable = false

Reorganizar a partir do código #

// Colocar o mosaico "help" no inicio do seu grupo (posicoes contadas a partir de 1)
uo_tiles.of_move_tile(/*keys*/ "home/help", /*index*/ 1)

// Inserir um novo mosaico na segunda posicao
uo_tiles.of_insert_tile(/*keys*/ "home/quotes", /*text*/ "Orçamentos", /*index*/ 2)

// Retirar um mosaico sem mexer no resto
uo_tiles.of_remove_tile(/*keys*/ "home/help")

// Cada chamada devolve -5 se o endereco nao nomear nada (ou, na insercao, uma chave ja tomada)

Reagir ao clique com o botão direito #

// event ue_tile_context de uo_tiles: (as_keys)
// Reter o mosaico visado e abrir em seguida o seu proprio menu contextual
n_pbt_utils lnv_utils   // autoinstantiate: nada a criar, nada a destruir

// Um so endereco : dividi-lo se as duas metades forem precisas.
is_target_group = lnv_utils.of_parent(/*keys*/ as_keys)
is_target_tile = lnv_utils.of_leaf(/*keys*/ as_keys)
of_open_tile_menu(PointerX(), PointerY())

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