GoField — la rangée qui peut être en erreur
Une seule ligne en haut d'un formulaire à cinq champs qui dit « vérifiez votre saisie » ne dit pas quel champ. C'est cette seule chose qui fait abandonner une inscription.
var name_field := GoField.make("Nom du personnage", GoStyle.line_edit("2-12"), "Impossible à changer ensuite")
name_field.set_error("Ce nom est déjà pris") # le serveur a refusé
name_field.clear_error()
L'indication se masque pendant qu'une erreur s'affiche : la rangée ne grandit donc pas d'une ligne en poussant tout ce qui se trouve en dessous, et le texte d'erreur est joint au nom accessible de la commande — une bordure rouge, à elle seule, ne dit rien à qui ne voit pas le rouge.
GoStyle.field() en est la version statique : libellé, commande, indication, sans état d'erreur.
Prenez la fabrique quand rien ne peut mal tourner, et le nœud pour tout ce qu'un serveur peut refuser.
GoInputGroup — une saisie soudée à son bouton
GoInputGroup.make(GoStyle.line_edit("Message"), {"suffix": GoStyle.icon_button(&"send", send)})
GoInputGroup.make(GoStyle.line_edit("Nom"), {"prefix_icon": &"search"})
Ce qu'il règle, ce sont les coins. Deux formes arrondies qui se rejoignent au milieu paraissent pincées, et l'écart par défaut les fait lire comme deux objets. Les coins extérieurs restent ronds, ceux qui se touchent deviennent carrés — dans chaque état du bouton, sinon le groupe se scinde à l'instant où l'on appuie dessus. Les skins chanfreinés n'ont aucun champ de coin : là, il les laisse tranquilles et les faces carrées se rejoignent proprement.
GoCombobox — un sélecteur qui cherche
En dessous de dix entrées, GoStyle.select() vaut mieux : un appui de moins et toute la liste est
visible. Au-delà de trente, parcourir devient un travail.
var picker := GoCombobox.make(server_names, 0, "Choisissez un serveur")
picker.picked.connect(func(i: int) -> void: connect_to(servers[i]))
GoCodeInput — codes promo et codes cadeaux
Un code est bien plus souvent collé depuis un message que saisi au clavier. Douze vrais champs casseraient le
collage dès la première case et perdraient des caractères à cause d'un IME : un seul champ masqué reçoit donc
le texte, et les cases sont dessinées. ABCD-EFGH-IJKL perd ses tirets en chemin.
var coupon := GoCodeInput.make(12, 4)
coupon.completed.connect(func(code: String) -> void: server.redeem(code))
coupon.set_error("Déjà utilisé")
GoTable — des en-têtes triables, des rangées sélectionnables
var board := GoTable.make(
[{"text": "Rang", "width": 56}, {"text": "Nom"}, {"text": "Score", "numeric": true}], rows)
board.row_selected.connect(func(i: int) -> void: open_profile(rows[i]))
numeric: true, sinon le classement s'inverse. Comparé comme du texte, "9124"
passe devant "91240" — et les scores, l'or et les dégâts ont tous un nombre de chiffres variable.
row_selected donne l'indice dans votre tableau d'origine, pas la position triée. Le sens du tri
est indiqué par un glyphe, pas seulement par une couleur, et la rangée entière s'appuie : personne n'a à viser
une cellule. GoStyle.table() reste la grille en lecture seule.
GoPagination — des pages, ou une rangée « Voir plus »
var pager := GoPagination.make(1, 12, func(page: int) -> void: load_mail(page))
var more := GoPagination.more(load_next) # la variante adaptée au mobile
Les numéros sont une interface à la souris ; sur un téléphone, la rangée « Voir plus » se lit mieux. La page courante reste centrée dans la fenêtre : appuyer sur suivant ne rebat donc pas tous les numéros. Un total de 0 signifie « inconnu » et seules les flèches sont dessinées — il n'invente pas un nombre de pages qu'on ne lui a pas donné.