PBToolboxAI v5 ← Site

listbar — u_pbt_listbar #

← Riferimento dei componenti · Sommario della guida

Barra di navigazione laterale: sezioni comprimibili a fisarmonica che contengono voci con icona, con banda d'accento sulla voce corrente e compressione in una barra di sole icone.

▶ Vederlo dal vivo — Applicazione dimostrativa, riquadro Listbar: l'anteprima, il codice che lo produce e questa pagina, affiancati.


In breve #

Userobjectu_pbt_listbar
Classi degli itemn_pbt_listbar_section (sezione) → n_pbt_listbar_item (voce)
Serve perSostituire un menu laterale improvvisato a colpi di pulsanti con una navigazione strutturata, a tema e comprimibile
Opzioni opt-inib_auto_width, ib_reorderable, ib_search

ib_auto_width ha qui un senso particolare: la barra compressa è nettamente più stretta di quella espansa. Del resto il caso più comune è già coperto senza attivare nulla: ib_collapsed = true restringe la barra alla sola striscia di icone, e le restituisce la larghezza quando viene espansa; ib_auto_width si rilegge sempre come l'avete impostato.


Avvio rapido #

// evento open della finestra

// Una sezione, poi le sue voci : ogni voce si indirizza con sezione/voce
uo_nav.of_add_section(/*key*/ "nav", /*text*/ "Navigation")
uo_nav.of_add_item(/*keys*/ "nav/home",   /*text*/ "Home",      /*image*/ "mono:img\home.svg")
uo_nav.of_add_item(/*keys*/ "nav/docs",   /*text*/ "Documents", /*image*/ "mono:img\doc.svg")
uo_nav.of_add_item(/*keys*/ "nav/search", /*text*/ "Search",    /*image*/ "mono:img\find.svg")

// Una seconda sezione, con una sola voce
uo_nav.of_add_section(/*key*/ "settings", /*text*/ "Settings")
uo_nav.of_add_item(/*keys*/ "settings/prefs", /*text*/ "Preferences", /*image*/ "mono:img\gear.svg")

// La selezione si posa sulla VOCE, tramite il suo indirizzo : la sezione, poi la voce
uo_nav.of_select_item(/*keys*/ "nav/home")

// of_select_item solleva ue_selection_changed, come un clic : la prima pagina si apre li
// evento ue_selection_changed di uo_nav : (string as_from_keys, string as_keys)
choose case as_keys
    case "nav/home"       ; of_open_home()
    case "nav/docs"       ; of_open_documents()
    case "settings/prefs" ; of_open_preferences()
end choose

Due livelli, un indirizzo #

Un identificatore di voce è unico solo nella sua sezione: una voce si designa quindi con il suo indirizzo, la sezione e poi la voce unite da / — "nav/docs". È il componente a riceverlo (of_item, of_select_item, of_remove_item…); una sezione si designa con la sola chiave (of_section("nav")). Vedere Gerarchie.

// Una sezione tramite la chiave, una voce tramite il suo indirizzo
uo_nav.of_section(/*key*/ "nav").is_title = "Navigation"
uo_nav.of_item(/*keys*/ "nav/docs").is_text = "Documents"

Anche gli event portano il percorso completo, e con esso la voce lasciata: ue_selection_changed(as_from_keys, as_keys).


Proprietà #

