saumwacht-godot/scripts/luneraria/ui/components/tab_bar.gd
Martin Stickelbroeck 1b540f2a55 G3 (Zwischenstand): neues Ingame-HUD; Projekt wechselt nach Unity
Nicht abgenommen: Nach dem ersten Spieltest wurde entschieden, Champions of
Luneraria nach Unity 6 zu portieren. Dieser Stand ist die Referenz für das
HUD im Unity-Projekt (../luneraria-unity).

- HUD neu aus Komponenten mit eigenem Theme, Porträts aus den echten Modellen
  (einmal gerendert, zwischengespeichert), Lane-Übersicht mit deterministischer
  Bedrohung aus öffentlichem Zustand, Bossgrotte, nächste Welle, Ereignisse,
  Minimap mit zusammengefassten Armeen, Held/Items/Talente, Einheitendetails,
  Angriffschampions, Bereit-Sperre, UI-Größe, Team-Formen statt nur Farben
- Privatsphäre über LuneHudModel: fremdes Gold und fremde Entwürfe erscheinen nie
- Keine Regeländerung: Regeln 91/91, M2 73/73, Netz 43/43; verify_g3 715/715;
  verify_m1 38/38 und verify_m2 14/14 mit angepassten UI-Treibern
- Spieltest bis Welle 8 über die echte Oberfläche, Befunde in G3-HUD.md
- HELDEN-KONZEPT.md: vom Projektinhaber vorgegebene Helden (nicht umgesetzt)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 19:59:55 +02:00

33 lines
1 KiB
GDScript

class_name LuneTabBar
extends HBoxContainer
## Tabs with a bronze underline for the open one. `select` changes only the display;
## `tab_changed` fires on player input.
signal tab_changed(index: int)
var current: int = 0
var tabs: Array[Button] = []
var _group := ButtonGroup.new()
func _init() -> void:
add_theme_constant_override("separation", 2)
func add_tab(title: String, tooltip_title: String = "", tooltip_text: String = "") -> Button:
var tab := LuneUiTheme.button(title, "HudTab", self)
tab.toggle_mode = true
tab.button_group = _group
var index: int = tabs.size()
tab.pressed.connect(func() -> void:
current = index
tab_changed.emit(index))
if not tooltip_title.is_empty():
LuneTooltip.attach(tab, func() -> Dictionary: return {"title": tooltip_title, "text": tooltip_text})
tabs.append(tab)
if tabs.size() == 1:
tab.set_pressed_no_signal(true)
return tab
func select(index: int) -> void:
current = clampi(index, 0, tabs.size() - 1)
for i: int in range(tabs.size()):
tabs[i].set_pressed_no_signal(i == current)