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 —— 兑换码和礼品码

兑换码从消息里粘贴过来的次数,远远多于一个个敲进去。十二个真的输入框,会让粘贴卡在第一格, 还会被输入法吃掉字符 —— 所以文字交给一个隐藏的输入框接住,格子只是画出来的。 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 表示“未知”,这时只画箭头 —— 它不会替你编一个没人告诉过它的总页数。