Jeder Control-Typ ist ein ControlTypeDescriptor in der ControlTypeRegistry (siehe Das Dokumentmodell). Die Registrierung ist auf zwei Pakete aufgeteilt:
Nui/Schema/CorePack) — allgemeine, spielunabhängige Typen. Immer verfügbar.Extensions/RappelzPack) — spielspezifische Typen (Kampf-Anzeigen, Quest-UI, Gilden-Uhr, …). Über die CMake-Option NUISTUDIO_ENABLE_RAPPELZ_PACK (Standard: an) abschaltbar, damit der Editor-Kern keine harte Abhängigkeit von einer Spiel-Domäne hat.Diese Trennung ist bewusst:
ControlTypeRegistry::Register(...)behandelt beide Pakete völlig gleichwertig — es gibt keine Sonderbehandlung "des Spiel-Pakets" im Kern.
| Typ | Kategorie | Besonderheit |
|---|---|---|
genwnd |
Fenster | Wurzeltyp jedes Dokuments, eigene style-Tabelle mit 21 Bits |
static |
Anzeige | Einziger Typ mit bestätigtem generischem Piece-Layout; KSTYLE_STRETCH_VERTICAL steuert 3-Piece-Richtung |
iconstatic |
Anzeige | Icon-Variante von static |
multi_icon |
Anzeige | Mehrere Icons in einem Control |
simplebutton, button, captionbutton |
Interaktion | Eigene style-Tabelle (KSTYLE_BUTTON_LEFTSIDE/RIGHTSIDE/CANDRAG/VERTICAL); ignorieren rect, zeichnen einen nativen Frame pro Hover-/Press-Zustand |
check, buttoncheck, captionbuttoncheck |
Interaktion | Eigene style-Tabelle (KSTYLE_CHECK_CAPTION_RIGHT) |
edit |
Eingabe | Texteingabefeld |
gauge |
Anzeige | Eigene style-Tabelle (KSTYLE_GAUGE_WITH_GRADUATION) |
h_slider |
Interaktion | Horizontaler Schieberegler |
h_scroll, v_scroll, v_scrollEx, v_scrollSmallEx |
Interaktion | ani kodiert bis zu vier Teil-Animationen (Hintergrund/Balken/Hoch/Runter) |
combo_box |
Interaktion | Dropdown-Auswahl |
list^item_string^h, list^item_icon_string^h |
Container | Zusammengesetzter Typname (siehe unten) |
item_string, item_icon_string |
Container-Eintrag | Einzelner Listeneintrag |
tab_sheet, tab_head, tab_simple_head |
Container | Eigene style-Tabelle (KSTYLE_TAB_VERTICAL); tab_head/tab_simple_head haben eigenes AniLayout::TabHead |
statusbar |
Fenster-Chrome | Eigene style-Tabelle (KSTYLE_SB_NOLEFTSIDE/NORIGHTSIDE) |
titlebar |
Fenster-Chrome | Titelleiste |
tooltip |
Anzeige | Tooltip-Fenster |
msgwnd |
Fenster | Eigene style-Tabelle (KSTYLE_MSG_VERTICAL_REPEAT/HORIZONTAL_REPEAT) |
number |
Anzeige | Eigene style-Tabelle (KSTYLE_NUMBER_LEFT/CENTER/RIGHT) |
Hinweis zu Tabs: Das Original definiert zwei parallele Tab-Systeme (
simple_tab/detail_tabundtab_sheet+tab_head+tab_simple_head). Interne Kommentare im Original-Quellcode identifizieren das Sheet/Head-System als beabsichtigten Nachfolger — nur dieses ist deshalb Teil der Kern-Palette.simple_tab/detail_tabbleiben trotzdem vollständig öffenbar und round-trip-fähig (über den generischen Unknown-Data-Preservation-Pfad), sind aber nicht als eigener, erster-Klasse-Typ modelliert.
| Typ | Bereich |
|---|---|
3dstatic |
3D-Modell-Einbettung |
chaos_gauge, exp_gauge, fury_gauge, effect_gauge, skill_cast_gauge |
Diskretisierte Kampf-/Status-Anzeigen |
notch |
Einzelne Kerbe/Segment einer diskretisierten Anzeige |
clockbox |
Radiale Uhr-/Cooldown-Anzeige |
colorbox |
Farbfläche |
damage, damage_critical, damage_etc, damage_extra, damage_text |
Fliegender Kampftext, nach Schadensart |
healing, healing_maximize |
Heilungs-Anzeigetext |
effect_text, effect_text_group |
Statuseffekt-Text |
detail_tab, detail_tab_item, simple_tab, simple_tab_item |
Das ältere, nicht als Kern-Typ modellierte Tab-System (siehe oben) |
dynamictexture_static |
Static mit zur Laufzeit generierter Textur |
item_community, list^item_community^h |
Community-/Gilden-Listeneinträge |
minimap_static |
Minikarten-Anzeige |
qjtv_static |
Quest-Journal/-Video-Anzeige |
quest_info, quest_info_mgr |
Quest-Informationsanzeige |
quick_effect |
Kurzzeitiger visueller Effekt |
rankiconstatic |
Rang-/Stufen-Icon |
list^item_string^h und Verwandte kodieren drei Informationen in einem ^-getrennten Namen:
list ^ item_string ^ h
│ │ └─ Ausrichtung (h = horizontal beobachtet; v plausibel, wird nicht abgelehnt)
│ └─ Typ der Listeneinträge (selbst ein registrierter Typ)
└─ Container-Typ
NUIStudio zerlegt das einmalig beim Parsen in eine strukturierte CompoundTypeName{container, itemType, orientation} statt es wiederholt im Rendering-/UI-Code per String-Split zu behandeln.
So sieht eine reale Registrierung mit eigener style-Tabelle aus (Nui/Schema/CorePack/src/CorePack.cpp):
auto statusbar = MakeDescriptor("statusbar", flagTable, anchorTable);
statusbar.styleTable = BitflagTable({
BitflagEntry{"KSTYLE_SB_NOLEFTSIDE", 1u << 1},
BitflagEntry{"KSTYLE_SB_NORIGHTSIDE", 1u << 2},
});
add(std::move(statusbar));
Typen ohne Besonderheiten teilen sich dagegen einfach die globalen flag-/anchor-Tabellen und bekommen keine eigene styleTable zugewiesen.
ControlTypeDescriptor intern aufgebaut ist