gohud

浮动窗口

← 控件

GoSurface —— 外壳

弹窗、底部面板和下拉菜单用的都是它。它负责安全区域、虚拟键盘、 常驻页眉页脚、滚动主体、谁是最上层窗口、焦点恢复、返回键的归属,以及拖动改变大小。

摆放方式看起来是用在哪里
CENTER屏幕中央的一张卡片确认框、设置
BOTTOM从下方升起的面板列表、管理页面
ANCHOR贴在某个控件旁边的卡片下拉菜单、右键菜单
它不会自己移除自己。 收到 close_requested 之后要隐藏还是释放, 是拥有它的那个界面的事 —— 因为外壳无从知道它为什么被关闭(是保存后关闭,还是丢弃)。

GoSheet —— 从底部升起的页面

var sheet := GoSheet.new()
add_child(sheet)
sheet.open("背包")
sheet.toolbar().add_child(GoStyle.line_edit("搜索…"))
sheet.toolbar().visible = true
sheet.footer().add_child(GoStyle.button("关闭", sheet.close, GoStyle.Tone.PRIMARY))
sheet.footer().visible = true

它自带一个 CanvasLayer,因此能稳稳地盖在 HUD 之上。open() 会清空 主体,并关掉返回按钮和常驻行 —— 在一个无处可返回的界面上留一颗按不动的按钮,看上去就像坏了。

GoDialogs —— 可以 await 的确认框

if await dialogs.confirm("删除存档", "此操作无法撤销。"):
    delete_save()

confirm(title, body, ok_text, cancel_text, extra, args, destructive) —— 正文之后的参数全都可选, alert() 用法相同,只是只有一个按钮。不可撤销的操作请设置 destructive: 确认按钮会变成实心的 GoStyle.Tone.DANGER_SOLID 按钮。 在浅色主题上,带底色的危险文字必须一路压暗到近乎黑色才读得清;实心按钮则保持红底白字。 因为窗口是复用的,每次调用都会重新应用一遍色调;已经开着一个时再调 confirm(),会立刻返回 falseconfirm_key() 接受翻译键。

按钮排布。 action_layout 默认是 VERTICAL(对长译文更安全), HORIZONTAL 表示排成一行、各占一半宽度,AUTO 则只在两个标签都能在卡片一半宽度内单行放下时才排成一行, 否则上下堆叠。action_gap 是按钮之间的间距,body_gap 是按钮上方的间距 —— 把后者调得比按钮间距更大,问题和选项才会读成两个部分。只想改某一个对话框时, 在打开之前调用 set_next_action_layout()。按钮行是在对话框第一次打开时才构建的, 所以把 GoDialogs 放进自动加载也不会在启动时增加任何开销。

GoForm —— 限定最大宽度的表单

它保证其后代的标签会自动换行。 否则一句长句子会拉成一整行,其最小宽度超过屏幕, 两侧被裁掉 —— 甚至会让人看不出自己在哪个界面上。逐个场景手动打开换行,每次都会忘。

GoScroll —— 触摸滚动

里面只放一样东西。页眉和按钮行都该放在外面 —— 长列表绝不能把它们顶出屏幕。 use_panel_edge() 会把滚动条移进卡片已有的内边距里,同时内容保持原来的缩进。