GoField — la riga che può essere sbagliata
Una riga in cima a un modulo di cinque campi che dice "controlla i dati inseriti" non dice quale campo. È proprio questa singola cosa a far abbandonare una registrazione.
var name_field := GoField.make("Nome del personaggio", GoStyle.line_edit("2-12"), "Non potrà essere cambiato")
name_field.set_error("Questo nome è già preso") # il server ha detto di no
name_field.clear_error()
Il suggerimento si nasconde mentre è visibile un errore, così la riga non cresce di una linea spingendo giù tutto quello che ha sotto, e il testo dell'errore viene unito al nome accessibile del controllo — un bordo rosso da solo non dice nulla a chi il rosso non lo vede.
GoStyle.field() è la versione statica: etichetta, controllo, suggerimento, nessuno stato di errore.
Usa la factory quando non può andare storto nulla e il nodo per tutto ciò che un server può rifiutare.
GoInputGroup — un campo saldato al suo pulsante
GoInputGroup.make(GoStyle.line_edit("Messaggio"), {"suffix": GoStyle.icon_button(&"send", send)})
GoInputGroup.make(GoStyle.line_edit("Nome"), {"prefix_icon": &"search"})
Quello che risolve sono gli angoli. Due forme arrotondate che si incontrano al centro sembrano strozzate, e lo spazio predefinito le fa leggere come due oggetti. Gli angoli esterni restano tondi, quelli che si toccano diventano squadrati — in ogni stato del pulsante, altrimenti il gruppo si spacca nell'istante in cui lo premi. Le skin smussate non hanno affatto campi per gli angoli, quindi lì li lascia stare e le facce squadrate si incontrano pulite.
GoCombobox — un selettore che cerca
Sotto le dieci voci GoStyle.select() è meglio: un tocco in meno e la lista si vede tutta.
Oltre le trenta, scorrerla con gli occhi è un lavoro.
var picker := GoCombobox.make(server_names, 0, "Scegli un server")
picker.picked.connect(func(i: int) -> void: connect_to(servers[i]))
GoCodeInput — codici coupon e codici regalo
Un codice viene incollato da un messaggio molto più spesso di quanto venga digitato. Dodici campi veri
spezzerebbero l'incollaggio alla prima cella e perderebbero caratteri per colpa di un IME, quindi il testo lo
prende un unico campo nascosto e le celle vengono disegnate. ABCD-EFGH-IJKL perde i trattini mentre entra.
var coupon := GoCodeInput.make(12, 4)
coupon.completed.connect(func(code: String) -> void: server.redeem(code))
coupon.set_error("Già usato")
GoTable — intestazioni ordinabili, righe selezionabili
var board := GoTable.make(
[{"text": "Pos.", "width": 56}, {"text": "Nome"}, {"text": "Punteggio", "numeric": true}], rows)
board.row_selected.connect(func(i: int) -> void: open_profile(rows[i]))
numeric: true, altrimenti la classifica si inverte. Confrontato come testo, "9124" batte
"91240" — e punteggi, oro e danni hanno tutti un numero di cifre variabile.
row_selected restituisce l'indice nel tuo array originale, non la posizione dopo l'ordinamento. Il verso
dell'ordinamento è mostrato con un glifo, non solo con un colore, e le righe si premono per intero, così nessuno deve centrare una
singola cella. GoStyle.table() resta la griglia di sola lettura.
GoPagination — pagine, oppure una riga Altro
var pager := GoPagination.make(1, 12, func(page: int) -> void: load_mail(page))
var more := GoPagination.more(load_next) # la variante adatta al mobile
I numeri sono un'interfaccia da mouse; su un telefono la riga Altro si legge meglio. La pagina corrente resta al centro della finestra, quindi premere avanti non rimescola tutti i numeri. Un totale di 0 significa "sconosciuto" e vengono disegnate solo le frecce — non si inventa un numero di pagine che non gli è stato dato.