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