carousel — u_pbt_carousel #
← Riferimento dei componenti · Sommario della guida
carousel fa scorrere degli elementi di cui uno solo è davanti: il Cover Flow di iTunes — l'elemento corrente di fronte, i suoi vicini inclinati in prospettiva che si sovrappongono, un riflesso sotto di essi —, una striscia piatta dove più elementi si vedono interi, una pila di schede, o un banner a tutta superficie che mostra un elemento alla volta. Ogni elemento è un'immagine, un testo formattato o una scheda (immagine, titolo, sottotitolo, corpo scritto da un modello, etichette, badge). L'utente clicca un vicino, scorre con inerzia, gira la rotellina, digita le prime lettere di un titolo o usa la tastiera;
ue_current_changedvi dice quale elemento è davanti. Il carosello si riempie a mano o da un DataStore, e può avanzare da solo, con un pulsante PAUSA.
▶ Vederlo dal vivo — Applicazione dimostrativa, riquadro Carousel: l'anteprima, il codice che lo produce e questa pagina, affiancati.
In breve #
| Userobject | u_pbt_carousel |
| Classe di elementi | n_pbt_carousel_item (of_item(key)) |
| Serve a | Sfogliare copertine, prodotti, foto, schede, notizie o passi di accoglienza |
| Principio | Un elemento ha una chiave unica; uno solo è davanti alla volta, e si disegna come immagine, testo o scheda |
| Opzioni opt-in | ib_veto_changes, ib_loop, ib_reflection, il_autoplay_ms |
| Limite in modalità demo | I primi 6 elementi visibili disegnati — vedere la modalità demo |
Avvio rapido #
// 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
Quattro disposizioni, tre facce #
is_style sceglie la disposizione: STYLE_COVERFLOW (predefinito) mette l'elemento corrente di fronte e inclina i suoi vicini in prospettiva, sovrapposti, distribuiti sulla larghezza disponibile e più scuri con la distanza (ii_angle, ii_spacing, ib_shade); STYLE_CAROUSEL allinea una striscia piatta dove più elementi si vedono interi; STYLE_STACK impila delle schede — la corrente davanti, le successive dietro di essa, le precedenti spostate di lato; STYLE_HERO mostra un solo elemento su tutta la superficie, il successivo che scivola o appare in dissolvenza (is_transition): il banner di un cruscotto. Un riquadro mantiene una proporzione (is_item_ratio; vuoto: 1:1 per immagini, 3:4 per schede, 16:9 per testi) e il contenuto di una scheda o di un testo segue la sua dimensione, tra un minimo leggibile e un massimo. ib_reflection mette un riflesso sotto gli elementi, ii_item_width e ii_item_height fissano la dimensione al pixel.
Perché delle facce piuttosto che dei componenti nel carosello? Ogni componente della libreria è un controllo a sé stante, con la propria pagina web (un WebView2): non può stare nella pagina di un altro. Il carosello disegna quindi da sé ciò che mostrerebbero un'immagine, uno statictext o una scheda del kanban — sono le tre facce di uno stesso elemento, e mille elementi costano un solo controllo. is_item_style sceglie la faccia di tutti gli elementi, is_style di un elemento sceglie la sua (vuoto: segue il carosello). Con ITEM_AUTO (predefinito), la faccia si deduce da ciò che l'elemento porta:
- un modello di scheda impostato (
is_card_template), o delle etichette, o insieme un'immagine e un testo → una scheda; - un'immagine → un'immagine, che riempie il riquadro (
is_fit); il suo titolo e il suo sottotitolo diventano la didascalia subito sotto, il suo badge si posa sul suo angolo; - un testo solo → un testo: testo formattato con tag su un pannello a tema, come uno statictext; una zona
[action=x]sollevaue_action_clicked; - nient'altro che un titolo → una scheda.
of_item(key).of_face() dice la faccia scelta. Un'immagine è un file della postazione, una risorsa file.dll:nome, un glifo mono: o tint: disegnato nel tema, o un indirizzo https://; un indirizzo http:// è rifiutato e solleva ue_image_failed con REASON_INSECURE, un file mancante con 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
Una fila allineata all'inizio #
Su una striscia piatta (STYLE_CAROUSEL), is_align = ALIGN_START dà la fila di un servizio video: gli elementi partono dal bordo d'inizio (a destra nella lettura da destra a sinistra), tutti interi e piatti, e l'ultima schermata è piena — nessun vuoto dopo l'ultimo elemento; un elemento tagliato da un bordo invita a scorrere. L'elemento corrente non è più al centro: è quello che l'utente ha scelto, sempre intero sullo schermo. Le frecce e Pag su / Pag giù avanzano di una schermata (gli elementi che mostra interi) e l'elemento corrente diventa il primo che la schermata ha portato; i tasti freccia avanzano di un elemento e fanno scorrere solo quanto serve per tenerlo intero; la rotellina e il trascinamento scorrono e si posano su un elemento intero, l'elemento corrente segue solo se stava per uscire; un clic su un elemento intero lo rende corrente e solleva ue_item_clicked. Le frecce stanno nei margini, si mostrano solo sotto il puntatore o con la tastiera, e spariscono a un'estremità. I punti contano le schermate (un punto è un posto dove la striscia può posarsi); il contatore conta sempre gli elementi. La riproduzione automatica avanza di una schermata e, alla fine, la prima schermata torna dal lato. Con ib_loop, la fila gira quando è abbastanza lunga da fare il giro dello schermo (circa tre elementi in più di quelli che mostra). ALIGN_START non ha effetto sulle altre disposizioni.
// 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
L'elemento davanti #
L'elemento corrente è quello davanti; of_current_key() ne legge la chiave in diretta. Un clic su un vicino lo porta davanti; un clic sull'elemento davanti solleva ue_item_clicked, un doppio clic (o Invio) ue_item_opened. Un cambiamento dell'utente — clic, tastiera, rotellina, scorrimento, punto, freccia, riproduzione automatica — e un cambiamento del vostro codice (of_select_item, of_next, of_previous) sollevano lo stesso ue_current_changed, come SelectItem solleva l'evento del clic. Con ib_veto_changes, ue_current_changing è posto prima, nei due casi: restituire FALSE lascia l'elemento davanti, e of_select_item restituisce allora -4. ue_current_changed parte anche quando l'elemento davanti se ne va (nascosto, rimosso: il più vicino prende il suo posto) e quando il primo elemento arriva in un carosello vuoto (as_from_key vuoto). Un ordine del vostro codice dentro ue_current_changing (un altro elemento selezionato) prevale: la risposta che segue non cambia più nulla. of_select_row porta davanti l'elemento di una riga e of_current_row legge la riga dell'elemento davanti; con ib_sync_row, il DataWindow dato a of_from_datastore segue l'elemento davanti — il master-detail di un DataWindow.
Un elemento disattivato (ib_enabled = false) resta al suo posto, ma l'utente non può né portarlo davanti né cliccarlo: la tastiera, la rotellina, Pag su / Pag giù, la barra di scorrimento e un lancio lo saltano; il vostro codice lo seleziona comunque. Un elemento nascosto (ib_visible = false) esce dal carosello mantenendo la sua chiave e il suo posto. Con ib_loop (almeno tre elementi), il primo segue l'ultimo. Un doppio clic su un vicino lo porta davanti e si ferma lì: né ue_item_clicked né ue_item_opened. il_autoplay_ms fa avanzare il carosello da solo, ogni tot millisecondi (almeno 500): un pulsante PAUSA / RIPRODUZIONE compare sotto di esso (ib_autoplay_button) e la pausa dell'utente tiene fino a RIPRODUZIONE (of_pause, of_play, ue_autoplay_changed); si interrompe anche sotto il puntatore, quando la tastiera è nel componente e quando il carosello è nascosto. Alla fine di un carosello che non gira in tondo, il primo elemento ritorna dal lato. Ogni passo passa da ue_current_changing come un gesto: un elemento rifiutato viene saltato, si chiede il successivo. Un lettore di schermo non viene avvisato di ogni passo durante la riproduzione.
Schede e didascalia scritte da un modello #
Una scheda mostra la sua immagine in alto, il suo titolo (is_title), il suo sottotitolo (is_subtitle), il suo corpo (is_text), le sue etichette (is_tags, separate da virgole, colorate da is_tag_tones: New=success|Sale=danger) e un badge (is_badge). Il corpo di tutte le schede può essere scritto da un modello, is_card_template, e la didascalia sotto il carosello da is_caption_template: testo formattato con tag dove {price} è un campo dell'elemento — uno dei vostri (of_set_field), una colonna del DataStore da cui proviene, o un campo predefinito (key, title, subtitle, text, image, badge, tags, position, count). {position} e {count} contano gli elementi disegnati, come il contatore. {sold:dd/mm/yyyy hh:mm} scrive una data o una data-ora, {price:#,##0.00} un numero: i formati di visualizzazione di una colonna di DataWindow (mm dopo un'ora = i minuti, [shortdate], [longdate], [time], sezioni positivo;negativo;zero), nella lingua di visualizzazione — un valore che il formato non sa scrivere è mostrato così com'è. {?x}…{/x} mantiene un pezzo quando il campo dice qualcosa, {!x}…{/x} quando non dice nulla, {{ }} sono parentesi graffe. Un valore è mostrato così com'è, mai letto come tag; {x:raw} lo mantiene come tag — riservatelo ai vostri campi: su una colonna di database leggerebbe il dato come tag, zone d'azione comprese. {title}, {subtitle}, {text} e {badge} scritti dal vostro codice sono tag, come nella didascalia; letti da una colonna, testo.
// 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]"
Da un DataStore #
of_from_datastore fa un elemento di ogni riga di un DataStore, di un DataWindow o di un DataWindowChild — la stessa chiamata. La sua chiave è il RowID della riga — nomina la sua riga finché il DataStore non viene né svuotato né riletto (Reset, Retrieve e ImportString ridanno i RowID 1, 2, 3), e of_item(key).of_row() la ritrova — o il valore della colonna ROLE_KEY, la chiave da dare non appena aggiornate. Una riga la cui chiave è vuota, non valida, già vista o tenuta da un elemento aggiunto a mano non viene caricata: la chiamata restituisce 0 e of_get_last_error la nomina — date ai vostri elementi a mano chiavi che non siano numeri. Una colonna svolge un ruolo quando ne porta il nome (key, title, subtitle, text, image, badge, tags, color) o quando of_map lo dice; la colonna ROLE_COLOR (un RGB() o #rrggbb) colora la banda di una scheda. of_map e of_reload_row aggiornano gli elementi sul posto (indicatori, campi, handle e posto restano). Anche un secondo caricamento, con ROLE_KEY: un elemento la cui chiave torna mantiene i suoi indicatori, i suoi campi e il suo handle. Senza ROLE_KEY, un secondo caricamento è una nuova epoca: un RowID che torna può nominare un altro record, ogni elemento delle righe viene rifatto (nulla è ereditato, gli handle dei vecchi sono liberati) e, se la chiave davanti torna, ue_current_changed lo dice con as_from_key = as_key. In ogni caso gli elementi prendono l'ordine delle righe (un of_move_item non sopravvive a un caricamento), quelli delle righe sparite se ne vanno, quelli aggiunti a mano restano, dopo le righe; un elemento di riga rimosso con of_remove_item torna con la sua riga — nascondetelo piuttosto (ib_visible). Le date sono lette nell'ordine regionale della postazione, i numeri si scrivono con il punto, i valori CHAR senza il loro riempimento, al caricamento come dopo of_reload_row. Ciò che una colonna dà è testo, mai tag — un [action=x] venuto dal database non è cliccabile —, e un'immagine di una colonna non va mai a cercare un percorso di rete (\\server\condivisione: ue_image_failed con REASON_UNC). Quando la colonna ROLE_KEY di una riga riletta cambia, l'elemento prende la nuova chiave: l'handle della vecchia viene liberato. Tutte le colonne sono campi dei modelli.
// 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)
Proprietà #
| Proprietà | Tipo | Predefinito | Ruolo | ||
|---|---|---|---|---|---|
is_style | string | STYLE_COVERFLOW | La disposizione: STYLE_COVERFLOW (il corrente di fronte, i suoi vicini inclinati in prospettiva), STYLE_CAROUSEL (una striscia piatta, più elementi interi), STYLE_STACK (una pila di schede), STYLE_HERO (un solo elemento su tutta la superficie, un banner). Un altro valore è rifiutato: il vecchio resta, of_get_last_error dice perché | ||
is_item_style | string | ITEM_AUTO | La faccia di ogni elemento che non ne sceglie una da sé: ITEM_AUTO (in base a ciò che porta, vedi sopra), ITEM_IMAGE, ITEM_TEXT, ITEM_CARD. Un altro valore è rifiutato | ||
is_fit | string | FIT_COVER | Come un'immagine riempie il suo riquadro: FIT_COVER (il riquadro è pieno, l'immagine ritagliata) o FIT_CONTAIN (l'immagine intera). Un altro valore è rifiutato | ||
ib_reflection | boolean | false | Un riflesso sotto gli elementi, come su un pavimento lucido | ||
ib_loop | boolean | false | Dopo l'ultimo elemento viene il primo (e prima del primo, l'ultimo). Servono almeno tre elementi | ||
il_autoplay_ms | long | 0 | Riproduzione automatica: l'elemento successivo viene davanti ogni il_autoplay_ms millisecondi (almeno 500, un valore più piccolo viene portato a esso); 0 la ferma. Un pulsante PAUSA / RIPRODUZIONE compare sotto il carosello (ib_autoplay_button); si interrompe anche sotto il puntatore, quando la tastiera è nel componente e quando il carosello è nascosto. Alla fine di un carosello che non gira in tondo, il primo ritorna dal lato; un elemento che ue_current_changing rifiuta viene saltato | ||
ib_show_caption | boolean | true | La didascalia dell'elemento davanti: il suo titolo (e il suo sottotitolo), sottolineato con l'accento, o ciò che scrive is_caption_template; sta subito sotto di esso o sul suo piede (is_caption_position) | ||
is_caption_position | string | CAPTION_AUTO | Dove sta la didascalia: CAPTION_BELOW (subito sotto l'elemento davanti, sotto il suo riflesso se ne ha uno), CAPTION_OVERLAY (sul suo piede, in bianco su un velo scuro), CAPTION_AUTO (sotto un'immagine — sul suo piede in un banner —, e nessuna sotto schede o testi che scrivono già il loro titolo, a meno che is_caption_template dica cosa scrivere). Un altro valore è rifiutato | ||
ib_autoplay_button | boolean | true | Un pulsante PAUSA / RIPRODUZIONE sotto il carosello finché il_autoplay_ms gira, e una sottile barra che si riempie fino al prossimo elemento: chi legge può fermare ciò che si muove. La pausa dell'utente tiene fino a RIPRODUZIONE; ue_autoplay_changed lo dice. false: nessun pulsante | ||
is_indicator | string | INDICATOR_AUTO | Ciò che mostra dove si è, sotto la didascalia: INDICATOR_AUTO (punti fino a 12 elementi, una barra di scorrimento oltre), INDICATOR_DOTS (punti cliccabili, fino a 48 elementi: oltre, la barra), INDICATOR_SCROLLBAR (una barra da cliccare e trascinare), INDICATOR_COUNTER (3 / 12), INDICATOR_NONE. Un altro valore è rifiutato | ||
ib_arrows | boolean | true | I due pulsanti a freccia sui lati: quello di sinistra va sempre a sinistra | ||
ii_item_width | integer | 0 | La larghezza di un riquadro, in pixel (da 24 a 4000, un valore fuori limiti viene riportato dentro); 0: in base alla dimensione del componente e a is_item_ratio. Una larghezza impostata con un'altezza 0: l'altezza segue la proporzione. Senza effetto su STYLE_HERO: il suo elemento prende tutta la superficie | ||
ii_item_height | integer | 0 | L'altezza di un riquadro, in pixel (da 24 a 4000); 0: in base alla dimensione del componente, lasciando vedere i vicini e la didascalia. Un'altezza impostata con una larghezza 0: la larghezza segue la proporzione. Senza effetto su STYLE_HERO | ||
is_item_ratio | string | "" | La proporzione di un riquadro, larghezza:altezza: "1:1", "3:4", "16:9"… Il riquadro la mantiene qualunque sia la dimensione del componente. Vuoto: in base alla faccia della maggior parte degli elementi — 1:1 per immagini, 3:4 per schede, 16:9 per testi. Un valore che non sia due numeri positivi uniti da : è rifiutato. Senza effetto su STYLE_HERO | ||
ii_angle | integer | 62 | La rotazione delle copertine sui lati del Cover Flow, in gradi, da 0 (piatte) a 80; 62 è quella di iTunes | ||
ii_spacing | integer | 100 | La spaziatura delle copertine del Cover Flow e dei riquadri di una striscia, in percentuale di ciò che il carosello calcola: 100 distribuisce le copertine sulla larghezza disponibile, da 25 a 300 le avvicina o le allontana | ||
ib_shade | boolean | true | Le copertine sui lati si scuriscono con la loro distanza, perché l'elemento davanti attiri lo sguardo; anche le schede che aspettano dietro una pila | ||
is_transition | string | TRANSITION_SLIDE | Come un banner (STYLE_HERO) cambia elemento: TRANSITION_SLIDE (il successivo scivola dal lato) o TRANSITION_FADE (appare in dissolvenza). Un altro valore è rifiutato | ||
is_align | string | ALIGN_CENTER | Dove sta l'elemento corrente su una striscia (STYLE_CAROUSEL): ALIGN_CENTER (al centro) o ALIGN_START (la fila di un servizio video, allineata al bordo d'inizio, che avanza di una schermata: vedi sopra). Nessun effetto sulle altre disposizioni. Un altro valore è rifiutato | ||
is_card_template | string | "" | Il corpo di ogni scheda, scritto da un modello (vedi sopra). Impostare un modello fa di ogni elemento ITEM_AUTO una scheda. Vuoto: il testo dell'elemento (is_text) | ||
is_caption_template | string | "" | La didascalia sotto il carosello, scritta da un modello (gli stessi campi). Vuoto: il titolo, e il sottotitolo sotto | ||
is_tag_tones | string | "" | Il tono di ogni etichetta, etichetta=tono uniti da ` | : New=success | Sale=danger. Toni: TONE_SUCCESS, TONE_WARN, TONE_DANGER, TONE_INFO (l'accento), TONE_NEUTRAL`. Un'etichetta non elencata, o un tono sconosciuto, è neutra |
is_badge_format | string | "" | Il formato di visualizzazione dei badge che sono un numero o una data — una colonna ROLE_BADGE del DataStore, o un valore che il vostro codice scrive: "$#,##0.00", "dd/mm/yyyy", il formato di una colonna di DataWindow, nella lingua di visualizzazione. Un badge che non è né l'uno né l'altro (tag, una parola) è mostrato così com'è. Vuoto: ogni badge così com'è | ||
ib_sync_row | boolean | false | Master-detail: il DataWindow (o DataWindowChild) dato a of_from_datastore segue l'elemento davanti — ScrollToRow sulla sua riga a ogni cambiamento, gesto o codice. Nell'altro senso, chiamate of_select_row dal suo RowFocusChanged. Un DataStore non ha righe da mostrare: nulla si muove; un elemento aggiunto a mano non ha riga | ||
ib_veto_changes | boolean | false | Opt-in: chiedere ue_current_changing prima di ogni cambiamento dell'elemento davanti, dell'utente, della riproduzione automatica come di of_select_item. La riproduzione automatica salta un elemento rifiutato; la tastiera resta ferma — un elemento sempre rifiutato è meglio disattivarlo. Un ordine del vostro codice in ue_current_changing prevale: la risposta che segue non cambia nulla. Disattivato per impostazione predefinita, come ogni evento annullabile della libreria | ||
ib_animated | boolean | true | Gli elementi scivolano fino al loro nuovo posto. Una postazione impostata per ridurre le animazioni salta direttamente, a meno che l'applicazione insista (PBT_SetAnimationPolicy) | ||
ii_anim_duration | integer | 450 | Durata di un movimento, in millisecondi (da 0 a 5000) | ||
is_anim_easing | string | EASING_EASE_OUT | La curva del movimento: EASING_LINEAR, EASING_EASE_OUT, EASING_BACK_OUT (va un po' oltre poi torna), EASING_BOUNCE_OUT (rimbalza), EASING_ELASTIC_OUT (oscilla) | ||
ib_enabled | boolean | true | false disattiva il carosello: gli elementi restano visibili, più nulla risponde all'utente (clic, tastiera, rotellina, scorrimento, riproduzione automatica) | ||
is_theme_style | string | "" | Stile visivo del componente (costanti THEME_STYLE_*); vuoto = quello dell'applicazione, seguito a ogni cambio | ||
is_theme_mode | string | "" | Variante chiara o scura (costanti THEME_MODE_*); vuoto = quella dell'applicazione, seguita a ogni cambio | ||
il_theme_accent | long | -1 | Colore d'accento di questo componente (-1 = accento dell'applicazione, o quello del tema) | ||
is_tooltip | string | "" | Tooltip semplice mostrato al passaggio del mouse sul componente | ||
is_super_tooltip_title | string | "" | Titolo del tooltip avanzato (prevale su is_tooltip) | ||
is_super_tooltip_text | string | "" | Testo del tooltip avanzato (markup avanzato accettato) | ||
is_super_tooltip_image | string | "" | Immagine del tooltip avanzato |
Proprietà di un elemento — n_pbt_carousel_item #
Il suo handle, tramite of_item(key). Una lettura chiede al carosello com'è ora.
| Proprietà | Tipo | Predefinito | Ruolo |
|---|---|---|---|
is_title | string | "" | Titolo dell'elemento: la didascalia quando è davanti, e la prima riga di una scheda. Accetta il testo formattato con tag. Vuoto, l'elemento mostra la sua chiave |
is_subtitle | string | "" | La seconda riga, sotto il titolo di una scheda e della didascalia (tag accettati). Un'immagine con un sottotitolo resta un'immagine: il sottotitolo va nella sua didascalia |
is_text | string | "" | Il testo (tag accettati): tutta la faccia di un elemento testo, il corpo di una scheda finché is_card_template è vuoto. Una zona [action=x] solleva ue_action_clicked sull'elemento davanti |
is_image | string | "" | L'immagine: un file della postazione, una risorsa file.dll:nome, un glifo mono: / tint: disegnato nel tema, un indirizzo https://. http:// è rifiutato (ue_image_failed, REASON_INSECURE), così come un percorso di rete venuto da una colonna di DataStore (REASON_UNC). Uno scheletro a tema si vede finché l'immagine arriva |
is_badge | string | "" | Piccolo badge (tag accettati): un prezzo, un numero, nell'accento — in alto a destra di una scheda, sull'angolo di un'immagine. Un'immagine con un badge resta un'immagine |
is_tags | string | "" | Etichette di una scheda, separate da virgole: Vinyl, Sale. Ognuna è una pastiglia colorata da is_tag_tones del carosello |
is_style | string | "" | La faccia di questo elemento (ITEM_* di u_pbt_carousel); vuoto: segue is_item_style del carosello. Un altro valore è rifiutato: resta il vecchio, of_get_last_error del carosello dice perché |
ib_visible | boolean | true | false toglie l'elemento dal carosello; mantiene la sua chiave e il suo posto. Se era davanti, il più vicino prende il suo posto (ue_current_changed) |
ib_enabled | boolean | true | false disattiva l'elemento: l'utente non può né portarlo davanti né cliccarlo, la tastiera e la rotellina lo saltano. Il vostro codice lo seleziona comunque |
of_position ( ) → long | — | — | Restituisce la posizione dell'elemento nel carosello ora, contata da 1 (elementi nascosti compresi); 0 quando il carosello non lo contiene |
of_row ( ) → long | — | — | Restituisce il numero di riga di oggi, nelle righe date a of_from_datastore, della riga da cui viene l'elemento — dopo un ordinamento, un filtro o l'eliminazione di altre righe, finché il DataStore non viene né svuotato né riletto; 0 per un elemento aggiunto a mano o la cui riga è sparita |
of_face ( ) → string | — | — | La faccia con cui l'elemento è disegnato ora: "image", "text" o "card" (ITEM_IMAGE, ITEM_TEXT, ITEM_CARD) — ciò che ha scelto is_style o ciò che ITEM_AUTO ha dedotto; vuoto quando il carosello non lo contiene |
is_tooltip | string | "" | Tooltip semplice mostrato al passaggio del mouse sull'item |
is_super_tooltip_title | string | "" | Titolo del tooltip avanzato dell'item (prevale su is_tooltip) |
is_super_tooltip_text | string | "" | Testo del tooltip avanzato dell'item (markup avanzato accettato) |
is_super_tooltip_image | string | "" | Immagine del tooltip avanzato dell'item |
il_accent | long | -1 | Accento dell'elemento: la banda in alto di una scheda (che fa comparire) e di un pannello di testo, e il badge, lo prendono; prevale sul colore di una colonna ROLE_COLOR. I punti e la didascalia mantengono l'accento del componente. -1 = quello del componente |
il_back_color | long | -1 | Sfondo di una faccia testo o scheda, in RGB(r,g,b) (-1 = quello che dà il tema). Una faccia immagine non ha sfondo |
il_text_color | long | -1 | Colore del testo di una faccia testo o scheda (-1 = quello che dà il tema) |
il_back_color_hover | long | -1 | Sfondo di una faccia testo o scheda sotto il puntatore, in RGB(r,g,b) (-1 = il suo sfondo abituale). Al passaggio nulla si muove : cambia solo il colore |
il_text_color_hover | long | -1 | Colore del testo di una faccia testo o scheda sotto il puntatore (-1 = il suo colore abituale) |
Tre letture dell'handle, in sola lettura: of_position() restituisce la posizione dell'elemento a partire da 1, of_row() il numero della sua riga nel DataStore (0 per un elemento aggiunto a mano), of_face() la faccia scelta. Un elemento si sposta con of_move_item del carosello.
Metodi #
| Metodo | Ruolo | |
|---|---|---|
of_add_item (string as_key, string as_title) | Aggiunge un elemento alla fine del carosello, un titolo solo (una scheda): la sua immagine, il suo testo, il suo sottotitolo… si impostano sul suo handle. La sua chiave è unica nel carosello. Il primo elemento di un carosello vuoto viene davanti (ue_current_changed). Restituisce 0 una volta aggiunto, -5 per una chiave vuota, con / o ` | , che comincia con __, o già presa (elementi di un DataStore compresi), -2` quando il componente non è creato |
of_add_item (string as_key, string as_title, string as_image) | Lo stesso con la sua immagine. Con ITEM_AUTO, un'immagine e un titolo soli fanno un elemento immagine, il titolo come didascalia. Restituisce 0 una volta aggiunto, -5 come sopra, -2 quando il componente non è creato | |
of_clear ( ) | Svuota il carosello: elementi (quelli di un DataStore compresi) e i loro handle; il DataStore resta legato per un nuovo of_from_datastore, le opzioni restano. Segue ue_current_changed, con una chiave vuota, se c'era un elemento davanti. Restituisce 0 una volta applicato, -2 quando il componente non è creato | |
of_current_key ( ) | La chiave dell'elemento davanti, chiunque ve l'abbia portato; vuota quando il carosello è vuoto. Letta in diretta | |
of_current_row ( ) | Il numero di riga di oggi, nelle righe date a of_from_datastore, dell'elemento davanti — dopo un ordinamento, un filtro o l'eliminazione di altre righe. Restituisce 0 quando il carosello è vuoto, quando l'elemento davanti è stato aggiunto a mano o la sua riga è sparita | |
of_from_datastore (datastore ads) | Fa un elemento di ogni riga del DataStore (vedi sopra). Un secondo caricamento aggiorna gli elementi sul posto con ROLE_KEY, li rifà senza (una nuova epoca: nulla è ereditato); quelli delle righe sparite se ne vanno (handle liberati), quelli aggiunti a mano restano, dopo le righe; una riga non caricata è nominata da of_get_last_error. Restituisce 0 una volta caricato, -5 quando il DataStore non è valido, -2 quando il componente non è creato | |
of_from_datastore (datawindow adw) | Lo stesso dalle righe di un DataWindow, lette da un DataStore che le condivide (ShareData). Restituisce 0 una volta caricato, -5 quando il DataWindow non è valido o rifiuta di condividere le sue righe (of_get_last_error lo dice), -2 quando il componente non è creato | |
of_from_datastore (datawindowchild adwc) | Lo stesso dalle righe di un DataWindowChild (un elenco a discesa DataWindow, un report annidato). Restituisce 0 una volta caricato, -5 quando non è valido, -2 quando il componente non è creato | |
of_get_field (string as_key, string as_field) | Legge un campo di un elemento, in diretta: uno dei vostri, una colonna del suo DataStore o un campo predefinito (title, position, count…). Una stringa vuota quando non ne ha | |
of_get_last_error ( ) | Perché l'ultima chiamata è fallita: un metodo che ha restituito -5 o -4, un valore rifiutato (is_style, is_item_style, is_indicator, is_fit, is_caption_position, is_transition, is_item_ratio, is_align, is_style di un elemento), una chiamata fatta durante un'attesa (nulla ha potuto essere giudicato), le righe che un caricamento ha lasciato fuori. Svuotato da ogni metodo che agisce (una lettura lo lascia); altrimenti l'ultimo errore della libreria | |
of_insert_item (string as_key, string as_title, string as_image, long al_position) | Aggiunge un elemento in una posizione contata da 1 (oltre l'ultima: alla fine). L'elemento davanti resta davanti. Restituisce 0 una volta aggiunto, -5 come of_add_item, -2 quando il componente non è creato | |
of_is_playing ( ) | TRUE finché la riproduzione automatica gira: il_autoplay_ms è impostato e nessuno ha premuto PAUSA (un puntatore sul carosello la sospende un istante: gira comunque). Letto in diretta | |
of_item (string as_key) | Restituisce l'handle di un elemento (creato al primo accesso, liberato quando l'elemento è rimosso) | |
of_map (string as_role, string as_column) | Dà un ruolo a una colonna del DataStore quando il suo nome non lo dice (ROLE_KEY, ROLE_TITLE, ROLE_SUBTITLE, ROLE_TEXT, ROLE_IMAGE, ROLE_BADGE, ROLE_TAGS, ROLE_COLOR). Prima o dopo of_from_datastore: dopo, le righe sono rilette sul posto. Una colonna vuota restituisce il ruolo alla colonna che ne porta il nome; un nuovo ROLE_KEY dà nuove chiavi agli elementi (gli handle delle vecchie sono liberati). Restituisce 0 una volta impostato, -5 per un ruolo sconosciuto o una colonna che il DataStore non ha, -2 quando il componente non è creato | |
of_move_item (string as_key, long al_position) | Sposta un elemento in una posizione contata da 1 (oltre l'ultima: l'ultima). L'elemento davanti resta davanti. Restituisce 0 una volta spostato, -5 per un elemento sconosciuto, -2 quando il componente non è creato | |
of_next ( ) | Porta davanti l'elemento successivo (quelli disattivati saltati; dopo l'ultimo, il primo con ib_loop), come il tasto freccia verso di esso (Destra, Sinistra da destra a sinistra), e solleva ue_current_changed. Restituisce 0 una volta fatto (anche alla fine: nulla si muove, nulla viene sollevato), -4 quando ue_current_changing ha rifiutato, -5 durante un'attesa (nulla ha potuto essere giudicato), -2 quando il componente non è creato | |
of_pause ( ) | Mette in pausa la riproduzione automatica, come il pulsante PAUSA: l'elemento davanti resta fino a of_play (o RIPRODUZIONE). Segue ue_autoplay_changed — un ordine del codice lo solleva come il pulsante. Restituisce 0 una volta in pausa (anche se lo è già: nulla viene sollevato), -5 quando il_autoplay_ms vale 0, -2 quando il componente non è creato | |
of_play ( ) | Riavvia la riproduzione automatica dopo una pausa — il pulsante PAUSA dell'utente o of_pause. Segue ue_autoplay_changed. Restituisce 0 una volta ripartita (anche se gira già: nulla viene sollevato), -5 quando il_autoplay_ms vale 0 (niente da riprodurre), -2 quando il componente non è creato | |
of_previous ( ) | Porta davanti l'elemento precedente, come il tasto freccia verso di esso. Restituisce 0 una volta fatto (anche all'inizio: nulla si muove, nulla viene sollevato), -4 quando ue_current_changing ha rifiutato, -5 durante un'attesa, -2 quando il componente non è creato | |
of_reload_row (long al_row) | Rinvia al carosello una riga del DataStore di of_from_datastore, letta ora, dopo che il vostro codice l'ha cambiata (SetItem, una finestra di inserimento); il suo elemento è aggiornato sul posto (indicatori, campi, handle e posto restano). Una riga che il carosello non tiene ancora (InsertRow) arriva dopo l'ultimo elemento di riga. Quando la colonna ROLE_KEY della riga è cambiata, l'elemento prende la nuova chiave: l'handle della vecchia è liberato e, se era davanti, ue_current_changed lo dice. Restituisce 0 una volta inviata, -5 quando nulla è collegato, la riga non esiste o la sua chiave è vuota, non valida o tenuta da un altro elemento (of_get_last_error lo dice), -2 quando il componente non è creato | |
of_remove_item (string as_key) | Rimuove un elemento e libera il suo handle; rimuovere l'elemento davanti porta davanti il più vicino (ue_current_changed). Un elemento di riga di un DataStore torna con la sua riga (of_reload_row, un nuovo caricamento): nascondetelo (ib_visible) o eliminate la riga. Restituisce 0 una volta rimosso, -5 per un elemento sconosciuto, -2 quando il componente non è creato | |
of_reset ( ) | Svuota il carosello, dimentica il DataStore e riporta ogni proprietà al suo valore predefinito. Restituisce 0 una volta applicato, -2 quando il componente non è creato | |
of_select_item (string as_key) | Porta un elemento davanti, come un clic: scivola fin lì e segue ue_current_changed. Con ib_veto_changes, ue_current_changing è posto prima. Un elemento disattivato è selezionato comunque: la disattivazione ferma l'utente, non il vostro codice. Restituisce 0 una volta fatto (o già davanti: niente è sollevato), -4 quando ue_current_changing ha rifiutato, -5 per un elemento sconosciuto o non disegnato (nascosto, oltre il limite demo), -2 quando il componente non è creato | |
of_select_row (long al_row) | Porta davanti l'elemento di una riga delle righe date a of_from_datastore — al_row è il numero di riga di oggi, qualunque cosa dica ROLE_KEY: il master-detail di un DataWindow, chiamato dal suo RowFocusChanged. Come of_select_item sulla sua chiave: segue ue_current_changed, ib_veto_changes chiede prima. Restituisce 0 una volta davanti (o già davanti), -4 quando ue_current_changing ha rifiutato, -5 quando nulla è collegato, la riga non esiste o non ha dato alcun elemento (lasciata fuori dal caricamento, rimossa, nascosta, oltre il limite demo), -2 quando il componente non è creato | |
of_set_field (string as_key, string as_field, string as_value) | Dà a un elemento un vostro campo, per i modelli: {price}; prevale su una colonna del DataStore con lo stesso nome. Un nome di campo: lettere, cifre e _, senza cifra iniziale. Restituisce 0 una volta impostato, -5 per un elemento sconosciuto o un nome non valido, -2 quando il componente non è creato |
Eventi #
| Event | Attivato quando |
|---|---|
ue_current_changed (string as_from_key, string as_key) | L'elemento davanti è cambiato: un clic su un vicino, la tastiera, la rotellina, uno scorrimento, un punto, una freccia, la riproduzione automatica, o il vostro codice (of_select_item, of_next, of_previous). Anche quando l'elemento davanti se ne va (nascosto, rimosso: il più vicino prende il suo posto) quando il primo elemento arriva in un carosello vuoto (as_from_key vuoto), e quando un nuovo caricamento senza ROLE_KEY dà la chiave davanti a un altro record (as_from_key = as_key). as_key vuoto: il carosello è vuoto. Con ib_sync_row, il DataWindow collegato mostra già la riga |
ue_current_changing (string as_from_key, string as_key) → boolean | Annullabile, posto prima di un cambiamento dell'elemento davanti, solo quando ib_veto_changes = true: gesto, riproduzione automatica e of_select_item (quindi of_next, of_previous). Restituire FALSE lascia l'elemento davanti, e of_select_item restituisce allora -4. Predefinito: TRUE |
ue_item_clicked (string as_key) | L'elemento davanti è stato cliccato (o premuto Spazio). Un clic su un vicino lo porta invece davanti (ue_current_changed) — e un doppio clic su un vicino lo porta soltanto, senza questo evento; una zona [action=x] solleva invece ue_action_clicked; un elemento disattivato non solleva nulla |
ue_item_opened (string as_key) | Un doppio clic sull'elemento davanti, o Invio: apritelo. Un doppio clic su un vicino lo porta soltanto davanti |
ue_item_rclicked (string as_key, long al_x, long al_y) | Un clic destro su un elemento, o il tasto menu (o Maiusc + F10) sull'elemento davanti. al_x, al_y sono pixel dello schermo; per un menu PowerBuilder, PopMenu(PointerX(), PointerY()) della vostra finestra |
ue_action_clicked (string as_key, string as_action) | È stata cliccata una zona [action=x] del testo dell'elemento davanti: as_action = "x" |
ue_autoplay_changed (boolean ab_playing) | La riproduzione automatica è stata messa in pausa (ab_playing = false) o ripresa (true): il pulsante PAUSA / RIPRODUZIONE sotto il carosello, o il vostro codice (of_pause, of_play lo sollevano anche). Un puntatore sul carosello la sospende senza sollevarlo |
ue_image_failed (string as_key, string as_reason) | L'immagine di un elemento non ha potuto essere mostrata: as_reason vale REASON_INSECURE (un indirizzo http://), REASON_UNC (un percorso di rete venuto da una colonna di DataStore, rifiutato prima di ogni richiesta) o REASON_NOT_FOUND (file non trovato). Detto una volta per elemento e per immagine |
ue_ready ( ) | Il componente ha terminato il caricamento; tutto ciò che è stato inviato prima è stato riprodotto |
ue_runtime_missing ( ) | Il runtime WebView2 è assente: il componente resta vuoto |
ue_bg_color (long al_color) | Il componente ha calcolato il colore di sfondo del proprio tema; l'userobject lo ha già adottato (backcolor) |
Tastiera e mouse #
- Clic su un vicino: viene davanti; sull'elemento davanti:
ue_item_clicked; doppio clic:ue_item_opened(su un vicino: viene davanti, nient'altro); clic destro:ue_item_rclicked. - Trascinare o scorrere: la striscia segue il puntatore; al rilascio, la sua velocità la porta qualche elemento più in là. Senza
ib_loop, i bordi sono elastici. Rilasciato fuori dal carosello, il trascinamento termina comunque. - Rotellina: segue la sua velocità — uno scatto, un elemento; un grande giro, diversi; un touchpad somma i suoi piccoli passi.
- Sinistra / Destra: l'elemento precedente, il successivo — invertite in un'applicazione da destra a sinistra; Su / Giù: lo stesso; Inizio / Fine: il primo, l'ultimo; Pag su / Pag giù: di tanti elementi quanti la scena ne mostra. Gli elementi disattivati sono saltati, ovunque.
- Le prime lettere di un titolo lo portano davanti (maiuscole e accenti ignorati); la stessa lettera di nuovo va al successivo che inizia con essa.
- Invio:
ue_item_opened; Spazio:ue_item_clicked; tasto Menu o Maiusc + F10:ue_item_rclickedsull'elemento davanti. - Le frecce laterali (
ib_arrows, nelle loro scanalature: non coprono nessun riquadro), i punti e la barra di scorrimento (is_indicator) si cliccano; la barra si trascina anche. Il pulsante PAUSA / RIPRODUZIONE (ib_autoplay_button) si clicca o si raggiunge con la tastiera. - Il carosello è una fermata del tasto Tab (due con il pulsante PAUSA); un anello dell'accento circonda l'elemento davanti finché la tastiera è lì.
Esempi #
Una vetrina di prodotti #
// 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]"
Chiedere prima di cambiare 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
Aprire un elemento di un DataStore nella vostra finestra #
// 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)
Notizie che scorrono da sole #
// 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)
Un grande catalogo #
// 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")
Buone pratiche #
- Immagini delle stesse proporzioni: il Cover Flow si legge con un colpo d'occhio quando i riquadri hanno la stessa forma;
is_item_ratiola fissa,FIT_CONTAINmostra l'immagine intera. - Poco testo per faccia: una scheda si legge in due righe, il dettaglio va nella vostra finestra (
ue_item_opened). - Una riproduzione automatica lenta (da quattro a sei secondi), con il suo pulsante PAUSA: chi legge deve poter fermare ciò che si muove.
- Chiavi che non siano numeri per i vostri elementi a mano, in un carosello alimentato da un DataStore: un elemento di chiave
12impedisce alla riga di RowID 12 di essere caricata (of_get_last_errorlo dice). ROLE_KEYnon appena aggiornate un DataStore (Retrieve,Reset): senza, un ricaricamento rifà ogni elemento, perché un RowID che torna può nominare un altro record.- Molti elementi non costano nulla: solo quelli alla portata dell'elemento davanti sono disegnati, e un'immagine si carica solo quando si avvicina — l'utente raggiunge un titolo digitandolo.
Ereditato dalla base comune #
Questi membri esistono su tutti i componenti visivi — non sono propri di questo. Sono descritti una sola volta, nei capitoli trasversali; questa tabella dice solo dove leggerli.
| Membri | Ruolo | Descritto in |
|---|---|---|
of_count · of_keys_at · of_has | Percorrere ciò che il componente contiene | 3.2 Gli item |
of_reset | Riportare il componente a zero | 3.6 Riportare un componente a zero: of_reset() |
of_register_shortcut · of_clear_shortcuts | Scorciatoie da tastiera del componente | 3.5 Le scorciatoie da tastiera |
of_is_created · of_is_ready · of_get_last_error | Se è nato, se è pronto, cosa è fallito | 3.7 Diagnostica |
of_save_as_png · of_save_as_jpg | Esportare il rendering in immagine | 3.8 Esportare il rendering come immagine |
of_set_redraw | Raggruppare le modifiche in un solo ridisegno | 3.10 Buone pratiche |
of_preload_icons | Icone mostrate senza ritardo | Visualizzazione istantanea: of_icon |
of_set_translation | Tradurre una dicitura del componente | 5.2 Adattare un'etichetta: of_set_translation |
of_focus_webview | Dare il focus al componente | 6.4 Tastiera e focus |
of_print · of_print_to_pdf | Stampare, o scrivere un PDF | 6.9 Stampare |
of_set_property · of_get_property · of_component_name | Pilotare una proprietà per nome | 3.1 Il motore delle proprietà |
is_accessible_name · is_accessible_description | Il nome e la descrizione che dice un lettore di schermo | 3.4 Proprietà ed event opzionali |
Due aiuti non sono ereditati: of_icon e of_escape_markup vivono su n_pbt_utils. Ne dichiari uno — n_pbt_utils lnv_utils, niente da creare — e li chiami su di esso.