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 表示「不知道」,這時只畫箭頭 — 它不會憑空生出一個沒人告訴它的頁數。