ProprietàTipoPredefinitoRuolo
ib_collapsedbooleanfalsetrue comprime la barra in una barra di sole icone: titoli di sezione ed etichette lasciano posto a un filetto tra le sezioni, e tutte le voci restano visibili, anche quelle di una sezione compressa (la compressione torna all'uscita). Una voce senza icona mostra la sua iniziale, e ogni voce dice la sua etichetta al passaggio del mouse
ib_auto_widthbooleanfalseOpt-in: idem per la larghezza, anche da espansa (la barra si allinea all'etichetta più lunga). La compressione in striscia di icone, invece, si restringe già da sola; ue_auto_width segue in entrambi i casi
ib_reorderablebooleanfalseOpt-in: l'utente può spostare una voce con il mouse. Lo spostamento resta nella sua sezione — un identificatore di voce è unico solo lì, quindi attraversare rischierebbe due chiavi identiche (attiva ue_item_reordered)
ib_veto_selectionbooleanfalseOpt-in: chiedere prima che la selezione si sposti — un gesto dell'utente e of_select_item / of_clear_selection (solleva ue_selection_changing, che può rifiutare; un ordine rifiutato restituisce -4). Disattivato per impostazione predefinita, come ogni evento annullabile della libreria: impostate true quando dovete poter rifiutare (inserimento non salvato). Ogni domanda di un gesto costa un andata e ritorno verso PowerBuilder (~35 ms)
ib_searchbooleanfalseOpt-in: un campo di ricerca in cima alla barra. Ciò che l'utente digita filtra le voci (is_filter, ue_filter_changed); Ctrl+F raggiunge il campo, Esc lo svuota, Freccia giù scende alla prima voce, Invio sceglie la prima corrispondenza. Non disegnato nella barra compressa (manca lo spazio): is_filter vi si applica comunque
is_filterstring""Il testo che filtra la barra, letto in diretta: le voci la cui etichetta — o il titolo della sezione — lo contiene, senza badare a maiuscole e accenti. Una sezione che contiene una corrispondenza si mostra espansa, la sua compressione intatta; una sezione senza corrispondenze sparisce finché il filtro resta. Impostato dal vostro codice non solleva nulla (un valore, come SetFilter); digitato dall'utente, ue_filter_changed. Mentre filtra, un titolo non si comprime e una voce non si trascina. In demo le sei voci disegnate si contano senza il filtro: una ricerca non raggiunge mai una settima
is_theme_stylestring""Stile visivo del componente (costanti THEME_STYLE_*); vuoto = quello dell'applicazione, seguito a ogni cambio
is_theme_modestring""Variante chiara o scura (costanti THEME_MODE_*); vuoto = quella dell'applicazione, seguita a ogni cambio
il_theme_accentlong-1Colore d'accento di questo componente (-1 = accento dell'applicazione, o quello del tema)
is_tooltipstring""Tooltip semplice mostrato al passaggio del mouse sul componente
is_super_tooltip_titlestring""Titolo del tooltip avanzato (prevale su is_tooltip)
is_super_tooltip_textstring""Testo del tooltip avanzato (markup avanzato accettato)
is_super_tooltip_imagestring""Immagine del tooltip avanzato

Proprietà di una sezione — n_pbt_listbar_section #

ProprietàTipoPredefinitoRuolo
is_titlestring""Titolo della sezione. Accetta il testo formattato con tag. Un titolo vuoto non mostra alcuna riga di intestazione: la sezione diventa un semplice raggruppamento invisibile; uno spazio la separa dalla sezione sopra (un filetto nella barra compressa), e non si comprime più — nessuno potrebbe riaprirla
ib_collapsedbooleanfalseFisarmonica: true comprime le voci di questa sezione. L'intestazione resta visibile e il suo chevron ruota; ue_section_toggled segue, come per un clic sull'intestazione
ib_pinnedbooleanfalsetrue fissa la sezione in fondo alla barra (Impostazioni, Guida): un piede che resta visibile mentre il resto della barra scorre, spinto in fondo quando lo spazio non manca, e in fondo anche nella barra compressa. Più sezioni fissate si impilano nel loro ordine. Cambia solo il disegno: la disposizione (of_get_layout) mantiene l'ordine delle sezioni, e la freccia Giù passa dall'ultima voce in alto alla prima del piede
is_imagestring""Icona davanti al titolo della sezione (forme accettate: percorso, mono:, tint:, risorsa di DLL). Una stringa vuota la toglie
is_tooltipstring""Tooltip semplice mostrato al passaggio sul titolo della sezione
is_super_tooltip_titlestring""Titolo del tooltip arricchito del titolo della sezione (ha la precedenza su is_tooltip)
is_super_tooltip_textstring""Testo del tooltip arricchito della sezione (markup ricco accettato)
is_super_tooltip_imagestring""Immagine del tooltip arricchito della sezione
il_accentlong-1Accento di questa sezione, cioè del suo titolo e di nient'altro: le sue voci mantengono il proprio (-1 = quello del componente)
il_back_colorlong-1Sfondo del titolo della sezione, in RGB(r,g,b) (-1 = quello del componente)
il_text_colorlong-1Colore del testo del titolo della sezione (-1 = quello del componente)
il_back_color_hoverlong-1Sfondo del titolo sotto il puntatore (-1 = quello del componente)
il_text_color_hoverlong-1Colore del testo del titolo sotto il puntatore (-1 = quello del componente)

Proprietà di una voce — n_pbt_listbar_item #

ProprietàTipoPredefinitoRuolo
is_textstring""Etichetta della voce, modificabile a caldo senza ricostruire la barra. Accetta il testo formattato con tag
is_imagestring""Icona, modificabile a caldo (forme accettate: percorso, mono:, tint:, risorsa di DLL)
ib_enabledbooleantruefalse disattiva la voce: resta al suo posto e non risponde più a nulla — né clic, né Invio, né clic destro, e le frecce la saltano; il suo tooltip si mostra comunque, per dire perché. Nemmeno il vostro codice può selezionarla (of_select_item restituisce -5); disattivare la voce già selezionata la lascia selezionata
ib_visiblebooleantruefalse nasconde la voce senza rimuoverla dalla barra. Una voce nascosta non può diventare la selezione (of_select_item restituisce -5); nascondere quella che è selezionata la lascia selezionata, e mostrarla di nuovo la restituisce com'era
is_badgestring""Pastiglia contatore in fondo alla voce ("12" non letti), nei colori pastiglia del tema; nella barra compressa, sull'angolo dell'icona. Qualsiasi testo breve, markup accettato. Una stringa vuota la rimuove
of_is_selected ( ) → boolean——Questa voce è quella selezionata? Sola lettura, e volutamente: la selezione è uno stato dell'intera barra, non un indicatore per voce. Per impostarla, of_select_item sul componente
is_tooltipstring""Tooltip semplice mostrato al passaggio del mouse sull'item
is_super_tooltip_titlestring""Titolo del tooltip avanzato dell'item (prevale su is_tooltip)
is_super_tooltip_textstring""Testo del tooltip avanzato dell'item (markup avanzato accettato)
is_super_tooltip_imagestring""Immagine del tooltip avanzato dell'item
il_accentlong-1Accento di questa voce: la barretta che la marca quando è selezionata lo prende (-1 = quello del componente). Per « questa voce in rosso », il_back_color / il_text_color
il_back_colorlong-1Sfondo proprio della voce, in RGB(r,g,b) (-1 = ciò che dà il tema)
il_text_colorlong-1Colore del testo della voce (-1 = ciò che dà il tema)
il_back_color_hoverlong-1Sfondo della voce sotto il puntatore (-1 = ciò che dà il tema)
il_text_color_hoverlong-1Colore del testo della voce sotto il puntatore (-1 = ciò che dà il tema)

Metodi #

Sul componente #

MetodoRuolo
of_add_section (string as_key, string as_text)Aggiunge una sezione in fondo alla barra. Un testo vuoto non disegna alcuna riga di titolo. L'handle viene da of_section("nav") quando volete impostare una proprietà. Restituisce 0 una volta applicato, -5 se la chiave è vuota, già presa o contiene / o `, -2` se il componente non è creato
of_insert_section (string as_key, string as_text, integer ai_index)Aggiunge una sezione al rango scelto (prima posizione = 1) invece che in fondo. L'indice conta sezioni, non righe. Un nome già preso viene rifiutato: due sezioni con lo stesso nome renderebbero ambiguo l'indirizzo di ciascuna delle loro voci. Restituisce 0 una volta applicato, -5 se la chiave è vuota, già presa o contiene / o `, -2` se il componente non è creato
of_move_section (string as_key, integer ai_index)Sposta una sezione al rango ai_index, con le sue voci. Spostare solo l'intestazione lascerebbe cadere le sue voci nella sezione che si ritrova sopra di esse. Restituisce 0 una volta applicato, -5 per una sezione che questa barra non ha mai aggiunto, -2 se il componente non è creato
of_remove_section (string as_key)Rimuove una sezione e tutto ciò che contiene. Svuotarla conservando le sue voci le renderebbe orfane: porterebbero un identificatore di sezione che non nomina più nulla. Se la selezione vi si trovava, ue_selection_changed annuncia che non ce n'è più. Restituisce 0 una volta applicato, -5 per una sezione che questa barra non ha mai aggiunto, -2 se il componente non è creato
of_section (string as_key)Handle di una sezione, tramite la sua chiave: titolo, icona, compressione e colori si impostano da esso (creato al primo accesso). Una voce si raggiunge invece dal componente, tramite il suo indirizzo (of_item)
of_add_item (string as_keys, string as_text, string as_image)Aggiunge una voce al suo indirizzo, "nav/home": la sezione in cui atterra, poi il suo identificatore. Un overload omette l'icona. Restituisce 0 una volta aggiunta, -5 se la sezione non è stata aggiunta da questa barra, se l'indirizzo è già preso o se la chiave contiene `, -2` se il componente non è creato
of_item (string as_keys)Handle di una voce, tramite il suo indirizzo (creato al primo accesso). Un indirizzo che non è sezione/voce dà un handle che non nomina nulla: ciò che vi si scrive non fa nulla (una sezione si raggiunge con of_section)
of_insert_item (string as_keys, string as_text, integer ai_index)Inserisce una voce alla posizione ai_index nella sua sezione (prima posizione = 1). Restituisce 0 una volta aggiunta, -5 se la sezione non è stata aggiunta da questa barra, se l'indirizzo è già preso o se la chiave contiene `, -2` se il componente non è creato
of_insert_item (string as_keys, string as_text, string as_image, integer ai_index)Idem, con l'icona della voce: of_add_item ne prende una, quindi anche l'inserimento deve poterlo fare. Restituisce 0 una volta aggiunta, -5 se la sezione non è stata aggiunta da questa barra, se l'indirizzo è già preso o se la chiave contiene `, -2` se il componente non è creato
of_move_item (string as_keys, integer ai_index)Sposta una voce esistente nella sua sezione, conservandone lo stato. Restituisce 0 una volta applicato, -5 per un indirizzo che questa barra non ha mai aggiunto, -2 se il componente non è creato
of_remove_item (string as_keys)Rimuove una voce, designata dal suo indirizzo. Se era la selezione, ue_selection_changed annuncia che non ce n'è più. Restituisce 0 una volta applicato, -5 per un indirizzo che questa barra non ha mai aggiunto, -2 se il componente non è creato
of_clear ( )Svuota la barra: tutte le sezioni e tutte le voci. Se una voce era selezionata, ue_selection_changed annuncia che non ce n'è più (indirizzo vuoto); ue_layout_changed non viene sollevato, state ricostruendo. Restituisce 0 una volta applicato, -2 se il componente non è creato
of_select_item (string as_keys)Seleziona una voce, come un clic su di essa: con ib_veto_selection attivo, viene posto prima ue_selection_changing; poi segue ue_selection_changed, come per un clic (subito dopo il vostro script, dalla coda degli eventi), e of_selected_key() letto subito dopo restituisce già il nuovo indirizzo. Voce già selezionata: nulla viene chiesto né sollevato. Restituisce 0 una volta selezionata (o se già selezionata), -4 se il vostro ue_selection_changing ha rifiutato (nulla si muove), -5 per un indirizzo che questa barra non ha mai aggiunto, una voce nascosta, una voce disattivata o una voce che il limite della demo non disegna — letto PRIMA che la domanda sia posta —, -2 se il componente non è creato. ue_item_invoked non viene sollevato: risponde a un gesto dell'utente
of_get_layout ( )Rilegge la disposizione corrente in JSON: le sezioni nell'ordine, ciascuna con le sue voci in ordine e il suo stato compresso. Da memorizzare (file, database, registro) e da restituire con of_set_layout all'avvio successivo. La stessa coppia porta gli stessi nomi su ogni componente riorganizzabile
of_set_layout (string as_layout_json)Ripristina una disposizione letta con of_get_layout o ricevuta con ue_layout_changed. Ciò che la disposizione non nomina conserva il suo posto in fondo: una disposizione di ieri non deve far sparire ciò che è stato aggiunto da allora. Applicarla solleva ue_layout_changed una volta quando cambia qualcosa, mai ue_section_toggled: una compressione ripristinata è uno stato restituito, non una compressione. Restituisce 0 una volta applicato, -5 per un testo vuoto o che non è un oggetto JSON (un file troncato): non viene inviato nulla; lo stato compresso di una sezione assente è ignorato, -2 se il componente non è creato
of_clear_selection ( )Non lascia nessuna voce selezionata, come ogni spostamento: con ib_veto_selection attivo, viene posto prima ue_selection_changing, poi segue ue_selection_changed con un indirizzo vuoto. Già nulla di selezionato: nulla viene chiesto né sollevato. Restituisce 0 una volta applicato, -4 se il vostro ue_selection_changing ha rifiutato (la voce resta selezionata), -2 se il componente non è creato
of_from_datastore (datastore ads)Costruisce la barra dalle righe di un DataStore — o di un DataWindow, di un DataWindowChild, stessa chiamata: una riga = una voce, il menu di un'applicazione letto dalla sua tabella dei diritti. Una colonna gioca un ruolo quando ne porta il nome (section, section_text, key, text, image, badge, enabled) o quando of_map lo dice; ROLE_SECTION è obbligatorio. Il caricamento sostituisce le voci: le sezioni che avete dichiarato conservano titolo, icona, compressione e fissaggio, e una sezione che le righe nominano e che la barra non ha si aggiunge in fondo, nell'ordine delle righe, intitolata da ROLE_SECTION_TEXT (altrimenti dalla sua chiave). Senza ROLE_KEY, la chiave di una voce è il suo numero di riga. ROLE_ENABLED disattiva una voce su 0, N, F, false, no o off. Una riga la cui sezione o chiave è vuota, contiene / o `, o ripete un indirizzo viene scartata: la chiamata restituisce comunque 0 e of_get_last_error la nomina. Una selezione la cui voce non ritorna se ne va, con ue_selection_changed. Restituisce 0 una volta caricato, -5 se il DataStore non è valido o non ha colonne, -2` se il componente non è creato
of_map (string as_role, string as_column)Dà un ruolo a una colonna del DataStore quando il suo nome non lo dice: of_map(u_pbt_listbar.ROLE_SECTION, "menu_group"). Ruoli: ROLE_SECTION, ROLE_SECTION_TEXT (il titolo di una sezione che le righe creano), ROLE_KEY, ROLE_TEXT, ROLE_IMAGE, ROLE_BADGE, ROLE_ENABLED. Prima o dopo of_from_datastore: dopo, le righe vengono rilette. Una colonna vuota restituisce il ruolo alla colonna che ne porta il nome. Restituisce 0 una volta impostato, -5 se il ruolo non è una delle costanti ROLE_ o la colonna non è una colonna del DataStore dell'ultimo caricamento, -2 se il componente non è creato
of_selected_key ( )Indirizzo della voce selezionata — "nav/docs", "" se nessuna. È esattamente ciò che vi consegna ue_selection_changed: un confronto è un confronto, non una ricomposizione. Sempre la voce corrente, letta nel componente: dopo un clic, e anche subito dopo of_select_item
of_reset ( )Svuota la barra poi riporta il componente al suo stato nuovo. Se una voce era selezionata, ue_selection_changed parte con un indirizzo vuoto; ue_layout_changed non viene sollevato. Restituisce 0 una volta applicato, -2 se il componente non è creato
of_set_redraw (boolean)Raggruppa una raffica di modifiche in un unico rendering. Restituisce 0 una volta applicato, -2 se il componente non è creato
of_save_as_png (string) · of_save_as_jpg (string)Esporta il rendering come immagine. Restituisce 0 una volta scritta l'immagine, -4 se la scrittura fallisce, -2 se il componente non è creato

Su una sezione — n_pbt_listbar_section #

MetodoRuolo
of_count ( )Numero di voci della sezione, nascoste comprese
of_keys_at (long al_index)Indirizzo della voce al rango al_index (da 1) — "nav/docs", da ripassare così com'è a of_item
of_has (string as_key)La sezione contiene questa voce?

Event #

EventAttivato quando
ue_selection_changed (string as_from_keys, string as_keys)La selezione si è spostata: l'utente ha scelto una voce (clic, Invio, Spazio), il vostro codice l'ha spostata (of_select_item, of_clear_selection — anche un ordine lo solleva, come SelectItem solleva SelectionChanged), oppure la voce selezionata è sparita (of_remove_item, of_remove_section, of_clear, of_reset — as_keys è allora vuoto). Stessi argomenti di ue_selection_changing: la domanda e il suo esito si leggono allo stesso modo, e la coppia as_from_* designa la voce lasciata (vuota se nessuna)
ue_section_toggled (string as_key, boolean ab_collapsed)L'utente comprime o espande una sezione: clic sul titolo, Invio sul titolo, o le frecce Sinistra / Destra (invertite da destra a sinistra), o il vostro codice che imposta ib_collapsed di una sezione
ue_item_reordered (string as_keys, integer ai_index)L'utente ha finito di trascinare una voce. ai_index è il suo nuovo rango nella sua sezione, a partire da 1, come of_move_item. Conservi quest'ordine per restituire all'utente la barra come l'ha lasciata
ue_layout_changed (string as_layout_json)La disposizione da conservare è cambiata: una voce o una sezione si è spostata, una sezione è stata compressa o espansa, qualcosa è stato rimosso, una disposizione è stata ripristinata — dall'utente o dal vostro codice. Sollevato una volta per ogni vero cambiamento: uno spostamento al rango già occupato non solleva nulla; of_set_layout lo solleva una volta quando la disposizione applicata cambia qualcosa. Porta la disposizione intera, non solo ciò che si è spostato: conservarla è un'assegnazione. Le aggiunte, la barra compressa, of_clear e of_reset non lo sollevano: è costruzione, non disposizione
ue_item_rclicked (string as_keys, long al_x, long al_y)L'utente ha fatto clic destro su una voce — o vi ha premuto il tasto Menu, Maiusc+F10: il suo indirizzo, "nav/docs", e al_x, al_y in pixel dello schermo, quelli che prende of_show di un contextmenu. Un evento per clic destro, e la voce non viene selezionata. Un menu PowerBuilder si apre al puntatore della vostra finestra: m_menu.PopMenu(parent.PointerX(), parent.PointerY()). Una voce disattivata non solleva nulla
ue_item_invoked (string as_keys)L'utente ha invocato una voce — un clic, Invio, Spazio, Invio nel campo di ricerca —, compresa la voce già selezionata: aprite (o riportate) qui la sua pagina, e un foglio chiuso dalla sua croce si riapre dalla barra. Solo un gesto: of_select_item non lo solleva mai. Dopo ue_selection_changed quando la selezione si è spostata; mai per una voce disattivata, né per uno spostamento che ue_selection_changing ha rifiutato
ue_filter_changed (string as_text)L'utente ha digitato nel campo di ricerca (ib_search): as_text filtra ora la barra; Esc lo svuota. is_filter impostato dal vostro codice si applica senza questo evento
ue_selection_changing (string as_from_keys, string as_keys) → booleanAnnullabile, posto prima che la selezione si sposti — un gesto dell'utente, of_select_item o of_clear_selection —, e solo quando ib_veto_selection = true (disattivato per impostazione predefinita). Restituite false per restare dove siete: nulla si muove, e l'ordine del vostro codice restituisce -4
ue_auto_width (long al_width)Il componente ha ricalcolato la propria larghezza ideale — richiede ib_auto_width = true
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)

