Inhaltsverzeichnis
Sviluppo TUI
Panoramica dello sviluppo Terminal UI (TUI) per WvdS FPC RAD Studio.
Il rendering TUI in WvdS raggiunge qualità simile alla GUI: flicker-free, Unicode corretto, themeable, virtualizzato.
Cos'è TUI?
Terminal User Interface (TUI) permette interfacce grafiche nel terminale:
- Rappresentazione testuale - Caratteri invece di pixel
- Cross-platform - Funziona su Windows Terminal, WezTerm, iTerm2, Linux Console
- Efficiente - Ideale per server, SSH, container
- Accessibile - Compatibile con screen reader
Quando usare TUI
| Caso d'uso | Raccomandato |
|---|---|
| Amministrazione server | TUI |
| Tool basati su SSH | TUI |
| Container/Docker | TUI |
| Pipeline CI/CD | TUI |
| Applicazione desktop con GUI | Desktop (LCL) |
| Applicazione web | Web (pas2js) |
| Entrambi (server + desktop) | TUI + Desktop |
Standard WVDS TUI
Lo standard WVDS TUI si orienta alla qualità Ratatui o superiore:
Caratteristiche qualità
| Caratteristica | Descrizione |
|---|---|
| Flicker-free | Double buffering, flush basato su diff |
| Unicode corretto | Wide char, emoji, cursor grapheme-aware |
| Themeable | Token di stile, layering stati |
| Virtualizzato | Rendering efficiente grandi quantità dati |
| Responsive | Layout anchoring-first, stabile al resize |
| Supporto immagini | Kitty/Sixel con fallback |
Panoramica architettura
┌─────────────────────────────────────────────────────────────┐ │ PXAML (Markup) │ ├─────────────────────────────────────────────────────────────┤ │ Control Model (TWvdS*) - Target-neutral │ ├─────────────────────────────────────────────────────────────┤ │ TUI Renderer - Target-specific │ ├─────────────────────────────────────────────────────────────┤ │ Render Surface → CellBuffer → DiffEngine │ ├─────────────────────────────────────────────────────────────┤ │ Terminal IO (ANSI Escape Sequences) │ └─────────────────────────────────────────────────────────────┘
Concetti fondamentali
Model target-neutrali
I model dei controlli NON contengono logica specifica del terminale:
(* CORRETTO - Target-neutral *) TWvdSButton = class(TWvdSControl) private FCaption: string; FOnClick: TNotifyEvent; public property Caption: string read FCaption write SetCaption; property OnClick: TNotifyEvent read FOnClick write FOnClick; end; (* VIETATO - Specifico terminale nel model *) TWvdSButton = class(TWvdSControl) procedure WriteAnsiSequence; (* VIETATO! *) end;
Renderer target-specifici
I renderer disegnano il model nel CellBuffer:
TWvdSTUIButtonRenderer = class(TWvdSTUIRenderer) public procedure Measure(AControl: TWvdSControl; AAvail: TSize): TSize; override; procedure Paint(AControl: TWvdSControl; ASurface: TRenderSurface); override; function HandleInput(AControl: TWvdSControl; AEvent: TInputEvent): Boolean; override; end;
Anchoring come default
Ogni controllo ha l'anchoring attivato per default:
Anchors: Left, Top, Right, Bottom Default: Left+Top (posizione stabile) Left+Right: larghezza si espande con il parent Top+Bottom: altezza si espande con il parent Tutti e quattro: rect si espande in entrambe le direzioni
Documentazione TUI
| Documento | Contenuto |
|---|---|
| TUI Engine | CellBuffer, DiffEngine, capability terminale |
| Controlli TUI | Implementazione controlli, focus, input |
| Layout TUI | Anchoring, responsive, breakpoint |
Quickstart: Creare un controllo TUI
1. Unit Model (target-neutral)
unit WvdS.UI.Controls.MyControl; type TWvdSMyControl = class(TWvdSControl) private FValue: string; public property Value: string read FValue write SetValue; end;
2. Unit TUI Renderer
unit WvdS.UI.TUI.Renderers.MyControl; type TWvdSTUIMyControlRenderer = class(TWvdSTUIRenderer) public procedure Measure(AControl: TWvdSControl; AAvail: TSize): TSize; override; procedure Paint(AControl: TWvdSControl; ASurface: TRenderSurface); override; end;
3. Pack Manifest
{ "id": "mycontrol", "renderers": { "tui": { "unit": "WvdS.UI.TUI.Renderers.MyControl", "class": "TWvdSTUIMyControlRenderer" } }, "targetCaps": { "requires": ["keyboard"], "optional": ["mouse"] } }
Verifica
Ogni implementazione TUI deve essere verificata:
[ ] Nessun flicker al repaint ripetuto [ ] Resize produce layout stabile [ ] Cursore TextEdit stabile con wide/combining char [ ] Table/List renderizza 10k righe con scroll fluido [ ] Immagini si comportano correttamente per TerminalCaps [ ] Focus rimane stabile durante reflow
Vedi anche
Zuletzt geändert: il 30/01/2026 alle 01:34