GoField — строка, которая может быть неверной
Одна строка наверху формы из пяти полей со словами «проверьте ввод» не говорит, какое поле. Именно из-за этого одного бросают регистрацию.
var name_field := GoField.make("Имя персонажа", GoStyle.line_edit("2-12"), "Изменить потом нельзя")
name_field.set_error("Это имя занято") # сервер сказал «нет»
name_field.clear_error()
Пока показана ошибка, подсказка прячется, поэтому строка не вырастает на строку и не выталкивает всё, что под ней, а текст ошибки подмешивается в доступное имя элемента управления — одна красная рамка ничего не говорит тому, кто не видит красного.
GoStyle.field() — статичный вариант: подпись, элемент управления, подсказка, без состояния ошибки.
Берите фабрику там, где ничего не может пойти не так, и узел — везде, где сервер может отказать.
GoInputGroup — поле ввода, сваренное со своей кнопкой
GoInputGroup.make(GoStyle.line_edit("Сообщение"), {"suffix": GoStyle.icon_button(&"send", send)})
GoInputGroup.make(GoStyle.line_edit("Имя"), {"prefix_icon": &"search"})
Решает он углы. Две скруглённые формы, встречающиеся посередине, выглядят защемлёнными, а стандартный зазор заставляет читать их как два предмета. Внешние углы остаются круглыми, соприкасающиеся становятся прямыми — во всех состояниях кнопки, иначе группа распадается в момент нажатия. У скинов со срезанными углами полей для углов нет вовсе, поэтому там он их не трогает, и прямые грани сходятся чисто.
GoCombobox — выбор с поиском
Меньше десяти пунктов — лучше GoStyle.select(): на одно нажатие меньше, и виден весь список.
После тридцати просматривать глазами становится работой.
var picker := GoCombobox.make(server_names, 0, "Выберите сервер")
picker.picked.connect(func(i: int) -> void: connect_to(servers[i]))
GoCodeInput — купоны и подарочные коды
Код куда чаще вставляют из сообщения, чем набирают. Двенадцать настоящих полей ломали бы вставку на первой
ячейке и теряли символы в IME, поэтому текст принимает одно скрытое поле, а ячейки рисуются.
ABCD-EFGH-IJKL теряет дефисы по дороге.
var coupon := GoCodeInput.make(12, 4)
coupon.completed.connect(func(code: String) -> void: server.redeem(code))
coupon.set_error("Уже использован")
GoTable — сортируемые заголовки, выбираемые строки
var board := GoTable.make(
[{"text": "Место", "width": 56}, {"text": "Имя"}, {"text": "Очки", "numeric": true}], rows)
board.row_selected.connect(func(i: int) -> void: open_profile(rows[i]))
numeric: true, иначе рейтинг перевернётся. При сравнении как текста "9124"
оказывается больше "91240" — а у очков, золота и урона количество цифр всегда разное.
row_selected отдаёт индекс в вашем исходном массиве, а не позицию после сортировки. Направление
сортировки показано знаком, а не только цветом, и нажимается строка целиком, чтобы никому не приходилось
попадать в одну ячейку. GoStyle.table() остаётся сеткой только для чтения.
GoPagination — страницы или строка «Ещё»
var pager := GoPagination.make(1, 12, func(page: int) -> void: load_mail(page))
var more := GoPagination.more(load_next) # вариант для мобильных
Номера — интерфейс под мышь; на телефоне строка «Ещё» читается лучше. Текущая страница держится в середине окна, поэтому нажатие «дальше» не перетасовывает все номера. Всего 0 означает «неизвестно», и рисуются только стрелки — число страниц, которого ему не дали, он не выдумывает.