Esempi #

// Tutta la barra in un solo rendering
uo_nav.of_set_redraw(/*on*/ false)

// Prima sezione e le sue tre voci
uo_nav.of_add_section(/*key*/ "folders", /*text*/ "Folders")
uo_nav.of_add_item(/*keys*/ "folders/recent",    /*text*/ "Recent",    /*image*/ "mono:img\clock.svg")
uo_nav.of_add_item(/*keys*/ "folders/customers", /*text*/ "Customers", /*image*/ "mono:img\user.svg")
uo_nav.of_add_item(/*keys*/ "folders/archives",  /*text*/ "Archives",  /*image*/ "mono:img\box.svg")

// Seconda sezione e le sue due voci
uo_nav.of_add_section(/*key*/ "tools", /*text*/ "Tools")
uo_nav.of_add_item(/*keys*/ "tools/import", /*text*/ "Import", /*image*/ "mono:img\import.svg")
uo_nav.of_add_item(/*keys*/ "tools/export", /*text*/ "Export", /*image*/ "mono:img\export.svg")

// Un solo rendering per tutto, poi la prima voce viene selezionata
uo_nav.of_set_redraw(/*on*/ true)
uo_nav.of_select_item(/*keys*/ "folders/recent")

Barra comprimibile che libera spazio #

