====== 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|TUI Engine]] | CellBuffer, DiffEngine, capability terminale | | [[.:tui-controls|Controlli TUI]] | Implementazione controlli, focus, input | | [[.:tui-layout|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 ===== * [[.:tui-engine|TUI Engine]] * [[.:tui-controls|Controlli TUI]] * [[.:tui-layout|Layout TUI]] * [[.:targets|Target di build]] * [[.:control-entwicklung|Sviluppo controlli]]