carousel — u_pbt_carousel #
← Referência dos componentes · Índice do guia
carousel faz desfilar elementos dos quais só um está à frente: o Cover Flow do iTunes — o elemento atual de frente, os seus vizinhos inclinados em perspetiva e sobrepostos, um reflexo por baixo —, uma faixa plana onde vários elementos se veem inteiros, uma pilha de cartões, ou um banner em toda a superfície que mostra um elemento de cada vez. Cada elemento é uma imagem, um texto formatado ou um cartão (imagem, título, subtítulo, corpo escrito por um modelo, etiquetas, emblema). O utilizador clica num vizinho, desliza com inércia, roda a roda do rato, escreve as primeiras letras de um título ou usa o teclado;
ue_current_changeddiz-lhe que elemento está à frente. O carrossel preenche-se à mão ou a partir de um DataStore, e pode avançar sozinho, com um botão PAUSA.
▶ Ver ao vivo — Aplicação de demonstração, mosaico Carousel: a pré-visualização, o código que o produz e esta página, lado a lado.
Em resumo #
| Userobject | u_pbt_carousel |
| Classe de itens | n_pbt_carousel_item (of_item(key)) |
| Serve para | Folhear capas, produtos, fotografias, fichas, notícias ou passos de boas-vindas |
| Princípio | Um elemento tem uma chave única; só um está à frente de cada vez, e desenha-se como imagem, texto ou cartão |
| Opções opt-in | ib_veto_changes, ib_loop, ib_reflection, il_autoplay_ms |
| Limite no modo de demonstração | Os 6 primeiros elementos visíveis desenhados — ver o modo de demonstração |
Início rápido #
// Three album covers : a key, a title, a picture
uo_covers.of_add_item(/*key*/ "c1", /*title*/ "Northern Lights", /*image*/ "img\packimages.dll:SVG/COVERS/COVER-01")
uo_covers.of_add_item(/*key*/ "c2", /*title*/ "Blue Hour", /*image*/ "img\packimages.dll:SVG/COVERS/COVER-02")
uo_covers.of_add_item(/*key*/ "c3", /*title*/ "Evergreen", /*image*/ "img\packimages.dll:SVG/COVERS/COVER-03")
// A reflection under the covers, as on a glossy floor
uo_covers.ib_reflection = true
// event ue_current_changed of uo_covers : (string as_from_key, string as_key)
// The album now in front, in the title of the window ("" : the carousel is empty)
if as_key <> "" then Parent.Title = this.of_item(/*key*/ as_key).is_title
Quatro disposições, três faces #
is_style escolhe a disposição: STYLE_COVERFLOW (por omissão) põe o elemento atual de frente e inclina os seus vizinhos em perspetiva, sobrepostos, espalhados pela largura disponível e mais escuros com a distância (ii_angle, ii_spacing, ib_shade); STYLE_CAROUSEL alinha uma faixa plana onde vários elementos se veem inteiros; STYLE_STACK empilha cartões — o atual à frente, os seguintes atrás dele, os anteriores afastados para o lado; STYLE_HERO mostra um único elemento em toda a superfície, o seguinte a deslizar ou a aparecer em transparência (is_transition): o banner de um painel de controlo. Um mosaico mantém uma proporção (is_item_ratio; vazio: 1:1 para imagens, 3:4 para cartões, 16:9 para textos) e o conteúdo de um cartão ou de um texto segue o seu tamanho, entre um mínimo legível e um máximo. ib_reflection põe um reflexo sob os elementos, ii_item_width e ii_item_height fixam o tamanho ao píxel.
Porquê faces em vez de componentes dentro do carrossel? Cada componente da biblioteca é um controlo próprio, com a sua própria página web (um WebView2): não pode alojar-se na página de outro. O carrossel desenha portanto ele próprio o que mostrariam uma imagem, um statictext ou um cartão do kanban — são as três faces de um mesmo elemento, e mil elementos custam um único controlo. is_item_style escolhe a face de todos os elementos, is_style de um elemento escolhe a sua (vazio: segue o carrossel). Com ITEM_AUTO (por omissão), a face deduz-se do que o elemento tem:
- um modelo de cartão definido (
is_card_template), ou etiquetas, ou ao mesmo tempo uma imagem e um texto → um cartão; - uma imagem → uma imagem, que preenche o mosaico (
is_fit); o seu título e o seu subtítulo tornam-se a legenda logo por baixo, o seu emblema pousa no seu canto; - um texto sozinho → um texto: texto formatado com etiquetas num painel com o tema, como um statictext; uma zona
[action=x]levantaue_action_clicked; - nada além de um título → um cartão.
of_item(key).of_face() diz a face escolhida. Uma imagem é um ficheiro do posto, um recurso ficheiro.dll:nome, um glifo mono: ou tint: desenhado com o tema, ou um endereço https://; um endereço http:// é recusado e levanta ue_image_failed com REASON_INSECURE, um ficheiro ausente com REASON_NOT_FOUND.
// The covers as a pile of cards, the whole picture in each tile
uo_covers.is_style = u_pbt_carousel.STYLE_STACK
uo_covers.is_fit = u_pbt_carousel.FIT_CONTAIN
// This item is a card, whatever it holds
uo_covers.of_item(/*key*/ "c2").is_style = u_pbt_carousel.ITEM_CARD
Uma fila alinhada no início #
Numa faixa plana (STYLE_CAROUSEL), is_align = ALIGN_START dá a fila de um serviço de vídeo: os elementos partem da borda de início (a direita na leitura da direita para a esquerda), todos inteiros e planos, e o último ecrã está cheio — nenhum vazio após o último elemento; um elemento cortado por uma borda convida a deslocar. O elemento atual já não está ao meio: é o que o utilizador escolheu, sempre inteiro no ecrã. As setas e Page Up / Page Down avançam um ecrã (os elementos que mostra inteiros) e o elemento atual passa a ser o primeiro que o ecrã trouxe; as teclas de seta avançam um elemento e só deslocam o necessário para o manter inteiro; a roda e o arrastar deslocam e pousam num elemento inteiro, o elemento atual só segue se ia sair; um clique num elemento inteiro torna-o atual e levanta ue_item_clicked. As setas vivem nas margens, só aparecem sob o ponteiro ou com o teclado, e desaparecem numa ponta. Os pontos contam ecrãs (um ponto é um lugar onde a faixa pode pousar); o contador continua a contar elementos. A reprodução automática avança um ecrã e, no fim, o primeiro ecrã volta pelo lado. Com ib_loop, a fila dá a volta quando é suficientemente longa para dar a volta ao ecrã (cerca de três elementos a mais do que mostra). ALIGN_START não tem efeito nas outras disposições.
// The row of a video service : the covers from the start edge, a screen at a time
uo_covers.is_style = u_pbt_carousel.STYLE_CAROUSEL
uo_covers.is_align = u_pbt_carousel.ALIGN_START
// Small covers : the row holds several screens
uo_covers.ii_item_height = 150
O elemento à frente #
O elemento atual é o que está à frente; of_current_key() lê a sua chave em direto. Um clique num vizinho trá-lo para a frente; um clique no elemento à frente levanta ue_item_clicked, um duplo clique (ou Enter) ue_item_opened. Uma mudança do utilizador — clique, teclado, roda, deslizar, ponto, seta, reprodução automática — e uma mudança do seu código (of_select_item, of_next, of_previous) levantam o mesmo ue_current_changed, como SelectItem levanta o evento do clique. Com ib_veto_changes, ue_current_changing é colocado antes, nos dois casos: devolver FALSE deixa o elemento à frente, e of_select_item devolve então -4. ue_current_changed é levantado também quando o elemento à frente sai (escondido, retirado: o mais próximo toma o seu lugar) e quando o primeiro elemento chega a um carrossel vazio (as_from_key vazio). Uma ordem do seu código dentro de ue_current_changing (outro elemento selecionado) prevalece: a resposta que se segue já não muda nada. of_select_row traz para a frente o elemento de uma linha e of_current_row lê a linha do elemento à frente; com ib_sync_row, o DataWindow dado a of_from_datastore segue o elemento à frente — o mestre-detalhe de um DataWindow.
Um elemento desativado (ib_enabled = false) fica no seu lugar, mas o utilizador não pode nem trazê-lo para a frente nem clicar nele: o teclado, a roda, Page Up / Page Down, a barra de deslocamento e um lançamento saltam-no; o seu código seleciona-o na mesma. Um elemento escondido (ib_visible = false) sai do carrossel mantendo a sua chave e o seu lugar. Com ib_loop (três elementos no mínimo), o primeiro segue o último. Um duplo clique num vizinho trá-lo para a frente e fica por aí: nem ue_item_clicked nem ue_item_opened. il_autoplay_ms faz avançar o carrossel sozinho, a cada tantos milissegundos (500 no mínimo): um botão PAUSA / REPRODUZIR aparece por baixo (ib_autoplay_button) e a pausa do utilizador mantém-se até REPRODUZIR (of_pause, of_play, ue_autoplay_changed); também se interrompe sob o ponteiro, enquanto o teclado está no componente e enquanto o carrossel está escondido. No fim de um carrossel sem ciclo, o primeiro elemento volta pelo lado. Cada passo passa por ue_current_changing como um gesto: um elemento recusado é saltado, pede-se o seguinte. Um leitor de ecrã não é avisado de cada passo durante a reprodução.
Cartões e legenda escritos por modelo #
Um cartão mostra a sua imagem em cima, o seu título (is_title), o seu subtítulo (is_subtitle), o seu corpo (is_text), as suas etiquetas (is_tags, separadas por vírgulas, coloridas por is_tag_tones: New=success|Sale=danger) e um emblema (is_badge). O corpo de todos os cartões pode ser escrito por um modelo, is_card_template, e a legenda sob o carrossel por is_caption_template: texto formatado com etiquetas onde {price} é um campo do elemento — um dos seus (of_set_field), uma coluna do DataStore de onde vem, ou um campo integrado (key, title, subtitle, text, image, badge, tags, position, count). {position} e {count} contam os elementos desenhados, como o contador. {sold:dd/mm/yyyy hh:mm} escreve uma data ou uma data-hora, {price:#,##0.00} um número: os formatos de apresentação de uma coluna de DataWindow (mm depois de uma hora = os minutos, [shortdate], [longdate], [time], secções positivo;negativo;zero), na língua de apresentação — um valor que o formato não sabe escrever é mostrado tal como é. {?x}…{/x} mantém um pedaço quando o campo diz alguma coisa, {!x}…{/x} quando não diz nada, {{ }} são chavetas. Um valor é mostrado tal como é, nunca lido como etiquetas; {x:raw} mantém-no como etiquetas — reserve-o aos seus próprios campos: numa coluna de base de dados leria o dado como etiquetas, zonas de ação incluídas. {title}, {subtitle}, {text} e {badge} escritos pelo seu código são etiquetas, como na legenda; lidos de uma coluna, texto.
// A price, a field of our own, then the body of every card
uo_shop.of_set_field(/*key*/ "p1", /*field*/ "price", /*value*/ "$12.90")
uo_shop.is_card_template = "{?price}From [b]{price}[/b]{/price}{!price}Price on request{/price}"
// Under the carousel : the place of the item in front, then its title
uo_shop.is_caption_template = "{position} / {count} - [b]{title}[/b]"
A partir de um DataStore #
of_from_datastore faz um elemento de cada linha de um DataStore, de um DataWindow ou de um DataWindowChild — a mesma chamada. A sua chave é o RowID da linha — nomeia a sua linha enquanto o DataStore não for esvaziado nem relido (Reset, Retrieve e ImportString voltam a dar os RowID 1, 2, 3), e of_item(key).of_row() encontra-a — ou o valor da coluna ROLE_KEY, a chave a dar assim que atualiza. Uma linha cuja chave está vazia, é inválida, já foi vista ou está ocupada por um elemento acrescentado à mão não é carregada: a chamada devolve 0 e of_get_last_error nomeia-a — dê aos seus elementos à mão chaves que não sejam números. Uma coluna desempenha um papel quando tem o seu nome (key, title, subtitle, text, image, badge, tags, color) ou quando of_map o diz; a coluna ROLE_COLOR (um RGB() ou #rrggbb) pinta a faixa de um cartão. of_map e of_reload_row atualizam os elementos no lugar (indicadores, campos, handle e lugar ficam). Também um segundo carregamento, com ROLE_KEY: um elemento cuja chave volta mantém os seus indicadores, os seus campos e o seu handle. Sem ROLE_KEY, um segundo carregamento é uma nova época: um RowID que volta pode nomear outro registo, cada elemento das linhas é refeito (nada é herdado, os handles dos antigos são libertados) e, se a chave à frente voltar, ue_current_changed di-lo com as_from_key = as_key. Em todos os casos os elementos tomam a ordem das linhas (um of_move_item não sobrevive a um carregamento), os das linhas desaparecidas saem, os acrescentados à mão ficam, depois das linhas; um elemento de linha retirado com of_remove_item volta com a sua linha — esconda-o antes (ib_visible). As datas são lidas na ordem regional do posto, os números escrevem-se com ponto, os valores CHAR sem o seu preenchimento, no carregamento como depois de of_reload_row. O que uma coluna dá é texto, nunca etiquetas — um [action=x] vindo da base de dados não é clicável —, e uma imagem de uma coluna nunca vai buscar um caminho de rede (\\servidor\partilha: ue_image_failed com REASON_UNC). Quando a coluna ROLE_KEY de uma linha relida muda, o elemento toma a nova chave: o handle da antiga é libertado. Todas as colunas são campos dos modelos.
// The rows of the albums : columns named title and subtitle play their role
ids_albums.Retrieve()
// The picture is in a column with another name
uo_covers.of_map(/*role*/ u_pbt_carousel.ROLE_IMAGE, /*column*/ "cover_file")
// One item per row, its key the RowID of the row
uo_covers.of_from_datastore(/*ads*/ ids_albums)
// Master-detail : the DataWindow follows the item in front, and the carousel reads its rows
uo_covers.ib_sync_row = true
uo_covers.of_from_datastore(/*adw*/ dw_albums)
// event rowfocuschanged of dw_albums : the item of the row comes in front
uo_covers.of_select_row(/*row*/ currentrow)
Propriedades #
| Propriedade | Tipo | Predefinição | Função | ||
|---|---|---|---|---|---|
is_style | string | STYLE_COVERFLOW | A disposição: STYLE_COVERFLOW (o atual de frente, os seus vizinhos inclinados em perspetiva), STYLE_CAROUSEL (uma faixa plana, vários elementos inteiros), STYLE_STACK (uma pilha de cartões), STYLE_HERO (um único elemento em toda a superfície, um banner). Outro valor é recusado: o antigo fica, of_get_last_error diz porquê | ||
is_item_style | string | ITEM_AUTO | A face de cada elemento que não escolhe uma por si: ITEM_AUTO (segundo o que tem, ver acima), ITEM_IMAGE, ITEM_TEXT, ITEM_CARD. Outro valor é recusado | ||
is_fit | string | FIT_COVER | Como uma imagem preenche o seu mosaico: FIT_COVER (o mosaico fica cheio, a imagem recortada) ou FIT_CONTAIN (a imagem inteira). Outro valor é recusado | ||
ib_reflection | boolean | false | Um reflexo sob os elementos, como num chão brilhante | ||
ib_loop | boolean | false | Depois do último elemento vem o primeiro (e antes do primeiro, o último). São precisos três elementos no mínimo | ||
il_autoplay_ms | long | 0 | Reprodução automática: o elemento seguinte vem para a frente a cada il_autoplay_ms milissegundos (500 no mínimo, um valor menor é elevado até ele); 0 para-a. Um botão PAUSA / REPRODUZIR aparece sob o carrossel (ib_autoplay_button); também se interrompe sob o ponteiro, enquanto o teclado está no componente e enquanto o carrossel está escondido. No fim de um carrossel sem ciclo, o primeiro volta pelo lado; um elemento que ue_current_changing recusa é saltado | ||
ib_show_caption | boolean | true | A legenda do elemento à frente: o seu título (e o seu subtítulo), sublinhado com o destaque, ou o que is_caption_template escreve; fica logo por baixo dele ou sobre o seu pé (is_caption_position) | ||
is_caption_position | string | CAPTION_AUTO | Onde fica a legenda: CAPTION_BELOW (logo por baixo do elemento à frente, sob o seu reflexo se o tiver), CAPTION_OVERLAY (sobre o seu pé, a branco sobre um véu escuro), CAPTION_AUTO (sob uma imagem — sobre o seu pé num banner —, e nenhuma sob cartões ou textos que já escrevem o seu título, a não ser que is_caption_template diga o que escrever). Outro valor é recusado | ||
ib_autoplay_button | boolean | true | Um botão PAUSA / REPRODUZIR sob o carrossel enquanto il_autoplay_ms corre, e uma barra fina que se enche até ao próximo elemento: quem lê pode parar o que se mexe. A pausa do utilizador mantém-se até REPRODUZIR; ue_autoplay_changed di-lo. false: sem botão | ||
is_indicator | string | INDICATOR_AUTO | O que mostra onde se está, sob a legenda: INDICATOR_AUTO (pontos até 12 elementos, uma barra de deslocamento além disso), INDICATOR_DOTS (pontos clicáveis, até 48 elementos: além disso, a barra), INDICATOR_SCROLLBAR (uma barra que se clica e se arrasta), INDICATOR_COUNTER (3 / 12), INDICATOR_NONE. Outro valor é recusado | ||
ib_arrows | boolean | true | Os dois botões de seta nos lados: o da esquerda vai sempre para a esquerda | ||
ii_item_width | integer | 0 | A largura de um mosaico, em píxeis (24 a 4000, um valor fora é trazido para dentro); 0: segundo o tamanho do componente e is_item_ratio. Uma largura definida com uma altura 0: a altura segue a proporção. Sem efeito em STYLE_HERO: o seu elemento ocupa toda a superfície | ||
ii_item_height | integer | 0 | A altura de um mosaico, em píxeis (24 a 4000); 0: segundo o tamanho do componente, deixando ver os vizinhos e a legenda. Uma altura definida com uma largura 0: a largura segue a proporção. Sem efeito em STYLE_HERO | ||
is_item_ratio | string | "" | A proporção de um mosaico, largura:altura: "1:1", "3:4", "16:9"… O mosaico mantém-na seja qual for o tamanho do componente. Vazio: segundo a face da maioria dos elementos — 1:1 para imagens, 3:4 para cartões, 16:9 para textos. Um valor que não seja dois números positivos unidos por : é recusado. Sem efeito em STYLE_HERO | ||
ii_angle | integer | 62 | A rotação das capas nos lados do Cover Flow, em graus, de 0 (planas) a 80; 62 é a do iTunes | ||
ii_spacing | integer | 100 | O espaçamento das capas do Cover Flow e dos mosaicos de uma faixa, em percentagem do que o carrossel calcula: 100 espalha as capas pela largura disponível, de 25 a 300 aproxima-as ou afasta-as | ||
ib_shade | boolean | true | As capas nos lados escurecem com a sua distância, para que o elemento à frente atraia o olhar; os cartões que esperam atrás de uma pilha também | ||
is_transition | string | TRANSITION_SLIDE | Como um banner (STYLE_HERO) muda de elemento: TRANSITION_SLIDE (o seguinte desliza do lado) ou TRANSITION_FADE (aparece em transparência). Outro valor é recusado | ||
is_align | string | ALIGN_CENTER | Onde fica o elemento atual numa faixa (STYLE_CAROUSEL): ALIGN_CENTER (ao meio) ou ALIGN_START (a fila de um serviço de vídeo, alinhada à borda de início, que avança um ecrã: ver acima). Sem efeito nas outras disposições. Outro valor é recusado | ||
is_card_template | string | "" | O corpo de cada cartão, escrito por um modelo (ver acima). Definir um modelo faz de cada elemento ITEM_AUTO um cartão. Vazio: o texto do elemento (is_text) | ||
is_caption_template | string | "" | A legenda sob o carrossel, escrita por um modelo (os mesmos campos). Vazio: o título, e o subtítulo por baixo | ||
is_tag_tones | string | "" | O tom de cada etiqueta, etiqueta=tom unidos por ` | : New=success | Sale=danger. Tons: TONE_SUCCESS, TONE_WARN, TONE_DANGER, TONE_INFO (o destaque), TONE_NEUTRAL`. Uma etiqueta não listada, ou um tom desconhecido, é neutra |
is_badge_format | string | "" | O formato de apresentação dos emblemas que são um número ou uma data — uma coluna ROLE_BADGE do DataStore, ou um valor que o seu código escreve: "$#,##0.00", "dd/mm/yyyy", o formato de uma coluna de DataWindow, na língua de apresentação. Um emblema que não é nem um nem outro (etiquetas, uma palavra) é mostrado tal como é. Vazio: cada emblema tal como é | ||
ib_sync_row | boolean | false | Mestre-detalhe: o DataWindow (ou DataWindowChild) dado a of_from_datastore segue o elemento à frente — ScrollToRow na sua linha a cada mudança, gesto ou código. No outro sentido, chame of_select_row a partir do seu RowFocusChanged. Um DataStore não tem linha para mostrar: nada se mexe; um elemento acrescentado à mão não tem linha | ||
ib_veto_changes | boolean | false | Opt-in: perguntar ue_current_changing antes de cada mudança do elemento à frente, do utilizador, da reprodução automática como de of_select_item. A reprodução automática salta um elemento recusado; o teclado fica onde está — um elemento sempre recusado é melhor desativá-lo. Uma ordem do seu código em ue_current_changing prevalece: a resposta que se segue não muda nada. Desativado por omissão, como todo o evento cancelável da biblioteca | ||
ib_animated | boolean | true | Os elementos deslizam até ao seu novo lugar. Um posto configurado para reduzir as animações salta diretamente, a não ser que a aplicação insista (PBT_SetAnimationPolicy) | ||
ii_anim_duration | integer | 450 | Duração de um movimento, em milissegundos (0 a 5000) | ||
is_anim_easing | string | EASING_EASE_OUT | A curva do movimento: EASING_LINEAR, EASING_EASE_OUT, EASING_BACK_OUT (passa um pouco e volta), EASING_BOUNCE_OUT (ressalta), EASING_ELASTIC_OUT (oscila) | ||
ib_enabled | boolean | true | false desativa o carrossel: os elementos continuam visíveis, nada mais responde ao utilizador (clique, teclado, roda, deslizar, reprodução automática) | ||
is_theme_style | string | "" | Estilo visual do componente (constantes THEME_STYLE_*); vazio = o da aplicação, seguido a cada mudança | ||
is_theme_mode | string | "" | Variante clara ou escura (constantes THEME_MODE_*); vazio = a da aplicação, seguida a cada mudança | ||
il_theme_accent | long | -1 | Cor de destaque deste componente (-1 = destaque da aplicação, ou o do tema) | ||
is_tooltip | string | "" | Tooltip simples apresentado ao passar sobre o componente | ||
is_super_tooltip_title | string | "" | Título do tooltip enriquecido (prevalece sobre is_tooltip) | ||
is_super_tooltip_text | string | "" | Texto do tooltip enriquecido (aceita marcação enriquecida) | ||
is_super_tooltip_image | string | "" | Imagem do tooltip enriquecido |
Propriedades de um elemento — n_pbt_carousel_item #
O seu handle, através de of_item(key). Uma leitura pergunta ao carrossel como está agora.
| Propriedade | Tipo | Predefinição | Função |
|---|---|---|---|
is_title | string | "" | Título do elemento: a legenda quando está à frente, e a primeira linha de um cartão. Aceita o texto formatado com etiquetas. Vazio, o elemento mostra a sua chave |
is_subtitle | string | "" | A segunda linha, sob o título de um cartão e da legenda (etiquetas aceites). Uma imagem com subtítulo continua a ser uma imagem: o subtítulo vai para a sua legenda |
is_text | string | "" | O texto (etiquetas aceites): toda a face de um elemento de texto, o corpo de um cartão enquanto is_card_template estiver vazio. Uma zona [action=x] levanta ue_action_clicked no elemento à frente |
is_image | string | "" | A imagem: um ficheiro do posto, um recurso ficheiro.dll:nome, um glifo mono: / tint: desenhado com o tema, um endereço https://. http:// é recusado (ue_image_failed, REASON_INSECURE), e também um caminho de rede vindo de uma coluna de DataStore (REASON_UNC). Um esqueleto com o tema aparece enquanto a imagem chega |
is_badge | string | "" | Pequeno emblema (etiquetas aceites): um preço, um número, no destaque — em cima à direita de um cartão, sobre o canto de uma imagem. Uma imagem com emblema continua a ser uma imagem |
is_tags | string | "" | Etiquetas de um cartão, separadas por vírgulas: Vinyl, Sale. Cada uma é uma pastilha colorida por is_tag_tones do carrossel |
is_style | string | "" | A face deste elemento (ITEM_* de u_pbt_carousel); vazio: segue is_item_style do carrossel. Outro valor é recusado: o anterior fica, of_get_last_error do carrossel diz porquê |
ib_visible | boolean | true | false retira o elemento do carrossel; mantém a sua chave e o seu lugar. Se estava à frente, o mais próximo toma o seu lugar (ue_current_changed) |
ib_enabled | boolean | true | false desativa o elemento: o utilizador não pode nem trazê-lo para a frente nem clicar nele, o teclado e a roda saltam-no. O seu código seleciona-o na mesma |
of_position ( ) → long | — | — | Devolve o lugar do elemento no carrossel agora, contado a partir de 1 (elementos escondidos incluídos); 0 quando o carrossel não o contém |
of_row ( ) → long | — | — | Devolve o número de linha de hoje, nas linhas dadas a of_from_datastore, da linha de onde vem o elemento — depois de uma ordenação, de um filtro ou da eliminação de outras linhas, enquanto o DataStore não for esvaziado nem relido; 0 para um elemento acrescentado à mão ou cuja linha desapareceu |
of_face ( ) → string | — | — | A face com que o elemento é desenhado agora: "image", "text" ou "card" (ITEM_IMAGE, ITEM_TEXT, ITEM_CARD) — o que is_style escolheu ou o que ITEM_AUTO deduziu; vazio quando o carrossel não o contém |
is_tooltip | string | "" | Tooltip simples apresentado ao passar sobre o item |
is_super_tooltip_title | string | "" | Título do tooltip enriquecido do item (prevalece sobre is_tooltip) |
is_super_tooltip_text | string | "" | Texto do tooltip enriquecido do item (aceita marcação enriquecida) |
is_super_tooltip_image | string | "" | Imagem do tooltip enriquecido do item |
il_accent | long | -1 | Destaque do elemento: a faixa no topo de um cartão (que faz aparecer) e de um painel de texto, e o emblema, usam-no; prevalece sobre a cor de uma coluna ROLE_COLOR. Os pontos e a legenda mantêm o destaque do componente. -1 = o do componente |
il_back_color | long | -1 | Fundo de uma face de texto ou de cartão, em RGB(r,g,b) (-1 = o que o tema dá). Uma face de imagem não tem fundo |
il_text_color | long | -1 | Cor do texto de uma face de texto ou de cartão (-1 = o que o tema dá) |
il_back_color_hover | long | -1 | Fundo de uma face de texto ou de cartão sob o ponteiro, em RGB(r,g,b) (-1 = o seu fundo habitual). Nada se move na passagem : só a cor muda |
il_text_color_hover | long | -1 | Cor do texto de uma face de texto ou de cartão sob o ponteiro (-1 = a sua cor habitual) |
Três leituras do handle, só de leitura: of_position() devolve o lugar do elemento a partir de 1, of_row() o número da sua linha no DataStore (0 para um elemento acrescentado à mão), of_face() a face escolhida. Um elemento desloca-se com of_move_item do carrossel.
Métodos #
| Método | Função | |
|---|---|---|
of_add_item (string as_key, string as_title) | Acrescenta um elemento no fim do carrossel, só um título (um cartão): a sua imagem, o seu texto, o seu subtítulo… definem-se no seu handle. A sua chave é única no carrossel. O primeiro elemento de um carrossel vazio vem para a frente (ue_current_changed). Devolve 0 depois de acrescentado, -5 para uma chave vazia, com / ou ` | , que começa por __, ou já ocupada (elementos de um DataStore incluídos), -2` quando o componente não está criado |
of_add_item (string as_key, string as_title, string as_image) | O mesmo com a sua imagem. Com ITEM_AUTO, uma imagem e um título sozinhos fazem um elemento imagem, o título como legenda. Devolve 0 depois de acrescentado, -5 como acima, -2 quando o componente não está criado | |
of_clear ( ) | Esvazia o carrossel: elementos (os de um DataStore incluídos) e os seus handles; o DataStore continua ligado para um novo of_from_datastore, as opções ficam. Segue-se ue_current_changed, com uma chave vazia, se havia um elemento à frente. Devolve 0 depois de aplicado, -2 quando o componente não está criado | |
of_current_key ( ) | A chave do elemento à frente, seja quem for que o tenha trazido; vazia quando o carrossel está vazio. Lida em direto | |
of_current_row ( ) | O número de linha de hoje, nas linhas dadas a of_from_datastore, do elemento à frente — depois de uma ordenação, de um filtro ou da eliminação de outras linhas. Devolve 0 quando o carrossel está vazio, quando o elemento à frente foi acrescentado à mão ou a sua linha desapareceu | |
of_from_datastore (datastore ads) | Faz um elemento de cada linha do DataStore (ver acima). Um segundo carregamento atualiza os elementos no lugar com ROLE_KEY, refá-los sem ela (uma nova época: nada é herdado); os das linhas desaparecidas saem (handles libertados), os acrescentados à mão ficam, depois das linhas; uma linha não carregada é nomeada por of_get_last_error. Devolve 0 depois de carregado, -5 quando o DataStore não é válido, -2 quando o componente não está criado | |
of_from_datastore (datawindow adw) | O mesmo a partir das linhas de um DataWindow, lidas por um DataStore que as partilha (ShareData). Devolve 0 depois de carregado, -5 quando o DataWindow não é válido ou recusa partilhar as suas linhas (of_get_last_error di-lo), -2 quando o componente não está criado | |
of_from_datastore (datawindowchild adwc) | O mesmo a partir das linhas de um DataWindowChild (uma lista pendente DataWindow, um relatório aninhado). Devolve 0 depois de carregado, -5 quando não é válido, -2 quando o componente não está criado | |
of_get_field (string as_key, string as_field) | Lê um campo de um elemento, em direto: um dos seus, uma coluna do seu DataStore ou um campo integrado (title, position, count…). Uma cadeia vazia quando não tem | |
of_get_last_error ( ) | Porque falhou a última chamada: um método que devolveu -5 ou -4, um valor recusado (is_style, is_item_style, is_indicator, is_fit, is_caption_position, is_transition, is_item_ratio, is_align, is_style de um elemento), uma chamada feita durante uma espera (nada pôde ser julgado), as linhas que um carregamento deixou de fora. Esvaziado por cada método que age (uma leitura deixa-o); senão o último erro da biblioteca | |
of_insert_item (string as_key, string as_title, string as_image, long al_position) | Acrescenta um elemento num lugar contado a partir de 1 (para lá do último: no fim). O elemento à frente fica à frente. Devolve 0 depois de acrescentado, -5 como of_add_item, -2 quando o componente não está criado | |
of_is_playing ( ) | TRUE enquanto a reprodução automática está a correr: il_autoplay_ms está definido e ninguém carregou em PAUSA (um ponteiro sobre o carrossel suspende-a um instante: continua a correr). Lido em direto | |
of_item (string as_key) | Devolve o handle de um elemento (criado no primeiro acesso, libertado quando o elemento é retirado) | |
of_map (string as_role, string as_column) | Dá um papel a uma coluna do DataStore quando o seu nome não o diz (ROLE_KEY, ROLE_TITLE, ROLE_SUBTITLE, ROLE_TEXT, ROLE_IMAGE, ROLE_BADGE, ROLE_TAGS, ROLE_COLOR). Antes ou depois de of_from_datastore: depois, as linhas são relidas no lugar. Uma coluna vazia devolve o papel à coluna que tem o seu nome; um novo ROLE_KEY dá novas chaves aos elementos (os handles das antigas são libertados). Devolve 0 depois de definido, -5 para um papel desconhecido ou uma coluna que o DataStore não tem, -2 quando o componente não está criado | |
of_move_item (string as_key, long al_position) | Desloca um elemento para um lugar contado a partir de 1 (para lá do último: o último). O elemento à frente fica à frente. Devolve 0 depois de deslocado, -5 para um elemento desconhecido, -2 quando o componente não está criado | |
of_next ( ) | Traz para a frente o elemento seguinte (os desativados são saltados; depois do último, o primeiro com ib_loop), como a tecla de seta na sua direção (Direita, Esquerda da direita para a esquerda), e levanta ue_current_changed. Devolve 0 uma vez feito (também no fim: nada se mexe, nada é levantado), -4 quando ue_current_changing recusou, -5 durante uma espera (nada pôde ser julgado), -2 quando o componente não está criado | |
of_pause ( ) | Pausa a reprodução automática, como o botão PAUSA: o elemento à frente fica até of_play (ou REPRODUZIR). Segue-se ue_autoplay_changed — uma ordem do código levanta-o como o botão. Devolve 0 uma vez em pausa (também se já estiver: nada é levantado), -5 quando il_autoplay_ms vale 0, -2 quando o componente não está criado | |
of_play ( ) | Retoma a reprodução automática depois de uma pausa — o botão PAUSA do utilizador ou of_pause. Segue-se ue_autoplay_changed. Devolve 0 uma vez retomada (também se já estiver a correr: nada é levantado), -5 quando il_autoplay_ms vale 0 (nada para reproduzir), -2 quando o componente não está criado | |
of_previous ( ) | Traz para a frente o elemento anterior, como a tecla de seta na sua direção. Devolve 0 uma vez feito (também no início: nada se mexe, nada é levantado), -4 quando ue_current_changing recusou, -5 durante uma espera, -2 quando o componente não está criado | |
of_reload_row (long al_row) | Reenvia ao carrossel uma linha do DataStore de of_from_datastore, lida agora, depois de o seu código a ter mudado (SetItem, uma janela de edição); o seu elemento é atualizado no lugar (indicadores, campos, handle e lugar ficam). Uma linha que o carrossel ainda não tem (InsertRow) chega depois do último elemento de linha. Quando a coluna ROLE_KEY da linha mudou, o elemento toma a nova chave: o handle da antiga é libertado e, se estava à frente, ue_current_changed di-lo. Devolve 0 uma vez enviada, -5 quando nada está ligado, a linha não existe ou a sua chave está vazia, é inválida ou pertence a outro elemento (of_get_last_error di-lo), -2 quando o componente não está criado | |
of_remove_item (string as_key) | Retira um elemento e liberta o seu handle; retirar o elemento à frente traz para a frente o mais próximo (ue_current_changed). Um elemento de linha de um DataStore volta com a sua linha (of_reload_row, um novo carregamento): esconda-o (ib_visible) ou elimine a linha. Devolve 0 depois de retirado, -5 para um elemento desconhecido, -2 quando o componente não está criado | |
of_reset ( ) | Esvazia o carrossel, esquece o DataStore e repõe cada propriedade no seu valor por omissão. Devolve 0 depois de aplicado, -2 quando o componente não está criado | |
of_select_item (string as_key) | Traz um elemento para a frente, como um clique: desliza até lá e segue-se ue_current_changed. Com ib_veto_changes, ue_current_changing é colocado primeiro. Um elemento desativado é selecionado na mesma: a desativação para o utilizador, não o seu código. Devolve 0 depois de feito (ou já à frente: nada é levantado), -4 quando ue_current_changing recusou, -5 para um elemento desconhecido ou não desenhado (escondido, para lá do limite demo), -2 quando o componente não está criado | |
of_select_row (long al_row) | Traz para a frente o elemento de uma linha das linhas dadas a of_from_datastore — al_row é o número de linha de hoje, diga o que disser ROLE_KEY: o mestre-detalhe de um DataWindow, chamado a partir do seu RowFocusChanged. Como of_select_item sobre a sua chave: segue-se ue_current_changed, ib_veto_changes pergunta primeiro. Devolve 0 depois de à frente (ou já à frente), -4 quando ue_current_changing recusou, -5 quando nada está ligado, a linha não existe ou não deu nenhum elemento (deixada de fora pelo carregamento, retirada, escondida, para lá do limite demo), -2 quando o componente não está criado | |
of_set_field (string as_key, string as_field, string as_value) | Dá a um elemento um campo seu, para os modelos: {price}; prevalece sobre uma coluna do DataStore com o mesmo nome. Um nome de campo: letras, algarismos e _, sem algarismo inicial. Devolve 0 depois de definido, -5 para um elemento desconhecido ou um nome inválido, -2 quando o componente não está criado |
Eventos #
| Evento | Acionado quando |
|---|---|
ue_current_changed (string as_from_key, string as_key) | O elemento à frente mudou: um clique num vizinho, o teclado, a roda, um deslizar, um ponto, uma seta, a reprodução automática, ou o seu código (of_select_item, of_next, of_previous). Também quando o elemento à frente sai (escondido, retirado: o mais próximo toma o seu lugar) quando o primeiro elemento chega a um carrossel vazio (as_from_key vazio), e quando um novo carregamento sem ROLE_KEY dá a chave à frente a outro registo (as_from_key = as_key). as_key vazio: o carrossel está vazio. Com ib_sync_row, o DataWindow ligado já mostra a linha |
ue_current_changing (string as_from_key, string as_key) → boolean | Cancelável, colocado antes de uma mudança do elemento à frente, só quando ib_veto_changes = true: gesto, reprodução automática e of_select_item (portanto of_next, of_previous). Devolver FALSE deixa o elemento à frente, e of_select_item devolve então -4. Por omissão: TRUE |
ue_item_clicked (string as_key) | O elemento à frente foi clicado (ou premido Espaço). Um clique num vizinho trá-lo para a frente em vez disso (ue_current_changed) — e um duplo clique num vizinho só o traz, sem este evento; uma zona [action=x] levanta ue_action_clicked em vez disso; um elemento desativado não levanta nada |
ue_item_opened (string as_key) | Um duplo clique no elemento à frente, ou Enter: abra-o. Um duplo clique num vizinho só o traz para a frente |
ue_item_rclicked (string as_key, long al_x, long al_y) | Um clique direito num elemento, ou a tecla de menu (ou Shift + F10) no elemento à frente. al_x, al_y são píxeis de ecrã; para um menu PowerBuilder, PopMenu(PointerX(), PointerY()) da sua janela |
ue_action_clicked (string as_key, string as_action) | Foi clicada uma zona [action=x] do texto do elemento à frente: as_action = "x" |
ue_autoplay_changed (boolean ab_playing) | A reprodução automática foi pausada (ab_playing = false) ou retomada (true): o botão PAUSA / REPRODUZIR sob o carrossel, ou o seu código (of_pause, of_play também o levantam). Um ponteiro sobre o carrossel suspende-a sem o levantar |
ue_image_failed (string as_key, string as_reason) | A imagem de um elemento não pôde ser mostrada: as_reason vale REASON_INSECURE (um endereço http://), REASON_UNC (um caminho de rede vindo de uma coluna de DataStore, recusado antes de qualquer pedido) ou REASON_NOT_FOUND (ficheiro não encontrado). Dito uma vez por elemento e por imagem |
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) |
Teclado e rato #
- Clique num vizinho: vem para a frente; no elemento à frente:
ue_item_clicked; duplo clique:ue_item_opened(num vizinho: vem para a frente, nada mais); clique direito:ue_item_rclicked. - Arrastar ou deslizar: a faixa segue o ponteiro; ao largar, a sua velocidade leva-a alguns elementos mais longe. Sem
ib_loop, as pontas são elásticas. Largado fora do carrossel, o arrastar termina na mesma. - Roda: segue a sua velocidade — um entalhe, um elemento; uma grande volta, vários; um touchpad soma os seus pequenos passos.
- Esquerda / Direita: o elemento anterior, o seguinte — invertidas numa aplicação da direita para a esquerda; Cima / Baixo: o mesmo; Home / End: o primeiro, o último; Page Up / Page Down: de tantos elementos quantos a cena mostra. Os elementos desativados são saltados, em todo o lado.
- As primeiras letras de um título trazem-no para a frente (maiúsculas e acentos ignorados); a mesma letra outra vez vai para o seguinte que começa por ela.
- Enter:
ue_item_opened; Espaço:ue_item_clicked; tecla Menu ou Shift + F10:ue_item_rclickedsobre o elemento à frente. - As setas laterais (
ib_arrows, nas suas calhas: não cobrem nenhum mosaico), os pontos e a barra de deslocamento (is_indicator) clicam-se; a barra também se arrasta. O botão PAUSA / REPRODUZIR (ib_autoplay_button) clica-se ou alcança-se com o teclado. - O carrossel é uma paragem da tecla Tab (duas com o botão PAUSA); um anel do destaque rodeia o elemento à frente enquanto o teclado lá está.
Exemplos #
Uma montra de produtos #
// A flat strip : several products in full, a counter under it
uo_shop.is_style = u_pbt_carousel.STYLE_CAROUSEL
uo_shop.is_indicator = u_pbt_carousel.INDICATOR_COUNTER
// A product : a picture and a title, then a badge and tags (it becomes a card)
uo_shop.of_add_item(/*key*/ "p1", /*title*/ "Northern Lights", /*image*/ "img\packimages.dll:SVG/COVERS/COVER-01")
uo_shop.of_item(/*key*/ "p1").is_badge = "New"
uo_shop.of_item(/*key*/ "p1").is_tags = "Vinyl, Sale"
// The tone of each tag, and the price in the body of every card
uo_shop.is_tag_tones = "Vinyl=info|Sale=danger"
uo_shop.of_set_field(/*key*/ "p1", /*field*/ "price", /*value*/ "$12.90")
uo_shop.is_card_template = "From [b]{price}[/b]"
Perguntar antes de mudar de elemento #
// Once : ask before the item in front changes
uo_covers.ib_veto_changes = true
// event ue_current_changing of uo_covers : not while the form beside it is not saved
if ib_unsaved then return false
return true
Abrir um elemento de um DataStore na sua janela #
// Local variables
long ll_row
// event ue_item_opened of uo_covers : the row of the item, edited in a RESPONSE window (the code waits for it)
ll_row = uo_covers.of_item(/*key*/ as_key).of_row()
OpenWithParm(w_album_edit, ll_row)
// The row may have changed : the item follows it
uo_covers.of_reload_row(/*row*/ ll_row)
Notícias que avançam sozinhas #
// A banner : one item on the whole surface
uo_news.is_style = u_pbt_carousel.STYLE_HERO
// Text items : rich text on a themed panel, with an [action] zone
uo_news.of_add_item(/*key*/ "n1", /*title*/ "Release")
uo_news.of_item(/*key*/ "n1").is_text = "[b]Version 5.0[/b] is out. [action=notes]Read the notes[/action]"
uo_news.of_add_item(/*key*/ "n2", /*title*/ "Webinar")
uo_news.of_item(/*key*/ "n2").is_text = "[b]Webinar[/b] on Thursday at 10:00."
uo_news.of_add_item(/*key*/ "n3", /*title*/ "Support")
uo_news.of_item(/*key*/ "n3").is_text = "[b]Support[/b] answers within one day."
// A new one every 5 seconds, faded in, the first again after the last :
// a PAUSE button shows under the banner
uo_news.is_transition = u_pbt_carousel.TRANSITION_FADE
uo_news.il_autoplay_ms = 5000
uo_news.ib_loop = true
// event ue_action_clicked of uo_news : (string as_key, string as_action)
// The zone [action=notes] of the first item opens the release notes
if as_action = "notes" then Open(w_release_notes)
Um grande catálogo #
// The products : one row = one item, its key the product code
ids_products.Retrieve()
uo_shop.of_map(/*role*/ u_pbt_carousel.ROLE_KEY, /*column*/ "code")
uo_shop.of_from_datastore(/*ads*/ ids_products)
// Only the tiles near the one in front are drawn : thousands of rows cost nothing.
// Beyond 12 items a scrollbar replaces the dots ; the user types a name to reach it
uo_shop.of_select_item(/*key*/ "P250")
Boas práticas #
- Imagens das mesmas proporções: o Cover Flow lê-se num relance quando os mosaicos têm a mesma forma;
is_item_ratiofixa-a,FIT_CONTAINmostra a imagem inteira. - Pouco texto por face: um cartão lê-se em duas linhas, o detalhe vai para a sua janela (
ue_item_opened). - Uma reprodução automática lenta (quatro a seis segundos), com o seu botão PAUSA: quem lê tem de poder parar o que se mexe.
- Chaves que não sejam números para os seus elementos à mão, num carrossel alimentado por um DataStore: um elemento de chave
12impede que a linha de RowID 12 seja carregada (of_get_last_errordi-lo). ROLE_KEYassim que atualizar um DataStore (Retrieve,Reset): sem ela, um recarregamento refaz cada elemento, porque um RowID que volta pode nomear outro registo.- Muitos elementos não custam nada: só são desenhados os que estão ao alcance do elemento à frente, e uma imagem só é carregada quando se aproxima — o utilizador chega a um título escrevendo-o.
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.
| Membros | Função | Detalhado em |
|---|---|---|
of_count · of_keys_at · of_has | Percorrer o que o componente contém | 3.2 Os items |
of_reset | Repor o componente a zero | 3.6 Repor um componente a zero: of_reset() |
of_register_shortcut · of_clear_shortcuts | Atalhos de teclado do componente | 3.5 Os atalhos de teclado |
of_is_created · of_is_ready · of_get_last_error | Se nasceu, se está pronto, o que falhou | 3.7 Diagnóstico |
of_save_as_png · of_save_as_jpg | Exportar a renderização como imagem | 3.8 Exportar a representação como imagem |
of_set_redraw | Agrupar as alterações num único repinte | 3.10 Boas práticas |
of_preload_icons | Ícones mostrados sem atraso | Apresentação instantânea: of_icon |
of_set_translation | Traduzir uma legenda do componente | 5.2 Adaptar uma etiqueta: of_set_translation |
of_focus_webview | Dar o foco ao componente | 6.4 Teclado e focus |
of_print · of_print_to_pdf | Imprimir, ou escrever um PDF | 6.9 Imprimir |
of_set_property · of_get_property · of_component_name | Controlar uma propriedade pelo nome | 3.1 O motor de propriedades |
is_accessible_name · is_accessible_description | O nome e a descrição que um leitor de ecrã diz | 3.4 Propriedades e eventos opcionais |
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.