아이콘은 이름으로 부른다
위젯은 그림을 들고 있지 않다. 이름만 묻고, 무엇을 그릴지는 지금 쓰는 아이콘 세트가 정한다 — 세트를 바꾸면 코드 한 줄 고치지 않고 모든 아이콘이 바뀐다.
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/ 를 넣어야 한다. 기본값인 “모든 리소스 내보내기”는 따로 할 것이 없다.이름을 찾는 순서
모든 세트가 같은 순서를 따른다. 그래서 어느 그림이 이기는지 미리 알 수 있다.
- 모든 세트의 자기 그림이 먼저다 — 지금 쓰는 세트, 그다음 더한 세트들, 그다음 그 세트들의 fallback 을 한 단씩 본다. 세트의 자기 그림이란 텍스처·경로·아이콘 폰트 글리프다.
- 아무도 그리지 못하면 별칭을 본다:
gear는settings로,x는close로. 한 번만 건너간다. - 그래도 없으면 자리를 지키는 빈 상자.
중세 프리셋에 라이브러리를 더해도 각인된 칼이 그대로 남는 까닭이 이 순서다 — 중세 세트의 자기 그림이 누구의 fallback 보다 먼저 찾아진다.
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 에 적는다 — 그리고 상용 아이콘 폰트는 공개하는 포크가 아니라 내 게임 안에만 둔다.