NUIStudio ist konsequent in kleine, einseitig abhängige statische Bibliotheken zerlegt. Jedes Modul unter src/ baut als eigenes Ziel mit eigenem Testziel — kein Modul greift auf die internen Details eines anderen zu, und reine CPU-Logik (Parsing, Layout-Mathematik) ist bewusst frei von jeder GPU-Abhängigkeit, damit sie ganz ohne Grafikkarte testbar bleibt.
| Modul | Bibliotheksziel | Aufgabe |
|---|---|---|
Core |
nui_core |
Grundtypen: RectI, ColorRGBA, Signal<T>, String-Hilfsfunktionen (inkl. CP949↔UTF-8) |
Nui/Model |
nui_model |
Dokumentmodell: NuiDocument, NuiNode, PropertyEntry, ControlTypeRegistry |
Nui/Parser |
nui_parser |
.nui-Text → NuiDocument |
Nui/Serializer |
nui_serializer |
NuiDocument → .nui-Text |
Nui/Validation |
nui_validation |
Diagnose-/Validierungslogik |
Nui/Resources |
nui_resources |
.spr-Sprite-Animations-Parser, ResourceResolver (Datei-Auflösung nach Basisname) |
Nui/Text |
nui_text |
Caption-Tag-Parser und Zeilenumbruch-/Ausrichtungs-Layout — keine GPU-Abhängigkeit |
Nui/Schema/CorePack |
nui_schema_core |
Allgemeine Steuerelement-Typen (siehe Steuerelemente-Referenz) |
Extensions/RappelzPack |
nui_ext_rappelz |
Spielspezifische Steuerelement-Typen, per CMake-Option abschaltbar |
Renderer/DX12 |
nui_renderer_dx12 |
Device, SpriteBatch, TextureAtlas, N-Slice-Layout |
Renderer/Text |
nui_renderer_text |
DirectWrite-Font-Laden, Glyph-Rasterung, Glyph-Atlas |
Undo / Selection / Clipboard |
je eigenes Ziel | Bearbeitungs-Infrastruktur |
Editor/Session |
editor_session |
DocumentContext — bindet Dokument, Undo-Stack und Auswahl ohne globalen Zustand zusammen |
Editor/Canvas |
editor_canvas |
Rendering + Hit-Testing des Dokuments (ImGui-unabhängig testbar) |
Editor/Hierarchy / Inspector / Assets / Panels |
je eigenes Ziel | Die eigentlichen Editor-Panels |
Editor/App |
ausführbare Datei NUIStudio.exe |
Fenster, DX12-Swapchain, ImGui-Anbindung, Hauptschleife |
Im Original-Editor sind Parser und Speicherpfad zwei komplett unabhängige, handgeschriebene Implementierungen — mit nachweisbarem Datenverlust als Folge. NUIStudio hat stattdessen einen Codec pro PropertyType, den sowohl Parser als auch Serializer verwenden. Ein zweiter, abweichender String-Builder kann strukturell gar nicht mehr entstehen.
Der Parser sammelt zunächst alle begin ... end-Blöcke und verarbeitet danach jeden unabhängig. Eine fehlerhafte Zeile erzeugt eine auf diesen einen Block begrenzte Diagnosemeldung — der Rohtext bleibt für das Round-Tripping erhalten — statt die komplette Datei zu verwerfen.
Jede PropertyEntry trägt sowohl den Originaltext als auch (falls vom Schema erkannt) einen typisierten Wert. Unbekannte Schlüssel werden als reine Rohtext-Einträge in derselben, originalgetreu geordneten Liste gespeichert wie bekannte — das ist der konkrete Mechanismus hinter "Unknown Data Preservation". Beim Speichern wird originalRawText unverändert übernommen, außer der Nutzer hat den Wert tatsächlich bearbeitet.
Im .nui-Format bedeutet z. B. Bit 1<<1 in der style-Eigenschaft je nach Control-Typ etwas völlig anderes — bestätigt direkt im Original-Quellcode:
| Control-Typ | Bit 1<<1 bedeutet... |
|---|---|
genwnd |
KSTYLE_NOCLOSE |
static |
KSTYLE_STRETCH_VERTICAL |
simplebutton |
KSTYLE_BUTTON_LEFTSIDE |
NUIStudios ControlTypeRegistry löst das, indem jeder Control-Typ seine eigene BitflagTable für style besitzt (siehe Nui/Schema/CorePack/src/CorePack.cpp), statt eines global geteilten Enums. flag und anchor sind dagegen im Original tatsächlich über alle Typen hinweg identisch — auch das ist als gewöhnliche, aber gemeinsame Tabelle modelliert, nicht als Sonderfall.
Das historische Referenzwerkzeug ("JTool") wurde ausschließlich gelesen, um Format- und Rendering-Entscheidungen zu verifizieren — nie verändert, nie mitgeliefert:
cmake/CheckNoJToolDependency.cmake) schlägt den Build fehl, sobald ein Pfadverweis darauf im Quellbaum auftaucht.Jede nicht offensichtliche Verhaltensentscheidung in diesem Projekt — z. B. "warum genau dieses Bit diese Bedeutung hat" oder "warum ein Button den rect-Wert ignoriert" — wurde durch tatsächliches Lesen des Original-Quellcodes (Datei- und Zeilenangabe) bestätigt, nicht durch Plausibilitätsannahmen.