PBToolboxAI v2 ← 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

È l'unico componente della libreria a pubblicare ib_auto_width: la sua larghezza naturale ha un senso, poiché 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.


Avvio rapido #

// event open della finestra

uo_nav.of_add_section(/*key*/ "nav", /*titolo*/ "Navigazione")
uo_nav.of_add_item(/*keys*/ "nav/accueil",   /*etichetta*/ "Home",   /*icona*/ "mono:img\home.svg")
uo_nav.of_add_item(/*keys*/ "nav/documents", /*etichetta*/ "Documenti", /*icona*/ "mono:img\doc.svg")
uo_nav.of_add_item(/*keys*/ "nav/recherche", /*etichetta*/ "Ricerca", /*icona*/ "mono:img\find.svg")

uo_nav.of_add_section(/*key*/ "config", /*titolo*/ "Impostazioni")
uo_nav.of_add_item(/*keys*/ "config/preferences", /*etichetta*/ "Preferenze", /*icona*/ "mono:img\gear.svg")

// La selezione si imposta sulla VOCE, tramite il suo percorso completo
uo_nav.of_select_item("nav", "accueil")
// event ue_selection_changed di uo_nav : (string as_from_keys, string as_keys)
choose case as_keys
    case "nav/accueil"       ; of_ouvrir_accueil()
    case "nav/documents"     ; of_ouvrir_documents()
    case "config/preferences"; of_ouvrir_preferences()
end choose

Due livelli, un percorso obbligatorio #

Un identificatore di voce è univoco solo all'interno della sua sezione: non esiste quindi alcuna scorciatoia verso la voce. Ogni accesso passa dalla sezione, il che rende la scrittura non ambigua — vedere Gerarchie.