// Comprimere in una barra di sole icone : la barra si restringe da sola (e riprende la
// sua larghezza quando la si espande).
uo_nav.ib_collapsed = true
// evento ue_auto_width di uo_nav : (long al_width)
// La barra ha appena adottato la sua larghezza ideale : riallineare cio che sta alla sua destra.
uo_content.x     = uo_nav.x + al_width
uo_content.width = parent.width - uo_content.x

Fisarmonica: comprimere una sezione #

// Comprimere la sezione delle cartelle, usata di rado
uo_nav.of_section(/*key*/ "folders").ib_collapsed = true
// evento ue_section_toggled di uo_nav : (string as_key, boolean ab_collapsed)
// Ricordare la compressione scelta dall'utente
of_save_preference("section_" + as_key, String(ab_collapsed))

Impostazioni e Guida fissate in fondo #

Una sezione senza titolo, fissata: nessuna riga di intestazione, due voci che restano ai piedi della barra anche quando la navigazione, più lunga della finestra, scorre. Un clic lì seleziona come altrove: ue_selection_changed riceve foot/settings.

// Una sezione SENZA titolo (nessuna riga di intestazione), fissata in fondo alla barra :
// resta visibile mentre le voci sopra di essa scorrono
uo_nav.of_add_section(/*key*/ "foot", /*text*/ "")
uo_nav.of_add_item(/*keys*/ "foot/settings", /*text*/ "Settings", /*image*/ "mono:img\gear.svg")
uo_nav.of_add_item(/*keys*/ "foot/help",     /*text*/ "Help",     /*image*/ "mono:img\help.svg")
uo_nav.of_section(/*key*/ "foot").ib_pinned = true

