scopedvr-map-core/ui/panels/editor_panel.gd
2026-11-01 19:31:33 +01:00

89 lines
3.2 KiB
GDScript

extends VBoxContainer
class_name EditorPanel
## Basis-Klasse aller Registry-Panels (Karte t_eaccbfed). Jedes Modul baut
## seinen eigenen Inhalt in setup(main) und wird von main.gd NUR über die
## Registry (core/ui/panels/registry.gd) in den Baum gehängt — main.gd kennt
## keine Panel-Interna mehr.
##
## Datenfluss (bewusst 1:1 wie vorher): Module greifen über `main` auf das
## Dokument/History/Werkzeuge zu und rufen die Koordinator-Helfer über
## main.call(...) — der Aufruf-Vertrag zu den Tools (interaction.gd etc.)
## bleibt unverändert, die Methoden wohnen jetzt nur in den Modulen.
var main # core/ui/main.gd (script-erweitert → untypisiert)
func setup(p_main) -> void:
main = p_main
# U7-Abstands-Raster (4/8 px, über ui_scale skaliert): Panel-Grundabstand.
add_theme_constant_override("separation", UIScale.px(8))
## Titel der Sektions-Überschrift (Registry-Titel als Default).
func panel_title() -> String:
return "Panel"
## Lange Tabs (Map, Bauen): den ganzen Inhalt in einen senkrechten Scroll-Bereich
## legen, damit die rechte Spalte nicht mit dem Inhalt wächst. Rückgabe = die
## innere Box (dort hängen spätere Abschnitte an).
func wrap_in_scroll() -> VBoxContainer:
var scroll := ScrollContainer.new()
scroll.name = "%sScroll" % name
scroll.size_flags_vertical = Control.SIZE_EXPAND_FILL
scroll.size_flags_horizontal = Control.SIZE_EXPAND_FILL
scroll.horizontal_scroll_mode = ScrollContainer.SCROLL_MODE_DISABLED
var inner := VBoxContainer.new()
inner.name = "%sInhalt" % name
inner.size_flags_horizontal = Control.SIZE_EXPAND_FILL
inner.add_theme_constant_override("separation", UIScale.px(8))
for child in get_children():
remove_child(child)
inner.add_child(child)
scroll.add_child(inner)
add_child(scroll)
return inner
# --- Farb-Zugriff NUR über das Theme (Karte t_2336c58e/U7) ------------------
## Farben kommen ausschließlich aus theme/editor_theme.tres (Abschnitt
## Editor/colors/…) — keine Farbwerte mehr im Panel-Code. Der Wert liest
## sich vom angeschlossenen Theme-Baum (main hängt theme auf das Fenster).
func theme_color(cname: String) -> Color:
# Befund 25.10. („Texte kaum lesbar“): Panels werden gebaut, BEVOR sie im
# Baum hängen — get_theme_color liefert dort Schwarz statt der Theme-Farbe.
# Darum direkt aus dem Theme des Hauptfensters lesen.
if main != null and main.theme != null and main.theme.has_color(cname, "Editor"):
return main.theme.get_color(cname, "Editor")
return get_theme_color(cname, "Editor")
# --- Gemeinsame Bau-Helfer (aus main.gd übernommen, Logik identisch) --------
func _header_label(text: String) -> Label:
var label := Label.new()
label.text = text
label.add_theme_font_size_override("font_size", UIScale.heading_font_size())
label.add_theme_color_override("font_color", theme_color("accent"))
return label
func _field_label(text: String) -> Label:
var label := Label.new()
label.text = text
label.add_theme_color_override("font_color", theme_color("field"))
return label
func _muted_label(text: String) -> Label:
var label := Label.new()
label.text = text
label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
label.add_theme_color_override("font_color", theme_color("muted"))
return label
func _separator() -> HSeparator:
return HSeparator.new()