// Componente  ->  sezione        ->  voce        ->  proprieta
uo_nav        .of_section("nav") .of_item("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: le etichette scompaiono, le icone restano cliccabili
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_selectionbooleantrueChiedere prima che la selezione si sposti (attiva ue_selection_changing, che può rifiutare). Attivo per impostazione predefinita: non scrivere nulla lascia sempre passare. Lo metta a false per togliere l'andata e ritorno verso PowerBuilder (~35 ms) dove si noterebbe — navigazione da tastiera, selezione spostata in un ciclo
is_theme_stylestringfluentStile visivo del componente (costanti THEME_STYLE_*)
is_theme_modestringlightVariante chiara o scura (costanti THEME_MODE_*)
il_theme_accentlong-1Colore d'accento di questo componente (-1 = accento 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
ib_collapsedbooleanfalseFisarmonica: true comprime le voci di questa sezione. L'intestazione resta visibile e il suo chevron ruota

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 e ne blocca il clic
ib_visiblebooleantruefalse nasconde la voce senza rimuoverla dalla barra
of_is_selected ( ) → boolean——Questa voce è quella selezionata? Sola lettura, e di proposito: la selezione è uno stato dell'intera barra, non un flag per voce. Per porla, of_select sul componente — che leva sempre l'evento
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

Metodi #

Sul componente #

MetodoRuolo
of_add_section (string as_key, string as_text)Aggiunge una sezione. Restituisce 0 (-5 per un argomento non valido, -2 se il componente non è creato), come ogni gesto di struttura: l'handle viene da of_section("nav") quando volete impostare una proprietà
of_insert_section (string as_key, string as_text, integer ai_index)Aggiunge una sezione al rango richiesto (prima posizione = 0) anziché alla fine. L'indice conta sezioni, non righe. Un nome già preso viene lasciato stare: due sezioni con lo stesso nome renderebbero ambiguo l'indirizzo di ogni loro voce. Restituisce 0 una volta applicato, -5 per un argomento non valido (chiave vuota, indirizzo errato), -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 la sola intestazione lascerebbe cadere le voci nella sezione che si ritrova sopra di esse. Restituisce 0 una volta applicato, -5 per un argomento non valido (chiave vuota, indirizzo errato), -2 se il componente non è creato
of_remove_section (string as_key)Rimuove una sezione e tutto ciò che contiene. Svuotarla conservandone le voci le renderebbe orfane: porterebbero un identificatore di sezione che non nomina più nulla. Restituisce 0 una volta applicato, -5 per un argomento non valido (chiave vuota, indirizzo errato), -2 se il componente non è creato
of_section (string as_key)Handle di una sezione esistente (creato al primo accesso)
of_add_item (string as_keys, string as_text, string as_image)Aggiunge una voce al suo indirizzo, "nav/accueil": la sezione in cui atterra, poi il proprio identificatore. Restituisce 0 (-5 per un argomento non valido, -2 se il componente non è creato) — -5 se il padre non è una sezione. Un overload omette l'icona
of_item (string as_keys)Handle di una voce, tramite il suo indirizzo (creato al primo accesso)
of_insert_item (string as_keys, string as_text, integer ai_index)Inserisce una voce nella posizione ai_index all'interno della sua sezione. Restituisce 0 una volta applicato, -5 per un argomento non valido (chiave vuota, indirizzo errato), -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 accetta una, quindi anche l’inserimento deve poterla accettare. Restituisce 0 una volta applicato, -5 per un argomento non valido (chiave vuota, indirizzo errato), -2 se il componente non è creato
of_move_item (string as_keys, integer ai_index)Sposta una voce esistente all'interno della sua sezione, conservandone lo stato. Restituisce 0 una volta applicato, -5 per un argomento non valido (chiave vuota, indirizzo errato), -2 se il componente non è creato
of_remove_item (string as_keys)Rimuove una voce indicata dalla coppia sezione / identificatore. Restituisce 0 una volta applicato, -5 per un argomento non valido (chiave vuota, indirizzo errato), -2 se il componente non è creato
of_clear ( )Svuota la barra: tutte le sezioni e tutte le voci. Restituisce 0 una volta applicato, -2 se il componente non è creato
of_select_item (string as_keys)Seleziona una voce — rigorosamente equivalente a un clic dell'utente: ue_selection_changing viene chiesto prima, poi ue_selection_changed annuncia lo spostamento. Restituisce 0 una volta applicato, -5 per un argomento non valido (chiave vuota, indirizzo errato), -2 se il componente non è creato
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 non genera alcun event — l'avete fornita voi. Restituisce 0 una volta applicato, -5 per un argomento non valido (chiave vuota, indirizzo errato), -2 se il componente non è creato
of_clear_selection ( )Non lascia selezionata alcuna voce. Annunciato come qualsiasi altro spostamento. Restituisce 0 una volta applicato, -2 se il componente non è creato
of_selected_key ( )Indirizzo della voce selezionata — "nav/docs", "" se non ve n'è alcuna. È esattamente ciò che ue_selection_changed vi consegna: un confronto resta un confronto, non un rimontaggio. Sempre quella corrente: un clic e of_select_item ripassano entrambi dall'event
of_reset ( )Svuota la barra e riporta il componente allo stato iniziale. 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

Event #

EventAttivato quando
ue_selection_changed (string as_from_keys, string as_keys)La selezione si è spostata — con un clic oppure tramite of_select_item. Stessi argomenti di ue_selection_changing: la domanda e il suo esito si leggono allo stesso modo, e la coppia as_from_* indica la voce lasciata (vuota se nessuna)
ue_section_toggled (string as_key, boolean ab_collapsed)L'utente comprime o espande una sezione dalla sua intestazione
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. Conservi quest'ordine per restituire all'utente la barra come l'ha lasciata
ue_layout_changed (string as_layout_json)La disposizione è cambiata — l'utente ha riorganizzato qualcosa, o il vostro codice. Porta la disposizione intera, non solo ciò che si è mosso: conservarla è una sola assegnazione
ue_selection_changing (string as_from_keys, string as_keys) → booleanAnnullabile, posto prima che la selezione si sposti. Sollevato per impostazione predefinita; ib_veto_selection = false lo elimina. Restituisca false per mantenere l'utente dove si trova
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 #


uo_nav.of_set_redraw(false)

uo_nav.of_add_section("dossiers", "Cartelle")
uo_nav.of_add_item("dossiers/recents",  "Recenti",  "mono:img\clock.svg")
uo_nav.of_add_item("dossiers/clients",  "Clienti",  "mono:img\user.svg")
uo_nav.of_add_item("dossiers/archives", "Archivi", "mono:img\box.svg")

uo_nav.of_add_section("outils", "Strumenti")
uo_nav.of_add_item("outils/import", "Importa", "mono:img\import.svg")
uo_nav.of_add_item("outils/export", "Esporta", "mono:img\export.svg")

uo_nav.of_set_redraw(true)
uo_nav.of_select_item("dossiers", "recents")

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
// event ue_auto_width di uo_nav : (long al_width)
// La barra ha appena adottato la sua larghezza ideale : riallineare cio che si trova a destra.
uo_contenu.x     = uo_nav.x + al_width
uo_contenu.width = parent.width - uo_contenu.x

Fisarmonica: comprimere una sezione #

// Comprimere la sezione degli archivi, usata di rado
uo_nav.of_section("archives").ib_collapsed = true
// event ue_section_toggled di uo_nav : (string as_keys, boolean ab_collapsed)
of_enregistrer_preference("section_" + as_keys, String(ab_collapsed))

Reagire alla navigazione #

// event ue_selection_changed di uo_nav : (string as_from_keys, string as_keys)
// L'indirizzo porta i due livelli : due sezioni possono avere una voce "liste".
n_pbt_utils lnv_utils   // autoinstantiate : niente da creare, niente da distruggere
string ls_ids[]

if lnv_utils.of_split_path(as_keys, ls_ids) < 2 then return
choose case ls_ids[1]
    case "dossiers" ; of_ouvrir_dossier(ls_ids[2])
    case "outils"   ; of_lancer_outil(ls_ids[2])
end choose

Rifiutare un cambio di selezione #

// La domanda e posta per IMPOSTAZIONE PREDEFINITA: niente da attivare. Questa
// riga fa il contrario, la toglie dove arbitrare non serve e il costo si vedrebbe.
uo_nav.ib_veto_selection = false
// event ue_selection_changing di uo_nav :
//   (string as_from_keys, string as_keys)
// Restituire FALSE mantiene l'utente sulla voce che sta lasciando.
if of_saisie_en_cours(as_from_keys) then
    MessageBox("Inserimento", "Completi la scheda in corso prima di navigare.")
    return false
end if
return true

Aggiornare una voce a caldo #

n_pbt_listbar_item lnv_entree

// Il percorso completo e obbligatorio : componente -> sezione -> voce
lnv_entree = uo_nav.of_section("dossiers").of_item("recents")
lnv_entree.is_text  = "Recenti (12)"
lnv_entree.is_image = "mono:img\clock_full.svg"
// Disattivare o nascondere in base ai diritti, senza ricostruire la barra
uo_nav.of_section("outils").of_item("import").ib_enabled = of_a_le_droit("import")
uo_nav.of_section("outils").of_item("export").ib_visible = gb_mode_expert

Selezione pilotata dal codice #

// Spostare la selezione altrove : la banda d'accento segue
uo_nav.of_select_item("dossiers", "clients")

// Oppure cancellarla completamente
uo_nav.of_clear_selection()

Ricostruire la barra #

// of_clear svuota sezioni e voci ; of_reset vi aggiunge i valori predefiniti del componente
uo_nav.of_clear()
of_construire_menu_selon_profil()

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

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