Иконку вызывают по имени
Виджет никогда не хранит картинку. Он спрашивает имя, а что рисовать, решает текущий набор иконок — смените набор, и все иконки изменятся без правки хотя бы одной строки кода.
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 имён. Набор хранит рисунки как пути и читает файл, только когда имя рисуется впервые: при добавлении библиотеки читается таблица путей (около 30 мс на компьютере), а не 1 000 текстур.
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 с подчёркиваниями:
cloud-rainна tabler.io здесьcloud_rain. Имена Tabler для рисунков, которые в gohud уже были, ведут к ним как псевдонимы (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. Уведомления едут в ZIP в файле THIRD_PARTY_NOTICES.md.
| Набор | Источник | Лицензия |
|---|---|---|
| Стандартный | Нарисованы для gohud | MIT |
| Средневековый | Нарисованы для gohud | MIT |
| Игровой | 171 из Tabler Icons 3.46.0, 16 нарисованы для gohud | MIT |
| Библиотека | Tabler Icons 3.46.0 | MIT |
Если подключаете чужие иконки, укажите источник в GoIconSet.attribution — а коммерческие иконочные шрифты держите внутри своей игры, а не в публикуемом форке.