Reagire alla navigazione #

// evento ue_selection_changed di uo_nav : (string as_from_keys, string as_keys)
// L'indirizzo porta i due livelli : due sezioni possono avere entrambe una voce "list".
// Local variables
n_pbt_utils lnv_utils   // autoinstantiate : niente da creare, niente da distruggere
string ls_keys[]

// Divide l'indirizzo : [1] = la sezione, [2] = la voce
if lnv_utils.of_split_path(/*keys*/ as_keys, /*out*/ ls_keys) < 2 then return
choose case ls_keys[1]
    case "folders" ; of_open_folder(ls_keys[2])
    case "tools"   ; of_run_tool(ls_keys[2])
end choose

Riaprire la pagina della voce corrente #

ue_selection_changed dice solo gli spostamenti: ricliccare la voce già selezionata non la sposta. In un'applicazione MDI il cui utente ha chiuso il foglio, è però proprio il gesto che deve riaprirlo — ue_item_invoked risponde a ogni clic, compresa la voce corrente.

// event ue_item_invoked di uo_nav : (string as_keys)
// Ogni clic apre la pagina della voce, anche se gia selezionata :
// un foglio chiuso dalla sua croce si riapre dalla barra
of_open_sheet(as_keys)

Il vostro menu al clic destro di una voce #

