89 lines
3.2 KiB
GDScript
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()
|