GoSurface — 外殻
ポップアップもシートもドロップダウンも、すべてこれ1つを使う。セーフエリア、仮想キーボード、 固定ヘッダーとフッター、スクロールする本文、どのウィンドウが最前面か、フォーカスの復帰、 戻るボタンの所有権、ドラッグでのサイズ変更まで面倒をみる。
| 配置 | 見え方 | 用途 |
|---|---|---|
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() はボタン1つで同じように使える。取り消せない操作には destructive を立てる。
確認ボタンが塗りつぶしの GoStyle.Tone.DANGER_SOLID になる。ライトテーマでは、淡く色を付けた危険ラベルは
黒い文字に見えるまで暗くするしかないが、塗りつぶしのボタンなら赤地に白文字を保てる。ウィンドウは1つを使い回すので
トーンは呼び出しのたびに付け直され、1つ開いている間に2つめの confirm() を呼ぶと即座に
false が返る。confirm_key() は翻訳キーを受け取る。
ボタンの並べ方。 action_layout の既定は VERTICAL(長い訳文でも安全だ)、
HORIZONTAL なら半分ずつの幅で1行に、AUTO なら両方のラベルがカードの半分に1行で
収まるときだけ横に並べ、収まらなければ縦に積む。action_gap はボタンどうしの間隔、
body_gap はその上の間隔だ — ボタン間より広くとると、問いと選択肢が2つの塊として読める。
1つのダイアログにだけ効かせたいときは、開く前に set_next_action_layout() を呼ぶ。
ボタンの行は最初にダイアログを開いたときに組み立てられるので、オートロードした GoDialogs でも
起動時のコストはない。
GoForm — 幅に上限のあるフォーム
GoScroll — タッチでのスクロール
中に入れるのは1つだけにする。見出しやボタンの行は外側だ — 長いリストがそれらを画面外へ
押し出してはならない。use_panel_edge() は、中身のインデントを保ったまま
スクロールバーをカードの既存の余白へ移す。