// event ue_item_rclicked di uo_nav : (string as_keys, long al_x, long al_y)
// Local variables
m_entry lm_menu

// Un menu PowerBuilder si apre al puntatore della FINESTRA ; al_x, al_y (pixel
// dello schermo) servono un menu della libreria : uo_menu.of_show(al_x, al_y)
lm_menu = create m_entry
lm_menu.m_root.PopMenu(parent.PointerX(), parent.PointerY())
destroy lm_menu

Cercare nella barra #

// Un campo di ricerca in cima alla barra : Ctrl+F lo raggiunge, Esc lo svuota,
// Invio sceglie la prima corrispondenza
uo_nav.ib_search = true

// Anche il codice filtra : restano solo le voci che contengono il testo
uo_nav.is_filter = "inv"

Costruire il menu da una tabella dei diritti #

// Local variables
datastore lds_rights

// La tabella dei diritti dell'utente : una riga = una voce del menu
lds_rights = create datastore
lds_rights.DataObject = "d_menu_rights"
lds_rights.SetTransObject(SQLCA)
lds_rights.Retrieve()

// Le colonne che non portano il nome di un ruolo sono nominate da of_map
uo_nav.of_map(/*role*/ u_pbt_listbar.ROLE_SECTION, /*column*/ "menu_group")
uo_nav.of_map(/*role*/ u_pbt_listbar.ROLE_SECTION_TEXT, /*column*/ "group_title")
uo_nav.of_map(/*role*/ u_pbt_listbar.ROLE_KEY, /*column*/ "menu_code")
uo_nav.of_map(/*role*/ u_pbt_listbar.ROLE_ENABLED, /*column*/ "allowed")

