PBToolboxAI v5 ← Site

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_changed diz-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 #

Userobjectu_pbt_carousel
Classe de itensn_pbt_carousel_item (of_item(key))
Serve paraFolhear capas, produtos, fotografias, fichas, notícias ou passos de boas-vindas
PrincípioUm elemento tem uma chave única; só um está à frente de cada vez, e desenha-se como imagem, texto ou cartão
Opções opt-inib_veto_changes, ib_loop, ib_reflection, il_autoplay_ms
Limite no modo de demonstraçãoOs 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:

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 #

PropriedadeTipoPredefiniçãoFunção
is_stylestringSTYLE_COVERFLOWA 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_stylestringITEM_AUTOA 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_fitstringFIT_COVERComo 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_reflectionbooleanfalseUm reflexo sob os elementos, como num chão brilhante
ib_loopbooleanfalseDepois do último elemento vem o primeiro (e antes do primeiro, o último). São precisos três elementos no mínimo
il_autoplay_mslong0Reproduçã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_captionbooleantrueA 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_positionstringCAPTION_AUTOOnde 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_buttonbooleantrueUm 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_indicatorstringINDICATOR_AUTOO 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_arrowsbooleantrueOs dois botões de seta nos lados: o da esquerda vai sempre para a esquerda
ii_item_widthinteger0A 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_heightinteger0A 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_ratiostring""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_angleinteger62A rotação das capas nos lados do Cover Flow, em graus, de 0 (planas) a 80; 62 é a do iTunes
ii_spacinginteger100O 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_shadebooleantrueAs 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_transitionstringTRANSITION_SLIDEComo 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_alignstringALIGN_CENTEROnde 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_templatestring""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_templatestring""A legenda sob o carrossel, escrita por um modelo (os mesmos campos). Vazio: o título, e o subtítulo por baixo
is_tag_tonesstring""O tom de cada etiqueta, etiqueta=tom unidos por `: New=successSale=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_formatstring""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_rowbooleanfalseMestre-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_changesbooleanfalseOpt-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_animatedbooleantrueOs 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_durationinteger450Duração de um movimento, em milissegundos (0 a 5000)
is_anim_easingstringEASING_EASE_OUTA 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_enabledbooleantruefalse desativa o carrossel: os elementos continuam visíveis, nada mais responde ao utilizador (clique, teclado, roda, deslizar, reprodução automática)
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

O seu handle, através de of_item(key). Uma leitura pergunta ao carrossel como está agora.

PropriedadeTipoPredefiniçãoFunção
is_titlestring""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_subtitlestring""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_textstring""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_imagestring""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_badgestring""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_tagsstring""Etiquetas de um cartão, separadas por vírgulas: Vinyl, Sale. Cada uma é uma pastilha colorida por is_tag_tones do carrossel
is_stylestring""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_visiblebooleantruefalse 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_enabledbooleantruefalse 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_tooltipstring""Tooltip simples apresentado ao passar sobre o item
is_super_tooltip_titlestring""Título do tooltip enriquecido do item (prevalece sobre is_tooltip)
is_super_tooltip_textstring""Texto do tooltip enriquecido do item (aceita marcação enriquecida)
is_super_tooltip_imagestring""Imagem do tooltip enriquecido do item
il_accentlong-1Destaque 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_colorlong-1Fundo 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_colorlong-1Cor do texto de uma face de texto ou de cartão (-1 = o que o tema dá)
il_back_color_hoverlong-1Fundo 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_hoverlong-1Cor 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étodoFunçã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 #

EventoAcionado 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) → booleanCancelá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 #


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)

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

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
is_accessible_name · is_accessible_descriptionO nome e a descrição que um leitor de ecrã diz3.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.

← Referência dos componentes · Índice do guia