gohud

Формы и списки

← Виджеты

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 означает «неизвестно», и рисуются только стрелки — число страниц, которого ему не дали, он не выдумывает.