PBToolboxAI v1 ← 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-in

Início rápido #

// event open da janela
n_pbt_tilesbox_group lnv_grp

// of_add_group devolve o handle do grupo: e nele que se penduram os mosaicos
lnv_grp = uo_tuiles.of_add_group(/*group_id*/ "gestion", /*title*/ "Gestão")

lnv_grp.of_add_tile(/*id*/ "clients",   /*label*/ "Clientes", /*icon_file*/ "mono:img\clients.svg",   /*size*/ "medium")
lnv_grp.of_add_tile(/*id*/ "factures",  /*label*/ "Faturas",  /*icon_file*/ "mono:img\factures.svg",  /*size*/ "medium")
lnv_grp.of_add_tile(/*id*/ "stock",     /*label*/ "Stock",    /*icon_file*/ "mono:img\stock.svg",     /*size*/ "small")
// event ue_tile_clicked de uo_tuiles: (string as_group, string as_id)
choose case as_group + "/" + as_id
    case "gestion/clients"  ; open(w_clients)
    case "gestion/factures" ; open(w_factures)
    case "gestion/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, e as adições vivem no handle do grupo.

// Caminho obrigatorio: grupo e depois mosaico
uo_tuiles.of_group("gestion").of_tile("factures").is_badge = "12"

Os eventos transportam igualmente o caminho completo (as_group seguido de as_id). Ver Base comum · Os items.


Propriedades #

PropriedadeTipoPredefiniçãoFunção
ib_reorderablebooleanfalseAutoriza o utilizador a deslocar os mosaicos com o rato (aciona ue_tile_moved)
is_scrollstringSCROLL_VERTICALSentido 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_stylestringfluentEstilo visual do componente (constantes THEME_STYLE_*)
is_theme_modestringlightVariante clara ou escura (constantes THEME_MODE_*)
il_theme_accentlong-1Cor de destaque deste componente (-1 = destaque 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_id)n_pbt_tilesbox_groupDevolve o handle de um grupo (criado no primeiro acesso)
of_add_group (string as_group_id, string as_title)n_pbt_tilesbox_groupAdiciona um grupo e devolve o respetivo handle
of_remove_group (string as_id)Elimina um grupo e todos os seus mosaicos
of_insert_tile (string as_group, string as_id, string as_text, integer ai_index)Insere um mosaico numa posição precisa dentro do seu grupo (posição contada a partir de 0)
of_insert_tile (string as_group, string as_id, 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
of_move_tile (string as_group, string as_id, integer ai_index)Desloca um mosaico existente para outra posição do seu grupo, conservando o respetivo estado
of_remove_tile (string as_group, string as_id)Elimina um único mosaico, o resto do painel é preservado
of_clear ( )Esvazia o painel (grupos e mosaicos)
of_get_layout ( )Relê a disposição atual em JSON: grupos, mosaicos, ordem e tamanhos. Guarde-a e devolva-a com of_set_layout
of_set_layout (string as_state_json)Repõe uma disposição lida com of_get_layout ou recebida com ue_layout_changed
of_reset ( )Esvazia o conteúdo e repõe as propriedades na respetiva predefinição

Num grupo — n_pbt_tilesbox_group #

MembroTipoPredefiniçãoFunção
is_titlestring""Título apresentado no cabeçalho, formatação com etiquetas aceite
ib_collapsedbooleanfalseGrupo recolhido: os seus mosaicos ficam ocultos sob o cabeçalho
ib_enabledbooleantrueGrupo inteiro esbatido e inerte
ib_visiblebooleantrueGrupo oculto, sem ser eliminado do modelo
of_tile (string as_id)n_pbt_tilesbox_tileDevolve o handle de um mosaico deste grupo
of_add_tile (as_id, as_label, as_icon_file, as_size)n_pbt_tilesbox_tileAdiciona um mosaico a este grupo e devolve o respetivo handle

Num mosaico — n_pbt_tilesbox_tile #

MembroTipoPredefiniçãoFunção
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_colorlong0Fundo do emblema, em RGB do PowerBuilder (0 = a cor que vem do tema)
is_live_textstring""Texto sobreposto ao mosaico, formatação com etiquetas aceite
ib_enabledbooleantrueMosaico esbatido e não clicável
ib_visiblebooleantrueMosaico oculto, sem ser retirado do seu grupo
of_add_live_item (string as_text)Adiciona uma face à faixa animada; a partir de duas faces, o mosaico fá-las desfilar
of_clear_live_items ( )Esvazia a faixa animada: o mosaico deixa de desfilar

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_group, string as_id)Um mosaico é clicado
ue_tile_moved (string as_group, string as_id, string as_to_group, long al_index)Um mosaico foi deslocado: as_group é o grupo de origem, as_to_group o grupo de destino, al_index a nova posição
ue_group_toggled (string as_group, boolean ab_collapsed)Um grupo é recolhido ou expandido a partir do seu cabeçalho
ue_tile_context (string as_group, string as_id)Clique com o botão direito num mosaico
ue_tile_resized (string as_group, string as_id, string as_size)O tamanho de um mosaico mudou; as_size transporta o novo tamanho
ue_layout_changed (string as_layout_json)A disposição mudou — o utilizador moveu ou redimensionou um mosaico. Transporta a disposição inteira, não apenas o que se moveu
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 #