// Le voci sono sostituite ; una riga scartata e detta da of_get_last_error
uo_nav.of_from_datastore(/*ads*/ lds_rights)
destroy lds_rights

Rifiutare un cambio di selezione #

// La domanda e disattivata per IMPOSTAZIONE PREDEFINITA : attivarla per poter rifiutare uno spostamento
uo_nav.ib_veto_selection = true
// evento ue_selection_changing di uo_nav :
//   (string as_from_keys, string as_keys)
// Restituire FALSE lascia l'utente sulla voce che sta lasciando.
if of_has_unsaved_changes(as_from_keys) then
    MessageBox("Inserimento", "Terminate la scheda corrente prima di navigare.")
    return false
end if
return true

Aggiornare una voce a caldo #

// Local variables
n_pbt_listbar_item lnv_entry

// La voce si designa con il suo indirizzo : la sezione, poi la voce
lnv_entry = uo_nav.of_item(/*keys*/ "folders/recent")
lnv_entry.is_text  = "Recent (12)"
lnv_entry.is_image = "mono:img\clock_full.svg"
// Disattivare o nascondere secondo i diritti, senza ricostruire la barra
uo_nav.of_item(/*keys*/ "tools/import").ib_enabled = of_is_allowed("import")
uo_nav.of_item(/*keys*/ "tools/export").ib_visible = gb_expert_mode

