gohud

浮かぶウィンドウ

← ウィジェット

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() は本文を空にし、 戻るボタンと固定行をいったん無効にする — 戻る先のない画面で死んだボタンが見えていると、 壊れているように読めるからだ。

GoDialogsawait で受け取る確認

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 — 幅に上限のあるフォーム

配下のラベルが必ず折り返すことを保証する。 これがないと、長い一文が1行に伸びて最小幅が画面を超え、 左右が切れる — 自分がどの画面にいるのかすら分からなくなる。シーンごとに手で折り返しを有効にする方法は、 毎回必ず忘れられる。

GoScroll — タッチでのスクロール

中に入れるのは1つだけにする。見出しやボタンの行は外側だ — 長いリストがそれらを画面外へ 押し出してはならない。use_panel_edge() は、中身のインデントを保ったまま スクロールバーをカードの既存の余白へ移す。