n_pbt_tilesbox_group lnv_grp

uo_tuiles.of_clear()
lnv_grp = uo_tuiles.of_add_group(/*group_id*/ "accueil", /*title*/ "Início")

lnv_grp.of_add_tile(/*id*/ "tableau", /*label*/ "Painel de controlo", /*icon_file*/ "mono:img\chart.svg",  /*size*/ "large")
lnv_grp.of_add_tile(/*id*/ "clients", /*label*/ "Clientes",           /*icon_file*/ "mono:img\users.svg",  /*size*/ "medium")
lnv_grp.of_add_tile(/*id*/ "agenda",  /*label*/ "Agenda",             /*icon_file*/ "mono:img\cal.svg",    /*size*/ "wide")
lnv_grp.of_add_tile(/*id*/ "aide",    /*label*/ "Ajuda",              /*icon_file*/ "mono:img\help.svg",   /*size*/ "small")

Emblema, cor e mosaico animado #

n_pbt_tilesbox_tile lnv_tuile

// Um emblema assinala um numero de elementos em espera
uo_tuiles.of_group("accueil").of_tile("clients").is_badge = String(ll_nouveaux)

// Vermelho quando o atraso se torna critico, cor do tema caso contrario (0)
if ll_nouveaux > 50 then
    uo_tuiles.of_group("accueil").of_tile("clients").il_badge_color = RGB(200, 30, 30)
else
    uo_tuiles.of_group("accueil").of_tile("clients").il_badge_color = 0
end if

// Uma cor propria destaca um mosaico : fundo, texto e aquilo em que cada um
// se torna sob o ponteiro
lnv_tuile = uo_tuiles.of_group("accueil").of_tile("tableau")
lnv_tuile.il_back_color = RGB(0, 103, 192)
lnv_tuile.il_back_color_hover = RGB(0, 80, 150)
lnv_tuile.il_text_color = RGB(255, 255, 255)

// Mosaico ANIMADO: cada face adicionada desfila a sua vez no mosaico
lnv_tuile = uo_tuiles.of_group("accueil").of_tile("agenda")
lnv_tuile.of_clear_live_items()
lnv_tuile.of_add_live_item(/*text*/ "3 reuniões hoje")
lnv_tuile.of_add_live_item(/*text*/ "Reunião de equipa às 14h00")
lnv_tuile.of_add_live_item(/*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_tuiles.of_group("accueil").of_tile("tableau").is_live_text = "[b]48[/b] encomendas do dia"

Grupos recolhíveis #

n_pbt_tilesbox_group lnv_admin

lnv_admin = uo_tuiles.of_add_group(/*group_id*/ "admin", /*title*/ "Administração")
lnv_admin.of_add_tile(/*id*/ "users",  /*label*/ "Utilizadores", /*icon_file*/ "mono:img\users.svg", /*size*/ "medium")
lnv_admin.of_add_tile(/*id*/ "params", /*label*/ "Parâmetros",   /*icon_file*/ "mono:img\gear.svg",  /*size*/ "medium")

// 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_profil = "ADMIN")
// event ue_group_toggled de uo_tuiles
if as_group = "admin" and not ab_collapsed then of_tracer("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_tuiles.ib_show_group_headers = false
uo_tuiles.of_add_group(/*group_id*/ "tout", /*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.

uo_tuiles.ib_reorderable = true    // false por omissao : e preciso pedir
// event ue_tile_moved de uo_tuiles
// as_group = grupo de origem, as_to_group = grupo de destino, al_index = posicao
if as_group <> as_to_group then
    of_tracer("Mosaico " + as_id + " deslocado de " + as_group + " para " + as_to_group)
end if
uo_tuiles.of_get_layout()    // solicitar a disposicao para a conservar
// event ue_layout_changed de uo_tuiles: conservar a disposicao escolhida
is_disposition = as_layout_json
// Na abertura seguinte: repor o ecra tal como o utilizador o tinha arrumado
if is_disposition <> "" then uo_tuiles.of_set_layout(is_disposition)

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

uo_tuiles.ib_reorderable = false

Reorganizar a partir do código #

// Colocar o mosaico "aide" no inicio do seu grupo (posicoes contadas a partir de 0)
uo_tuiles.of_move_tile(/*group*/ "accueil", /*id*/ "aide", /*index*/ 0)

// Inserir um novo mosaico na segunda posicao
uo_tuiles.of_insert_tile(/*group*/ "accueil", /*id*/ "devis", /*text*/ "Orçamentos", /*index*/ 1)

// Retirar um mosaico sem mexer no resto
uo_tuiles.of_remove_tile(/*group*/ "accueil", /*id*/ "aide")

Reagir ao clique com o botão direito #

// event ue_tile_context de uo_tuiles: (as_group, as_id)
// Reter o mosaico visado e abrir em seguida o seu proprio menu contextual
is_groupe_vise = as_group
is_tuile_visee = as_id
of_ouvrir_menu_tuile(PointerX(), PointerY())

Boas práticas #


← Referência dos componentes · Índice do guia