Diese Seite ist eine kuratierte, beispielgetriebene Einführung. Die vollständige, formale Grammatik (EBNF) sowie jede bekannte historische Eigenart des Formats stehen in
docs/NUI_FORMAT_SPEC.mdim Quell-Repository — das ist das eigentliche Spezifikationsdokument, gegen das Parser und Serializer gebaut sind.
.nui ist ein reines Textformat ohne Kopfzeile, Versionsfeld oder Magic Number. Eine Datei ist einfach eine Folge von Blöcken:
begin genwnd
id = window_main_inventory_bag;
spr = ui_frame.spr;
rect = 0,0,371,600;
style = KSTYLE_NOMINIMIZE | KSTYLE_NOTITLE | KSTYLE_MOVE_BY_CUSTOM |;
end
begin static
id = outframe;
spr = ui_frame.spr;
ani = common_panel_outframe_copper;
rect = 0,0,342,600;
flag = KFLAG_NO_GET_MESSAGE |;
end
begin <typ> und endet mit end.schlüssel = wert;.| (Pipe-Zeichen) zählt als Leerzeichen, nicht als Operator — style = A | B |; und style = A B; sind gleichbedeutend. Eine abschließende Pipe vor dem Semikolon ist eine gängige, aber rein kosmetische Schreibweise.//- und /* */-Kommentare sind zwischen beliebigen Token erlaubt.Eine .nui-Datei beschreibt genau ein Fenster und eine flache Liste von Kind-Controls:
typ = genwnd — das Wurzelfenster des Dokuments.begin/end innerhalb eines Blocks — tiefere visuelle Hierarchien (Listeneinträge, Scrollbar-Teile, Tab-Blätter) werden zur Laufzeit aus dieser flachen Struktur konstruiert, nicht in der Datei selbst ausgedrückt.genwnd-Block darf an beliebiger Position in der Datei stehen — NUIStudio findet ihn über seinen Typnamen, nie über seine Position. (Das Original sucht dagegen positionsbasiert — ein dokumentierter, hier bewusst korrigierter Fehler, siehe Bekannte Eigenarten & Korrekturen).| Schlüssel | Wertform | Bedeutung |
|---|---|---|
id |
Text | Bezeichner des Controls (per Konvention eindeutig, nicht grammatikalisch erzwungen) |
spr |
Text | Dateiname des Sprite-Sets, z. B. ui_frame.spr |
ani |
Text | Animationsname innerhalb des referenzierten .spr (siehe unten: teils mehrteilig überladen) |
frame |
Zahl | Statischer Frame-Index, Standard 0, selten explizit gesetzt |
rect |
links,oben,rechts,unten |
Absolutes Rechteck |
pos |
x,y |
Alternative zu rect — Breite/Höhe ergeben sich dann aus dem Sprite selbst |
caption |
Text | Anzeigetext, kann Formatierungs-Tags enthalten (siehe Captions & Text-Rendering) |
info |
Text | Tooltip-Text |
style |
Bitflag-Liste | Pro Control-Typ unterschiedlich belegt — niemals ohne Kenntnis des Typs interpretieren |
flag |
Bitflag-Liste | Global, gleiche Bedeutung bei jedem Control-Typ |
anchor |
Bitflag-Liste | Global — Verankerung an Eltern-Rändern bei Größenänderung |
ani — mehrteilig überladenBei den meisten Typen ist ani einfach ein Animationsname. Zwei Familien packen zusätzliche Daten /-getrennt hinein:
# Scrollbar: Hintergrund/Balken/Hoch-Knopf/Runter-Knopf in einer Eigenschaft
ani = scroll_bg/scroll_bar/scroll_up/scroll_down;
# Tab-Kopf: Basis-Animation/verknüpfte-Sheet-ID<#Schriftfarbe-im-Ruhezustand>
ani = tab_base/sheet_01<#FFFFFF>;
NUIStudios Schema modelliert das nicht per Ad-hoc-String-Splitting im Rendering-Code, sondern als strukturierte, typ-eigene Eigenschaftsfelder — siehe Das Dokumentmodell.
style — kontext-abhängige BitsDasselbe Bit bedeutet je nach Control-Typ etwas anderes. Ein paar reale Beispiele:
| Bit | bei genwnd |
bei static |
bei simplebutton/button |
|---|---|---|---|
1<<1 |
KSTYLE_NOCLOSE |
KSTYLE_STRETCH_VERTICAL |
KSTYLE_BUTTON_LEFTSIDE |
Die vollständige, pro Typ transkribierte Tabelle steht in docs/NUI_FORMAT_SPEC.md §7.3 sowie im Quellcode unter Nui/Schema/CorePack/src/CorePack.cpp.
flag — global, überall gleich| Bit | Name | Bedeutung |
|---|---|---|
1<<1 |
KFLAG_NO_GET_MESSAGE |
Control erhält nie Eingabe-Nachrichten |
1<<2 |
KFLAG_GET_PASS_MESSAGE |
Erhält Nachrichten, reicht sie aber immer durch |
1<<3 |
KFLAG_CAN_DRAG |
Control ist per Maus verschiebbar |
1<<4 |
KFLAG_SINGLE_LINE |
Text wird einzeilig dargestellt (mit "…" gekürzt statt umgebrochen) |
1<<5 |
KFLAG_NO_GET_FOCUS |
Control kann keinen Tastaturfokus erhalten |
Das Original hat einige dokumentierte, historisch bedingte Parser-Eigenarten. NUIStudio übernimmt sie nicht unreflektiert, sondern korrigiert sie strukturell — jede Korrektur ist in docs/NUI_FORMAT_SPEC.md §8 als eigener, benannter Fall dokumentiert. Die wichtigsten:
genwnd muss im Original an bestimmter Position stehen → NUIStudio sucht ihn über den Typnamen, unabhängig von der Position.caption