====== Pipeline PXAML ======
La pipeline PXAML trasforma il markup UI dichiarativo in interfacce utente eseguibili.
===== Panoramica =====
PXAML (Markup) → Parser → IR (JSON) → Renderer → GUI/TUI/Web
===== Fasi della pipeline =====
==== Fase 1: Parsing ====
Il parser PXAML legge il markup XML e genera un Abstract Syntax Tree (AST).
**Compiti del parser:**
* Validazione XML
* Risoluzione namespace
* Riconoscimento elementi
* Parsing attributi
* Riconoscimento binding eventi
==== Fase 2: Generazione IR ====
L'AST viene trasformato in una Intermediate Representation (IR) - un formato intermedio basato su JSON.
{
"type": "Window",
"properties": {
"Title": { "value": "Demo", "type": "string" },
"Width": { "value": 400, "type": "number" }
},
"children": [
{
"type": "Button",
"properties": {
"Content": { "value": "Click me", "type": "string" }
},
"events": {
"Click": { "handler": "OnClick" }
}
}
]
}
**Proprieta IR:**
* Indipendente dalla piattaforma
* Serializzabile (JSON)
* Differenziabile per Hot Reload
* Informazioni di tipo preservate
==== Fase 3: Risoluzione binding ====
I data binding vengono analizzati e convertiti in strutture eseguibili.
{
"type": "TextBox",
"properties": {
"Text": {
"type": "binding",
"path": "UserName",
"mode": "TwoWay"
}
}
}
==== Fase 4: Rendering ====
L'IR viene tradotto dal renderer specifico del target in elementi UI nativi.
^ Renderer ^ Output ^ Tecnologia ^
| GUI | Controlli nativi | LCL/WinAPI |
| TUI | Caratteri terminale | ANSI/VT100 |
| Web | Elementi DOM | HTML/CSS |
===== Componenti =====
==== TWvdSPxamlParser ====
type
TWvdSPxamlParser = class
public
function Parse(const ASource: string): TWvdSIRNode;
function ParseFile(const APath: string): TWvdSIRNode;
end;
==== TWvdSIRNode ====
type
TWvdSIRNode = class
NodeType: string;
Properties: TWvdSPropertyMap;
Children: TWvdSIRNodeList;
Events: TWvdSEventMap;
Bindings: TWvdSBindingList;
end;
==== TWvdSRenderer (Astratto) ====
type
TWvdSRenderer = class abstract
public
procedure Render(ARoot: TWvdSIRNode); virtual; abstract;
procedure Update(AOldRoot, ANewRoot: TWvdSIRNode); virtual; abstract;
end;
===== Hot Reload =====
La pipeline supporta l'Hot Reload tramite differenziazione IR:
1. Nuovo PXAML → Parser → Nuovo IR
2. Diff(Vecchio IR, Nuovo IR) → Lista patch
3. Renderer.ApplyPatches(Lista patch)
**Vantaggi:**
* Solo gli elementi modificati vengono aggiornati
* Lo stato viene preservato
* Iterazione rapida durante lo sviluppo
===== Gestione errori =====
^ Tipo errore ^ Fase ^ Gestione ^
| Errore sintassi XML | Parsing | Posizione + messaggio |
| Elemento sconosciuto | Parsing | Warning + fallback |
| Tipo property non valido | IR | Coercizione tipo + warning |
| Errore binding | Binding | Valore fallback |
===== Vedi anche =====
* [[.:architektur|Panoramica architettura]]
* [[.:targets|Target di build]]
* [[..:p:designer|UI Designer]]