gohud

待たせる、伝える、数える

← ウィジェット

GoSnackbar — 自分で居場所を決めるメッセージ

画面の下(あるいは上)に、セーフエリアと仮想キーボードを避けて出て、自分で消える。これがないと、 「保存しました」と言うだけの画面ごとに、レイヤーも配置もタイマーも後片付けも書くことになる。

snack.show_text("保存しました", GoTheme.SUCCESS)

# 取り消す機会 — 0 は最初のボタン、-1 は時間切れ
if await snack.post({"text": "アイテムを捨てた", "actions": ["取り消す"]}) == 0:
    restore_item()

メッセージは互いを上書きせず順番に並ぶし、同じ文面の繰り返しはまとめられる — 毎秒4回失敗する サーバーが、4分ぶんの警告を積み上げることはもうない。ボタンのないスナックバーは入力を通すので、 その下のゲームは動き続ける。

何かを尋ねる場所ではない。 自分で消えてしまうので、プレイヤーが一度も見ないことがある。 取り消せない操作の確認は GoDialogs の仕事だ。ここに置くボタンは、なくても困らないものに限る — 取り消す、詳細、再試行。

GoNotice はこの対のもう半分だ。入力もフォーカスも決して取らず、どこに出すかは持ち主の画面が 決める。あちらはボタンを持てないが、こちらは持てる。

GoSpinner — 終わりの見えない待ち時間

サーバーと話すゲームが、このページの中でいちばん必要とするものだ。止まったままの画面は、落ちたと 読まれる。呼び出し1つで、押されたボタンがその場でスピナーに変わる。

GoSpinner.busy(buy_button, true)
var ok := await server.purchase(item)
GoSpinner.busy(buy_button, false)

ボタンは大きさを保つ — ラベルは消えるのではなく透明になるので、行が跳ねない — そして回っている間は 無効になる。要はこの後半だ。await している間に購入が2回走ってはならない。 reduce_motion にすると回らず、代わりに3つの点が明滅する。

測れる進捗なら GoBar だ。スピナーは、いつ終わるかを何も約束しない。

GoBadge — 未読の点、NEW の札、99+

GoBadge.attach(mail_button, unread_count)   # 0 のときは自分で隠れる
GoBadge.attach(shop_button, 0, "NEW")
GoBadge.attach(friend_button, 3, "", true) # 点 — 「何かある」

アンカーで持ち主の右上に吊り下がるので、大きさが後から決まる相手にも付いていくし、2度付けても同じ バッジが返る。数が変われば行動も変わるときは数字を、「何かある」ことだけが問題なら点を使う。

文字の色は、スキンがバッジをどの色で塗ったとしてもコントラストが取れるように選ばれる — 白だと決めて かかることはない。読み上げ用の名前も持つ。色の付いた点は、スクリーンリーダーには何も伝えないからだ。