アイコンは名前で呼ぶ
ウィジェットは絵を持たない。名前を尋ねるだけで、何を描くかは使用中のアイコンセットが決める — セットを替えれば、コードを一行も触らずにすべてのアイコンが替わる。
GoStyle.icon_button(GoIconSet.SETTINGS, open_settings) # a button
slot.icon_name = GoGameIcons.BACKPACK # a quick slot
var mark := GoUi.icons().node(&"cloud_rain", 24) # a bare Control, any size
GoUi.icons() が使用中のセットだ。描けない名前は場所を保つ空の箱になり、デバッグビルドでは警告が出る。アイコンが一つ欠けても行がずれない。
アイコンを探す
gohud に入っている絵のすべて。名前や見た目で検索し、セットやグループで絞り込み、アイコンを選んで名前をコピーする。
名前と検索語はどの言語でも英語のまま — コードに打つ文字だからだ。
四つのセット、探し方は一つ
どのセットも同じ呼び出しに答える。大きなセットは使用中のセットの上に足して使う。
| セット | 名前 | 定数 | 有効にする |
|---|---|---|---|
| デフォルト | 84 | GoIconSet | 常に有効 |
| 中世 | 彫刻風 16 枚 | — | GoUi.use_preset(GoThemePresets.MEDIEVAL_DARK) |
| ゲーム | 187 | GoGameIcons | GoUi.add_icons(GoGameIcons.icon_set()) |
| ライブラリ | 1,000 | GoIconLibrary | GoUi.add_icons(GoIconLibrary.icon_set()) |
GoUi.add_icons(GoIconLibrary.icon_set()) # the library — and the game set under it
GoUi.add_icons(GoGameIcons.icon_set()) # or the game set alone
ライブラリはゲームセットへ、ゲームセットはデフォルトセットへフォールバックするので、一行で 1,271 個の名前が描ける。セットは絵をパスで持ち、その名前を初めて描くときにファイルを読む — ライブラリを足しても 1,000 枚のテクスチャではなく、パスの表を一つ読むだけだ(デスクトップで約 30 ms)。
addons/gohud/icons/ を含める。既定の「すべてのリソースをエクスポート」なら何もしなくてよい。名前を探す順序
どのセットも同じ順序に従う。だから、どの絵が勝つか前もって分かる。
- まずすべてのセットの自前の絵 — 使用中のセット、次に足したセット、次にそれらのフォールバックを一段ずつ見る。自前の絵とは、テクスチャ・パス・アイコンフォントのグリフだ。
- 誰も描けなければ別名を見る:
gearはsettingsへ、xはcloseへ。たどるのは一度だけ。 - それでもなければ、場所を保つ空の箱。
中世プリセットにライブラリを足しても彫刻風の剣がそのまま残るのは、この順序のためだ — 中世セットの自前の絵が、誰のフォールバックよりも先に見つかる。
GoUi.use_preset(GoThemePresets.MEDIEVAL_DARK)
GoUi.add_icons(GoIconLibrary.icon_set())
GoUi.icons().texture(&"sword") # the medieval engraving — its own drawing comes first
GoUi.icons().texture(&"rocket") # from the game set
GoUi.icons().canonical(&"gear") # &"settings" — an alias
プリセット、自分のセット、足したセット
何を描くかは三か所で決まる。
| 呼び出し | すること |
|---|---|
GoUi.use_preset(…) | テーマ・スキン・アイコンセットを一度に替える。config.icons は空にし、config.extra_icons は残す。 |
GoUi.config.icons = my_set | プリセットのアイコンセットを自分のセットに替える。 |
GoUi.add_icons(set) | 使用中のセットの次に見るセットを足す。プリセットを替えても残る。 |
自分の絵を入れる
名前をいくつか上書きする、フォルダーを丸ごと足す、アイコンフォントをつなぐ — 呼び出すコードはそのままだ。
# Override a few names — everything else still comes from the set in use
var mine := GoIconSet.new()
mine.fallback = GoUi.icons()
mine.textures = {GoIconSet.CLOSE: preload("res://art/close.svg")}
GoUi.config.icons = mine
# A folder of drawings — file name = icon name, each read when first drawn
GoUi.config.icons = GoIconSet.from_folder("res://art/icons", GoUi.icons())
- 24×24 のグリッドに白い線で描く。色は
modulateで付くが、これは暗くすることしかできない — 黒く描いた絵はどのテーマでも黒いままだ。 - SVG は
DPITextureとしてインポートする。そうすれば 64 dp のインベントリ枠でもくっきり見える。 - アイコンは右から左へ書く言語でも反転しない。向きが変わるのは
backとforwardだけで、それは名前で選ぶ。 - アイコンフォントも使える:
fontとcodepointsを埋める。ほかは何も変わらない。
名前・グループ・検索
同梱セットが守る規則と、名前を探す呼び出し。
- lower_snake_case で、描いたものを先に、状態を後ろに付ける:
volume_off,battery_charging,arrow_bar_left。 - グループの接頭辞は付けない。グループはデータなので、どこに分類しても名前は変わらない。
- ライブラリの名前は Tabler の名前のハイフンを下線に替えたもの: tabler.io の
cloud-rainはここではcloud_rain。gohud にすでにあった絵の Tabler 名は、別名としてその絵に届く(shopping_cart→cart)。 - 同じ意味の別の語は別名であって、二枚目の絵ではない。
search()
var icons := GoUi.icons()
icons.search("arrow left", 5) # best matches first: back, arrow_bar_left …
icons.search("rain") # cloud_rain, then drawings tagged "rain"
group_names() · names_in_group()
icons.group_names() # every group key, in lookup order
icons.names_in_group(&"weather") # one group, in display order — every set's share of it
icons.group_title(&"weather") # "Weather & sky"
canonical() · has_icon()
icons.canonical(&"gear") # &"settings"
icons.canonical(&"treasure_chest") # &"chest" — Tabler's name for a game drawing
icons.has_icon(&"cloud_rain") # true once the library is added — nothing is loaded to answer
絵の出典
すべて MIT。告知は THIRD_PARTY_NOTICES.md として ZIP に同梱される。
| セット | 出典 | ライセンス |
|---|---|---|
| デフォルト | gohud のために描いた | MIT |
| 中世 | gohud のために描いた | MIT |
| ゲーム | 171 個は Tabler Icons 3.46.0、16 個は gohud のために描いた | MIT |
| ライブラリ | Tabler Icons 3.46.0 | MIT |
他人のアイコンをつなぐなら、その出典を GoIconSet.attribution に書く — そして商用のアイコンフォントは、公開するフォークではなく自分のゲームの中にだけ置く。