Selezione pilotata dal codice #

// Spostare la selezione altrove : la banda d'accento segue, e
// ue_selection_changed parte come per un clic
uo_nav.of_select_item(/*keys*/ "folders/customers")

// Oppure cancellarla del tutto
uo_nav.of_clear_selection()

Ricostruire la barra #

// of_clear svuota sezioni e voci ; of_reset ripristina anche i valori predefiniti
uo_nav.of_clear()
of_build_menu_for_profile()

Buone pratiche #

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.

MembriRuoloDescritto in
of_count · of_keys_at · of_hasPercorrere ciò che il componente contiene3.2 Gli item
of_resetRiportare il componente a zero3.6 Riportare un componente a zero: of_reset()
of_register_shortcut · of_clear_shortcutsScorciatoie da tastiera del componente3.5 Le scorciatoie da tastiera
of_is_created · of_is_ready · of_get_last_errorSe è nato, se è pronto, cosa è fallito3.7 Diagnostica
of_save_as_png · of_save_as_jpgEsportare il rendering in immagine3.8 Esportare il rendering come immagine
of_set_redrawRaggruppare le modifiche in un solo ridisegno3.10 Buone pratiche
of_preload_iconsIcone mostrate senza ritardoVisualizzazione istantanea: of_icon
of_set_translationTradurre una dicitura del componente5.2 Adattare un'etichetta: of_set_translation
of_focus_webviewDare il focus al componente6.4 Tastiera e focus
of_print · of_print_to_pdfStampare, o scrivere un PDF6.9 Stampare
of_set_property · of_get_property · of_component_namePilotare una proprietà per nome3.1 Il motore delle proprietà
is_accessible_name · is_accessible_descriptionIl nome e la descrizione che dice un lettore di schermo3.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.

← Riferimento dei componenti · Sommario della guida