kanban — u_pbt_kanban #
← Riferimento dei componenti · Sommario della guida
kanban è un tabellone di schede ordinate in colonne — le fasi di un lavoro: da fare, in corso, in revisione, fatto. L'utente trascina una scheda da una colonna all'altra, o la sposta su e giù nella sua;
ue_card_movedvi dice quale, da dove, verso dove e in quale posizione. Ogni scheda mostra un titolo, etichette colorate, il suo assegnatario, una scadenza che diventa rossa in ritardo e un badge; ogni colonna ha il suo limite di lavoro in corso e si comprime. Il tabellone si riempie a mano o da un DataStore, che riceve gli spostamenti.
▶ Vederlo dal vivo — Applicazione dimostrativa, riquadro Kanban board: l'anteprima, il codice che lo produce e questa pagina, affiancati.
In breve #
| Userobject | u_pbt_kanban |
| Classi di elementi | n_pbt_kanban_column (of_column(key)), n_pbt_kanban_card (of_card(key)) |
| Serve a | Seguire un flusso di lavoro: ticket, attività, ordini, candidature |
| Principio | Una scheda ha una chiave unica su tutto il tabellone; la sua colonna è uno stato che cambia a ogni spostamento |
| Opzioni opt-in | ib_veto_moves, ib_write_back, ib_reorderable, ib_toolbar, ib_add_button, ib_quick_add |
Avvio rapido #
// The columns, in the order of the work
uo_board.of_add_column(/*key*/ "todo", /*title*/ "To do")
uo_board.of_add_column(/*key*/ "doing", /*title*/ "In progress")
uo_board.of_add_column(/*key*/ "done", /*title*/ "Done")
// The cards : a key unique on the board, a column, a title
uo_board.of_add_card(/*key*/ "t1", /*column*/ "todo", /*title*/ "Login page")
uo_board.of_add_card(/*key*/ "t2", /*column*/ "doing", /*title*/ "Crash on save")
uo_board.of_card(/*key*/ "t2").is_tags = "Bug"
uo_board.of_card(/*key*/ "t2").is_assignee = "Alan Turing"
// event ue_card_moved of uo_board : (string as_key, string as_from_column,
// string as_to_column, long al_position, long al_from_position)
// Save the new state of the task
UPDATE tasks SET status = :as_to_column WHERE id = :as_key;
Colonne, schede e posizioni #
Una colonna si designa con la sua chiave, una scheda anche — e la chiave di una scheda è unica su tutto il tabellone, non solo nella sua colonna: una scheda mantiene la sua chiave quando cambia colonna, i suoi handle restano validi e ogni evento la nomina da sola. La colonna di una scheda si legge con of_card(key).of_column(), la sua posizione con of_position(); una posizione si conta da 1, schede nascoste comprese.
Una colonna ha un limite di lavoro in corso (il_limit): la sua intestazione conta 3/5, e diventa rossa oltre. Il limite è morbido — la scheda arriva comunque; per un limite rigido, rifiutate lo spostamento in ue_card_moving confrontando il_limit con of_visible_count() della colonna, ciò che conta l'intestazione (una scheda nascosta non conta). ib_done marca la colonna del lavoro finito: le sue schede non sono mai in ritardo. Una colonna si comprime in una striscia stretta (la sua freccia, ib_collapsed); vi si deposita ancora una scheda, in fondo.
Uno spostamento dell'utente (trascinamento, Ctrl + frecce, o la scheda sollevata con Spazio e posata) e uno spostamento del vostro codice (of_move_card) sollevano lo stesso ue_card_moved, come SelectItem solleva l'evento del clic. Con ib_veto_moves, ue_card_moving è posto prima, nei due casi: restituire FALSE lascia la scheda dov'è, e of_move_card restituisce allora -4.
Con ib_reorderable = true, l'utente riordina anche le colonne: trascina l'intestazione di una colonna (una barra d'accento verticale mostra dove cadrà, Esc annulla) o preme Ctrl + Maiusc + Sinistra / Destra. ue_column_moved dà la colonna e le sue due posizioni, contate da 1 tra tutte le colonne; of_move_column fa lo stesso dal vostro codice e solleva lo stesso evento, con ue_column_moving posto prima con ib_veto_moves. Disattivato per impostazione predefinita: le colonne sono il processo della vostra applicazione. Ciò che l'utente ha sistemato — l'ordine delle colonne e la loro compressione — si legge con of_get_layout, si restituisce con of_set_layout, e ogni cambiamento solleva ue_layout_changed con la disposizione intera: salvatela, restituitela al prossimo avvio.
Il contenuto di una scheda #
Una scheda mostra il suo titolo (is_title), il suo testo (is_text, tagliato dopo quattro righe), le sue etichette (is_tags, separate da virgole, colorate da is_tag_tones: Bug=danger|UI=info), il suo assegnatario (is_assignee, un avatar rotondo con le iniziali), la sua scadenza (is_due, aaaa-mm-gg: rossa una volta superata, arancione il giorno stesso, confrontata con is_today o con la data della postazione) e un badge (is_badge). Titolo, testo e badge accettano il testo formattato con tag.
Il corpo delle schede può essere scritto da un modello, is_card_template: testo formattato dove {customer} è un campo della scheda — uno dei vostri (of_set_field), una colonna del DataStore da cui proviene, o un campo predefinito (title, text, tags, assignee, initials, badge, due, column, column_title, key). {due:dddd d mmmm} scrive una data come un formato di visualizzazione di DataWindow (i simboli d dd ddd dddd m mm mmm mmmm yy yyyy, un testo tra virgolette doppie — fuori dalle virgolette, una lettera d, m o y è un simbolo —, [shortdate] e [longdate] nella lingua di visualizzazione), {?amount}…{/amount} mantiene un pezzo quando il campo dice qualcosa, {!amount}…{/amount} quando non dice nulla, {x:raw} mantiene un valore come tag, {{ }} sono parentesi graffe. Un valore è sempre mostrato così com'è, mai letto come tag.
// A field of our own, then the body of every card
uo_board.of_set_field(/*key*/ "t1", /*field*/ "customer", /*value*/ "Acme")
uo_board.is_card_template = "{?customer}For [b]{customer}[/b]{/customer}{?due} - due {due:d mmm}{/due}"
Da un DataStore #
of_from_datastore fa una scheda di ogni riga di un DataStore, di un DataWindow o di un DataWindowChild — la stessa chiamata, e un DataWindow viene riscritto esso stesso. La sua chiave è il RowID della riga — of_card(key).of_row() restituisce il numero della sua riga finché il DataStore non viene svuotato né riletto — o il valore della colonna ROLE_KEY. Una riga la cui chiave è vuota, non valida, già vista o tenuta da una scheda aggiunta a mano non viene caricata: la chiamata restituisce 0 e of_get_last_error la nomina con il suo numero — date alle vostre schede a mano chiavi che non siano numeri. Una colonna svolge un ruolo quando ne porta il nome (title, text, tags, assignee, due, badge, color, order, column, key) o quando of_map lo dice. La colonna ROLE_COLUMN dice in quale colonna del tabellone si trova la scheda; un valore che nessuna colonna porta riceve una propria colonna, in fondo — un valore che contiene / o | prende una chiave in cui diventano - (R&D-QA) e conserva il suo valore, quello che uno spostamento riscrive; un valore vuoto non viene caricato (of_get_last_error lo nomina), un valore CHAR completato da spazi trova la sua colonna. Una colonna nata da un valore se ne va una volta vuota, a meno che il vostro codice le abbia dato una proprietà o un colore. ROLE_ORDER ordina le schede di una colonna: il rango è la posizione di una scheda tra le schede del DataStore della sua colonna, da 1 (una scheda aggiunta a mano non prende rango). Con una chiave ROLE_KEY, un secondo caricamento, of_map e of_reload_row aggiornano le schede sul posto: una scheda che torna mantiene i suoi indicatori, i suoi campi e il suo handle. Con la chiave RowID, un secondo of_from_datastore è un nuovo caricamento: PowerBuilder ridà gli stessi RowID dopo un Reset o un Retrieve, ad altri record — tutte le schede delle vecchie righe se ne vanno (il loro handle è liberato) e le schede vengono rifatte; of_map e of_reload_row restano sul posto. Una scheda che il vostro codice ha tolto non torna con of_map: la sua riga resta nel DataStore, il prossimo of_from_datastore la rilegge. Le date e i decimali sono letti secondo le impostazioni regionali della postazione (un campo decimale si legge 1234.5). Tutte le colonne sono campi del modello.
Con ib_write_back = true, una scheda di una riga scrive la sua nuova colonna nella riga (e, con ROLE_ORDER, i ranghi delle due colonne) prima di muoversi — la riga è ritrovata dal suo RowID e da nient'altro: ue_card_moved legge il DataStore aggiornato, l'Update resta a voi. La colonna riceve il valore della colonna di destinazione (R&D/QA, mai la sua chiave R&D-QA). Tutto o niente: un valore che il DataStore rifiuta — la colonna o un rango — rimette ciò che era già scritto, lascia la scheda dov'era (non parte mai per tornare) e solleva ue_write_back_failed; of_move_card restituisce allora -4. Si scrive un solo spostamento dell'utente alla volta: un gesto fatto prima che il precedente sia scritto è ignorato, e annunciato. Dopo aver cambiato voi stessi una riga, of_reload_row la rimanda al tabellone.
// The columns of the board : the values of the status column
uo_board.of_add_column(/*key*/ "open", /*title*/ "Open")
uo_board.of_add_column(/*key*/ "active", /*title*/ "Active")
uo_board.of_add_column(/*key*/ "closed", /*title*/ "Closed")
// Which column of the DataStore plays which role
uo_board.of_map(/*role*/ u_pbt_kanban.ROLE_COLUMN, /*column*/ "status")
uo_board.of_map(/*role*/ u_pbt_kanban.ROLE_ASSIGNEE, /*column*/ "owner")
uo_board.of_map(/*role*/ u_pbt_kanban.ROLE_ORDER, /*column*/ "rank")
// A move goes into the DataStore, then the rows become cards
uo_board.ib_write_back = true
uo_board.of_from_datastore(/*ads*/ ids_tasks)
Proprietà #
| Proprietà | Tipo | Predefinito | Ruolo | ||
|---|---|---|---|---|---|
is_card_template | string | "" | Il corpo di ogni scheda, scritto da un modello (vedi sopra). Vuoto: il testo della scheda (is_text). La ricerca legge ciò che scrive il modello | ||
is_count_template | string | "" | Il contatore nell'intestazione di ogni colonna, scritto da un modello: {count} le schede visibili, {limit} il limite (vuoto senza limite), {shown} le schede che la ricerca mantiene, {sum:points} la somma di un campo sulle schede visibili (uno dei vostri o una colonna del DataStore), {title} e {key} della colonna; {?limit}…{/limit} mantiene un pezzo quando c'è un limite. Vuoto: 3, 3/5, 1 . 3/5 durante una ricerca. Oltre il suo limite la colonna diventa rossa qualunque cosa dica il modello, e la sua intestazione lo dice al lettore di schermo. {sum:} legge un numero scritto con il punto o nella lingua di visualizzazione (1.234,5 in italiano); un testo non conta. Senza chiave, il conteggio e la somma sono quelli delle schede che la demo disegna | ||
is_tag_tones | string | "" | Il tono di ogni etichetta, etichetta=tono uniti da ` | : Bug=danger | UI=info. Toni: TONE_SUCCESS, TONE_WARN, TONE_DANGER, TONE_INFO (l'accento), TONE_NEUTRAL`. Un'etichetta trova il suo tono qualunque sia la sua grafia; un'etichetta non elencata, o un tono sconosciuto, è neutra |
is_today | string | "" | Il giorno con cui si confrontano le scadenze, aaaa-mm-gg; vuoto: la data della postazione. Una data non valida è rifiutata: resta la vecchia, of_get_last_error dice perché | ||
is_filter | string | "" | La ricerca: restano solo le schede il cui titolo, corpo, etichette, assegnatario, badge, chiave, un vostro campo o una colonna del DataStore contengono questo testo, senza distinzione di maiuscole né di accenti. Il contatore di una colonna dice allora prima le schede trovate (1 . 3). Anche la casella di ricerca della barra degli strumenti la scrive: riletta in diretta | ||
ib_toolbar | boolean | false | Una barra degli strumenti sopra il tabellone, con una casella di ricerca che scrive is_filter (Esc la svuota) | ||
ib_add_button | boolean | false | Un pulsante + Aggiungi una scheda in fondo a ogni colonna aperta: solleva ue_new_requested. Anche un doppio clic nella parte vuota di una colonna lo solleva, pulsante o no | ||
ib_quick_add | boolean | false | Aggiunta rapida: il pulsante + Aggiungi una scheda e il tasto Ins aprono un campo di titolo in fondo alla colonna; Invio solleva ue_new_requested con il titolo digitato (un titolo vuoto non chiede nulla), il campo resta aperto per la scheda successiva, Esc lo chiude. Il tabellone continua a non aggiungere nulla: il vostro codice aggiunge la scheda | ||
ib_read_only | boolean | false | L'utente non sposta nulla: niente trascinamento, niente Ctrl + frecce, niente Canc, niente pulsante di aggiunta. Seleziona e apre sempre le schede; il vostro codice le sposta sempre | ||
ib_reorderable | boolean | false | L'utente riordina le colonne: trascina la loro intestazione o preme Ctrl + Maiusc + Sinistra / Destra; seguono ue_column_moved poi ue_layout_changed. Anche ib_read_only lo ferma; il vostro codice le sposta sempre (of_move_column). Riletta in diretta | ||
ib_veto_moves | boolean | false | Opt-in: chiedere ue_card_moving prima di ogni spostamento, dell'utente come di of_move_card. Disattivato per impostazione predefinita, come ogni evento annullabile della libreria | ||
ib_write_back | boolean | false | Un tabellone alimentato da of_from_datastore: una scheda di una riga scrive la sua nuova colonna (e i ranghi, con ROLE_ORDER) nel DataStore prima di muoversi; un valore rifiutato la lascia al suo posto (ue_write_back_failed, of_move_card restituisce -4). Una scheda aggiunta a mano non è mai scritta | ||
ii_column_width | integer | 272 | La larghezza di una colonna aperta, in pixel, da 180 a 600 (un valore fuori limiti viene riportato dentro); 0: le colonne aperte si dividono la larghezza del tabellone, almeno 180 pixel ciascuna. Il tabellone scorre di lato quando le colonne non entrano | ||
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 una colonna — n_pbt_kanban_column #
Il suo handle, tramite of_column(key). Il suo of_count() conta le schede che contiene e il suo of_keys_at(n) restituisce la chiave dell'n-esima, nel loro ordine; of_child_keys le restituisce tutte in una sola lettura.
| Proprietà | Tipo | Predefinito | Ruolo |
|---|---|---|---|
is_title | string | "" | Titolo della colonna. Accetta il testo formattato con tag. Vuoto, la colonna mostra la sua chiave |
il_limit | long | 0 | Limite di lavoro in corso: 0, nessuno. Con un limite l'intestazione dice 3/5, e la colonna diventa rossa appena ne contiene di più; mentre una scheda è trascinata sopra una colonna piena, lo mostra. Limite morbido: rifiutate in ue_card_moving per uno rigido |
ib_collapsed | boolean | false | true comprime la colonna in una striscia stretta: il suo titolo scritto verso il basso e il suo contatore restano, le sue schede si nascondono, vi si deposita ancora una scheda (in fondo). Segue ue_column_toggled, come per un clic sulla sua freccia. Riletta in diretta |
ib_visible | boolean | true | false toglie la colonna e le sue schede dal tabellone; mantengono la loro posizione e il loro ordine |
ib_done | boolean | false | La colonna del lavoro finito: le sue schede non sono mai mostrate in ritardo né in scadenza |
of_keys_at (long al_index) → string | — | — | La chiave della scheda al rango al_index (da 1) nella colonna, nel loro ordine; vuota oltre. Poiché una scheda si designa con la sola chiave, è ciò che prende of_card |
of_child_keys (ref string as_keys[]) → long | — | — | Riempie as_keys[] con le chiavi di tutte le schede della colonna, nel loro ordine — ciò che dà of_keys_at(1..n) — e restituisce il loro numero, in una sola lettura: percorrere 2.000 schede con of_keys_at rilegge l'elenco 2.000 volte |
of_position ( ) → long | — | — | Restituisce la posizione della colonna sul tabellone ora, contata da 1 tra tutte le colonne (nascoste comprese) — l'utente può averla spostata; 0 quando il tabellone non la contiene |
of_visible_count ( ) → long | — | — | Restituisce il numero di schede visibili della colonna, ciò che la sua intestazione conta rispetto a il_limit (2/3): una scheda nascosta da ib_visible non conta, una scheda fuori dalla ricerca conta; of_count() le conta tutte. Il numero da confrontare con il_limit per un limite rigido; 0 quando il tabellone non contiene la colonna |
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 della colonna: la barra sopra di essa e il suo contatore lo prendono, mai le sue schede (-1 = quello del componente) |
il_back_color | long | -1 | Sfondo della colonna, in RGB(r,g,b) (-1 = quello che dà il tema) |
il_text_color | long | -1 | Colore del testo della colonna (-1 = quello che dà il tema) |
il_back_color_hover | long | -1 | Sfondo dell'intestazione della colonna sotto il puntatore (-1 = quello che dà il tema). I colori di una colonna si fermano alle sue schede |
il_text_color_hover | long | -1 | Colore del testo dell'intestazione della colonna sotto il puntatore (-1 = quello che dà il tema) |
Proprietà di una scheda — n_pbt_kanban_card #
| Proprietà | Tipo | Predefinito | Ruolo |
|---|---|---|---|
is_title | string | "" | Titolo della scheda, in grassetto. Accetta il testo formattato con tag. Vuoto, la scheda mostra la sua chiave |
is_text | string | "" | Testo sotto il titolo, tagliato dopo quattro righe (tag accettati). Mostrato finché is_card_template è vuoto |
is_tags | string | "" | Etichette, separate da virgole: Bug, UI. Ognuna è una pastiglia colorata da is_tag_tones |
is_assignee | string | "" | La persona a cui è affidata la scheda: un avatar rotondo con le iniziali, dello stesso colore a ogni caricamento, il nome come tooltip |
is_due | string | "" | Scadenza, aaaa-mm-gg ("": nessuna): rossa una volta superata, arancione il giorno stesso, mai in una colonna ib_done. Una data non valida è rifiutata: resta la vecchia, of_get_last_error del tabellone dice perché |
is_badge | string | "" | Piccolo badge in alto a destra (tag accettati): una stima, un numero, nell'accento |
ib_visible | boolean | true | false toglie la scheda dal tabellone; mantiene la sua chiave, la sua colonna e la sua posizione, e non conta più nella sua colonna |
ib_read_only | boolean | false | L'utente non può né trascinare questa scheda, né spostarla con la tastiera, né chiederne l'eliminazione; il vostro codice la sposta sempre |
of_column ( ) → string | — | — | La chiave della colonna in cui si trova la scheda ora — l'utente può averla spostata. Sola lettura: una scheda si sposta con of_move_card |
of_position ( ) → long | — | — | Restituisce la posizione della scheda nella sua colonna ora, contata da 1 (schede nascoste comprese), 0 quando il tabellone non la contiene |
of_row ( ) → long | — | — | Restituisce il numero di riga di oggi, nelle righe date a of_from_datastore, della riga da cui viene la scheda — dopo un ordinamento, un filtro o l'eliminazione di altre righe; 0 per una scheda aggiunta a mano o la cui riga è sparita |
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 della scheda: una banda sul suo bordo d'inizio, il suo anello di selezione e il suo badge lo prendono; prevale sul colore di una colonna ROLE_COLOR. -1 = quello del componente, senza banda |
il_back_color | long | -1 | Sfondo della scheda, in RGB(r,g,b) (-1 = quello che dà il tema) |
il_text_color | long | -1 | Colore del testo della scheda (-1 = quello che dà il tema) |
il_back_color_hover | long | -1 | Sfondo della scheda sotto il puntatore (-1 = quello che dà il tema) |
il_text_color_hover | long | -1 | Colore del testo della scheda sotto il puntatore (-1 = quello che dà il tema) |
Tre letture dell'handle, in sola lettura: of_column() restituisce la chiave della colonna in cui si trova la scheda ora, of_position() la sua posizione in quella colonna a partire da 1 (0 se il tabellone non la contiene), of_row() il numero della sua riga nel DataStore (0 per una scheda aggiunta a mano). Una scheda si sposta con of_move_card del tabellone.
Metodi #
| Metodo | Ruolo | |
|---|---|---|
of_add_card (string as_key, string as_column, string as_title) | Aggiunge una scheda in fondo a una colonna. La sua chiave è unica su tutto il tabellone. Restituisce 0 una volta aggiunta, -5 per una chiave vuota, con / o ` | , già presa (schede di un DataStore comprese) o una colonna sconosciuta, -2` quando il componente non è creato |
of_add_column (string as_key, string as_title) | Aggiunge una colonna a destra del tabellone. Restituisce 0 una volta aggiunta, -5 per una chiave vuota, con / o ` | , o già presa, -2` quando il componente non è creato |
of_card (string as_key) | Restituisce l'handle di una scheda (creato al primo accesso, liberato quando la scheda è rimossa) | |
of_clear ( ) | Svuota il tabellone: colonne, schede (quelle di un DataStore comprese) e i loro handle; le opzioni restano. Restituisce 0 una volta applicato, -2 quando il componente non è creato | |
of_clear_cards ( ) | Rimuove tutte le schede e i loro handle, mantiene le colonne: per ricaricare le schede. Restituisce 0 una volta applicato, -2 quando il componente non è creato | |
of_clear_selection ( ) | Non lascia alcuna scheda selezionata: segue ue_selection_changed con una chiave vuota; niente selezionato, niente è sollevato. Restituisce 0 una volta applicato, -2 quando il componente non è creato | |
of_column (string as_key) | Restituisce l'handle di una colonna (creato al primo accesso, liberato quando la colonna è rimossa) | |
of_from_datastore (datastore ads) | Fa una scheda di ogni riga del DataStore (vedi sopra). Un secondo caricamento aggiorna le schede sul posto con una chiave ROLE_KEY, le rifà con la chiave RowID; le schede delle righe sparite se ne vanno, quelle aggiunte a mano restano; una riga non caricata è nominata da of_get_last_error. Restituisce 0 una volta caricato, -5 quando il DataStore non è valido o non ha colonne, -2 quando il componente non è creato | |
of_from_datastore (datawindow adw) | Lo stesso dalle righe di un DataWindow — quello che l'utente vede accanto: ib_write_back scrive in questo DataWindow. Restituisce 0 una volta caricato, -5 quando il DataWindow non è valido, non ha colonne o non può condividere le sue righe (ShareData), -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), riscritto da ib_write_back. Restituisce 0 una volta caricato, -5 quando non è valido, non ha colonne o non può condividere le sue righe (ShareData), -2 quando il componente non è creato | |
of_get_field (string as_key, string as_field) | Legge un campo di una scheda, in diretta: uno dei vostri, una colonna del suo DataStore o un campo predefinito (column_title, initials…). Una stringa vuota quando non ne ha | |
of_get_last_error ( ) | Perché l'ultima chiamata non è riuscita: un metodo che ha restituito -5 o -4, una data rifiutata (is_due, is_today), le righe che un caricamento ha lasciato fuori, con il loro numero. Svuotata da ogni chiamata; altrimenti l'ultimo errore della libreria | |
of_get_layout ( ) | Ciò che l'utente ha sistemato, in JSON: {"columns":[{"key":"todo","collapsed":false},...]} — ogni colonna nel suo ordine (nascoste comprese), con la sua compressione. Da salvare, poi da restituire a of_set_layout. Titoli, limiti e schede sono vostri: non ci sono. Letto in diretta | |
of_map (string as_role, string as_column) | Dà un ruolo a una colonna del DataStore (ROLE_KEY, ROLE_COLUMN, ROLE_TITLE, ROLE_TEXT, ROLE_TAGS, ROLE_ASSIGNEE, ROLE_DUE, ROLE_BADGE, ROLE_COLOR, ROLE_ORDER). Dopo of_from_datastore, le righe sono rilette sul posto: una scheda spostata resta dove è stata lasciata e mantiene i suoi indicatori e il suo handle. Una colonna vuota restituisce il ruolo alla colonna che ne porta il nome. Una scheda che il vostro codice ha tolto non torna. 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_card (string as_key, string as_column, long al_position) | Sposta una scheda in una colonna, in una posizione contata da 1 (oltre l'ultima: in fondo), come un trascinamento: la domanda con ib_veto_moves, poi ue_card_moved, e, con ib_write_back, il DataStore scritto prima dello spostamento. Restituisce 0 una volta spostata (o già lì: niente è sollevato), -4 quando ue_card_moving ha rifiutato, il DataStore ha rifiutato la nuova colonna o un rango (la scheda resta, ue_write_back_failed, of_get_last_error dice perché) o il tabellone attende la pagina (una chiamata da un timer durante una lettura: né la domanda né la scrittura sono possibili), -5 per una scheda o una colonna sconosciuta, -2 quando il componente non è creato | |
of_move_column (string as_key, long al_position) | Sposta una colonna in una posizione contata da 1 tra tutte le colonne, nascoste comprese (oltre l'ultima: l'ultima), come un trascinamento della sua intestazione: la domanda con ib_veto_moves, poi ue_column_moved e ue_layout_changed. Né ib_reorderable né ib_read_only fermano il vostro codice. Restituisce 0 una volta spostata (o già lì: niente è sollevato), -4 quando ue_column_moving ha rifiutato, -5 per una colonna sconosciuta, -2 quando il componente non è creato | |
of_reload_row (long al_row) | Rimanda al tabellone una riga del DataStore di of_from_datastore, riletta ora, dopo che il vostro codice l'ha cambiata; la sua scheda è aggiornata sul posto (indicatori, campi e handle restano) e segue la sua colonna e il suo rango. Restituisce 0 una volta inviata, -5 quando niente è collegato, la riga non esiste, la sua chiave è tenuta da una scheda aggiunta a mano, il suo valore di colonna è vuoto o il suo valore ROLE_KEY non è più la chiave della sua scheda — una chiave è un'identità: dopo un Update che dà le chiavi, ricaricate con of_from_datastore (of_get_last_error lo dice, nulla è cambiato), -2 quando il componente non è creato | |
of_remove_card (string as_key) | Rimuove una scheda e ne libera l'handle; rimuoverla selezionata svuota la selezione. Restituisce 0 una volta rimossa, -5 per una scheda sconosciuta, -2 quando il componente non è creato | |
of_remove_column (string as_key) | Rimuove una colonna e tutte le sue schede, con i loro handle. Restituisce 0 una volta rimossa, -5 per una colonna sconosciuta, -2 quando il componente non è creato | |
of_reset ( ) | Svuota il tabellone, dimentica il DataStore e riporta ogni proprietà al suo valore predefinito. Restituisce 0 una volta applicato, -2 quando il componente non è creato | |
of_select_card (string as_key) | Seleziona una scheda come un clic, senza spostare la vista (come SelectRow di un DataWindow), e segue ue_selection_changed. Restituisce 0 una volta selezionata (o già selezionata: niente è sollevato), -5 per una scheda sconosciuta o non disegnata (nascosta, in una colonna compressa o nascosta, fuori dalla ricerca, oltre il limite dimostrativo), -2 quando il componente non è creato | |
of_selected_key ( ) | La chiave della scheda selezionata, chiunque l'abbia selezionata; vuota se nessuna. Letta in diretta | |
of_set_field (string as_key, string as_field, string as_value) | Dà a una scheda un campo vostro, per is_card_template; 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 una scheda sconosciuta o un nome non valido, -2 quando il componente non è creato | |
of_set_layout (string as_layout_json) | Restituisce una disposizione letta con of_get_layout o ricevuta con ue_layout_changed: le colonne che nomina nel suo ordine, poi le altre nel loro, ognuna con la sua compressione; una colonna che il tabellone non contiene è ignorata. ue_layout_changed è sollevato una volta se qualcosa è cambiato (né ue_column_moved né ue_column_toggled: rimette uno stato). Restituisce 0 una volta applicata, -5 quando il testo è vuoto o non è un oggetto JSON, -2 quando il componente non è creato |
Eventi #
| Event | Attivato quando |
|---|---|
ue_card_moved (string as_key, string as_from_column, string as_to_column, long al_position, long al_from_position) | Una scheda è stata spostata: trascinata, spostata con la tastiera, o dal vostro codice (of_move_card). Le due chiavi di colonna (la stessa per uno spostamento in una colonna), al_position la sua posizione nella colonna d'arrivo e al_from_position quella che ha lasciato, da 1. La scheda è già al suo posto; con ib_write_back, il DataStore è già scritto |
ue_card_moving (string as_key, string as_from_column, string as_to_column, long al_position) → boolean | Annullabile, posto prima di uno spostamento, solo quando ib_veto_moves = true: trascinamento, tastiera e of_move_card. Restituire FALSE lascia la scheda dov'è. Il posto per un limite rigido: of_column(as_to_column).of_visible_count() >= il_limit |
ue_card_clicked (string as_key) | Una scheda è stata cliccata (e selezionata). Non alla fine di un trascinamento |
ue_card_opened (string as_key) | Doppio clic su una scheda, o Invio: aprite il vostro editor |
ue_card_rclicked (string as_key, long al_x, long al_y) | Clic destro su una scheda (selezionata prima). al_x, al_y sono pixel dello schermo; per un menu PowerBuilder, PopMenu(PointerX(), PointerY()) della vostra finestra |
ue_column_moved (string as_key, long al_from, long al_to) | Una colonna è stata spostata (ib_reorderable): la sua intestazione trascinata, Ctrl + Maiusc + Sinistra / Destra, o il vostro codice (of_move_column). al_from e al_to sono le sue posizioni tra tutte le colonne, nascoste comprese, da 1. La colonna è già al suo posto; segue ue_layout_changed |
ue_column_moving (string as_key, long al_from, long al_to) → boolean | Annullabile, posto prima che una colonna si sposti, solo quando ib_veto_moves = true (lo stesso opt-in delle schede): trascinamento dell'intestazione, tastiera e of_move_column. Restituire FALSE lascia la colonna dov'è, e of_move_column restituisce -4 |
ue_column_rclicked (string as_key, long al_x, long al_y) | Clic destro sull'intestazione di una colonna. Pixel dello schermo, come ue_card_rclicked |
ue_column_toggled (string as_key, boolean ab_collapsed) | Una colonna si è compressa (ab_collapsed = TRUE) o aperta: la sua freccia, un doppio clic sulla sua striscia, la tastiera sulla sua intestazione (Invio o Spazio comprimono o aprono, + apre, - comprime), o il suo ib_collapsed impostato dal vostro codice |
ue_delete_requested (string as_key) | Canc è stato premuto sulla scheda selezionata. Il tabellone non rimuove nulla: of_remove_card una volta che la vostra applicazione è d'accordo. Mai su una scheda o un tabellone in sola lettura |
ue_layout_changed (string as_layout_json) | La disposizione è cambiata: una colonna spostata o compressa, dall'utente o dal vostro codice, o of_set_layout. as_layout_json è la disposizione intera, come la dà of_get_layout: salvatela |
ue_new_requested (string as_column, string as_title) | L'utente chiede una nuova scheda in una colonna: il suo pulsante + Aggiungi una scheda, il tasto Ins o un doppio clic nella sua parte vuota; as_title è il titolo digitato nel campo di aggiunta rapida (ib_quick_add), vuoto altrimenti. Il tabellone non aggiunge nulla: of_add_card, dopo la vostra finestra di dialogo se volete |
ue_selection_changed (string as_from_key, string as_key) | La scheda selezionata è cambiata: clic, tastiera, il vostro codice (of_select_card, of_clear_selection), o la scheda selezionata ha lasciato il disegno (rimossa, nascosta, compressa, fuori ricerca: as_key è allora vuota) |
ue_write_back_failed (string as_key, string as_col, string as_value, string as_reason) | ib_write_back: il DataStore ha rifiutato la nuova colonna di una scheda spostata (un valore che la sua colonna non contiene, una riga eliminata dal caricamento). Anche un rango rifiutato (as_reason comincia allora con « the rank of row »). Niente resta scritto: ciò che lo era viene rimesso. La scheda non si è mossa (il DataStore è scritto prima dello spostamento), ue_card_moved non è sollevato e of_move_card restituisce -4 |
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 #
- Trascinare una scheda: oltre 5 pixel, un'immagine segue il puntatore, la colonna di destinazione si illumina e una barra d'accento mostra dove cadrà la scheda; il tabellone e la colonna scorrono vicino ai loro bordi, e continuano finché il puntatore vi resta. Esc annulla.
- Frecce: la scheda sopra, sotto, o allo stesso rango nella colonna vicina; una colonna compressa, o che non disegna alcuna scheda, si raggiunge con la sua intestazione. Home / Fine: la prima, l'ultima della colonna.
- Ctrl + Su / Giù sposta la scheda su o giù nella sua colonna; Ctrl + Sinistra / Destra la passa nella colonna aperta vicina, allo stesso rango (una colonna compressa è saltata; Spazio poi le frecce vi si fermano). Da destra a sinistra, Sinistra e Destra si invertono.
- Spazio solleva la scheda selezionata: le frecce la portano (una barra mostra dove cadrà), Spazio o Invio la posa — la stessa domanda e la stessa scrittura di un trascinamento —, Esc la rimette al suo posto. Un lettore di schermo sente ogni passo.
- Le intestazioni sono sempre raggiungibili: Su sulla prima scheda, Sinistra / Destra da un'intestazione all'altra; su un'intestazione, Invio o Spazio comprime o riapre la colonna, + la riapre, - la comprime, Giù torna alla prima scheda.
- Invio o doppio clic apre la scheda, Canc ne chiede l'eliminazione, Ins chiede una nuova scheda nella colonna (su una scheda o un'intestazione), clic destro su una scheda o un'intestazione: il suo evento.
- Il tabellone è una sola fermata del tasto Tab: la scheda selezionata la prende, altrimenti la prima scheda, altrimenti la prima intestazione.
- Con
ib_reorderable: trascinare l'intestazione di una colonna la sposta (una barra verticale mostra dove cadrà, Esc annulla); Ctrl + Maiusc + Sinistra / Destra, su una scheda o su un'intestazione, sposta la sua colonna, invertito da destra a sinistra.
Esempi #
Un limite rigido e una regola di passaggio #
// Once, after the board is built : ask before each move
uo_board.ib_veto_moves = true
// event ue_card_moving of uo_board : a card reaches Done only from Review
if as_to_column = "done" and as_from_column <> "review" then return false
// and a column past its limit takes no more card (what its header counts :
// the visible cards)
if as_to_column <> as_from_column then
if this.of_column(/*key*/ as_to_column).il_limit > 0 and this.of_column(/*key*/ as_to_column).of_visible_count() >= this.of_column(/*key*/ as_to_column).il_limit then return false
end if
return true
Ritrovare le colonne al prossimo avvio #
// Once, after the board is built : the user may move the columns
uo_board.ib_reorderable = true
// The layout stored at the last start, if any
uo_board.of_set_layout(/*layout_json*/ ProfileString(gs_ini, "board", "layout", ""))
// event ue_layout_changed of uo_board : store every change
SetProfileString(gs_ini, "board", "layout", as_layout_json)
Aprire una scheda nella vostra finestra #
// event ue_card_opened of uo_board : the row of the card, edited in your window
OpenWithParm(w_task_edit, uo_board.of_card(/*key*/ as_key).of_row())
// The row may have changed : the card follows it
uo_board.of_reload_row(/*row*/ uo_board.of_card(/*key*/ as_key).of_row())
Un tabellone di squadra: punti, larghezza condivisa, aggiunta rapida #
// The estimate of a card, a field of our own
uo_board.of_set_field(/*key*/ "t1", /*field*/ "points", /*value*/ "5")
// Every header : its cards, its limit, the sum of the points of its cards
uo_board.is_count_template = "{count}{?limit}/{limit}{/limit} - {sum:points} pts"
// The open columns share the width of the board
uo_board.ii_column_width = 0
// + Add a card opens a title field at the foot of the column
uo_board.ib_add_button = true
uo_board.ib_quick_add = true
// event ue_new_requested of uo_board : the card typed, with a key of ours
uo_board.of_add_card(/*key*/ "new" + String(Cpu()), /*column*/ as_column, /*title*/ as_title)
Buone pratiche #
- Poche colonne, nominate per fase e non per persona: cinque o sei si leggono a colpo d'occhio.
- Un limite di lavoro in corso sulle colonne attive: è lui che fa di un tabellone uno strumento di guida.
- Salvate in
ue_card_moved(o lasciate cheib_write_backscriva il DataStore): il tabellone mostra il nuovo stato prima che il database lo sappia. - Un modello breve: due righe di corpo bastano, il dettaglio va nella vostra finestra di modifica.
- Etichette dal tono costante:
Bugsempre rosso, da una finestra all'altra. - Chiavi che non siano numeri per le vostre schede a mano, su un tabellone alimentato da un DataStore: una scheda di chiave
12impedisce il caricamento della riga di RowID 12 (of_get_last_errorlo dice). - Una chiave dei dati (
ROLE_KEY) quando le righe vengono rilette: con la chiave RowID, un nuovoof_from_datastorerifà le schede.
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.