Inhaltsverzeichnis
TUI-Entwicklung
Übersicht der Terminal UI (TUI) Entwicklung für WvdS FPC RAD Studio.
TUI-Rendering in WvdS erreicht GUI-ähnliche Qualität: flicker-free, Unicode-korrekt, themeable, virtualisiert.
Was ist TUI?
Terminal User Interface (TUI) ermöglicht grafische Oberflächen im Terminal:
- Textbasierte Darstellung - Zeichen statt Pixel
- Cross-Platform - Läuft auf Windows Terminal, WezTerm, iTerm2, Linux Console
- Ressourcenschonend - Ideal für Server, SSH, Container
- Barrierearm - Screenreader-kompatibel
Wann TUI verwenden
| Anwendungsfall | Empfohlen |
|---|---|
| Server-Administration | TUI |
| SSH-basierte Tools | TUI |
| Container/Docker | TUI |
| CI/CD Pipelines | TUI |
| Desktop-Anwendung mit GUI | Desktop (LCL) |
| Web-Anwendung | Web (pas2js) |
| Beides (Server + Desktop) | TUI + Desktop |
WVDS TUI-Standard
Der WVDS TUI-Standard orientiert sich an Ratatui-Qualität oder besser:
Qualitätsmerkmale
| Merkmal | Beschreibung |
|---|---|
| Flicker-free | Double-Buffering, Diff-based Flush |
| Unicode-korrekt | Wide Chars, Emoji, Grapheme-aware Cursor |
| Themeable | Style Tokens, State Layering |
| Virtualisiert | Große Datenmengen effizient rendern |
| Responsive | Anchoring-first Layout, Resize-stabil |
| Image-fähig | Kitty/Sixel mit Fallback |
Architektur-Überblick
┌─────────────────────────────────────────────────────────────┐ │ PXAML (Markup) │ ├─────────────────────────────────────────────────────────────┤ │ Control Model (TWvdS*) - Target-neutral │ ├─────────────────────────────────────────────────────────────┤ │ TUI Renderer - Target-spezifisch │ ├─────────────────────────────────────────────────────────────┤ │ Render Surface → CellBuffer → DiffEngine │ ├─────────────────────────────────────────────────────────────┤ │ Terminal IO (ANSI Escape Sequences) │ └─────────────────────────────────────────────────────────────┘
Kernkonzepte
Target-neutrale Models
Control-Models enthalten keine Terminal-spezifische Logik:
(* KORREKT - 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; (* VERBOTEN - Terminal-spezifisch im Model *) TWvdSButton = class(TWvdSControl) procedure WriteAnsiSequence; (* VERBOTEN! *) end;
Target-spezifische Renderer
Renderer zeichnen das Model in den 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 als Default
Jedes Control hat standardmäßig Anchoring aktiviert:
Anchors: Left, Top, Right, Bottom Default: Left+Top (stabile Position) Left+Right: Breite dehnt sich mit Parent Top+Bottom: Höhe dehnt sich mit Parent Alle vier: Rect dehnt sich in beide Richtungen
Dokumentation für TUI
| Dokument | Inhalt |
|---|---|
| TUI Engine | CellBuffer, DiffEngine, Terminal Capabilities |
| TUI Controls | Control-Implementierung, Focus, Input |
| TUI Layout | Anchoring, Responsive, Breakpoints |
Schnellstart: TUI Control erstellen
1. Model Unit (target-neutral)
unit WvdS.UI.Controls.MyControl; type TWvdSMyControl = class(TWvdSControl) private FValue: string; public property Value: string read FValue write SetValue; end;
2. TUI Renderer Unit
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"] } }
Verifikation
Jede TUI-Implementierung muss verifiziert werden:
[ ] Kein Flicker bei wiederholtem Repaint [ ] Resize produziert stabiles Layout [ ] TextEdit Caret ist stabil bei Wide/Combining Chars [ ] Table/List rendert 10k Rows mit smooth Scroll [ ] Images verhalten sich korrekt per TerminalCaps [ ] Focus bleibt stabil durch Reflow
Siehe auch
Zuletzt geändert: den 29.01.2026 um 15:13