Inhaltsverzeichnis
TUI-Razvoj
Pregled razvoja Terminal UI (TUI) za WvdS FPC RAD Studio.
TUI-Rendering u WvdS postiže GUI-sličnu kvalitetu: flicker-free, Unicode-korektan, themeable, virtualiziran.
Što je TUI?
Terminal User Interface (TUI) omogućuje grafička sučelja u terminalu:
- Tekstualni prikaz - znakovi umjesto piksela
- Cross-Platform - Radi na Windows Terminal, WezTerm, iTerm2, Linux Console
- Štedi resurse - Idealno za servere, SSH, kontejnere
- Pristupačno - Kompatibilno sa screenreaderima
Kada koristiti TUI
| Slučaj korištenja | Preporučeno |
|---|---|
| Server-Administracija | TUI |
| SSH-bazirani alati | TUI |
| Container/Docker | TUI |
| CI/CD Pipelines | TUI |
| Desktop-aplikacija s GUI | Desktop (LCL) |
| Web-aplikacija | Web (pas2js) |
| Oboje (Server + Desktop) | TUI + Desktop |
WVDS TUI-Standard
WVDS TUI-Standard se orijentira na Ratatui-kvalitetu ili bolju:
Karakteristike kvalitete
| Karakteristika | Opis |
|---|---|
| Flicker-free | Double-Buffering, Diff-based Flush |
| Unicode-korektan | Wide Chars, Emoji, Grapheme-aware Cursor |
| Themeable | Style Tokens, State Layering |
| Virtualiziran | Velike količine podataka efikasno renderirati |
| Responsive | Anchoring-first Layout, Resize-stabilan |
| Image-sposoban | Kitty/Sixel s Fallbackom |
Pregled arhitekture
┌─────────────────────────────────────────────────────────────┐ │ PXAML (Markup) │ ├─────────────────────────────────────────────────────────────┤ │ Control Model (TWvdS*) - Target-neutralan │ ├─────────────────────────────────────────────────────────────┤ │ TUI Renderer - Target-specifičan │ ├─────────────────────────────────────────────────────────────┤ │ Render Surface → CellBuffer → DiffEngine │ ├─────────────────────────────────────────────────────────────┤ │ Terminal IO (ANSI Escape Sequences) │ └─────────────────────────────────────────────────────────────┘
Temeljni koncepti
Target-neutralni Modeli
Control-Modeli ne sadrže nikakvu Terminal-specifičnu logiku:
(* ISPRAVNO - Target-neutralno *) TWvdSButton = class(TWvdSControl) private FCaption: string; FOnClick: TNotifyEvent; public property Caption: string read FCaption write SetCaption; property OnClick: TNotifyEvent read FOnClick write FOnClick; end; (* ZABRANJENO - Terminal-specifično u Modelu *) TWvdSButton = class(TWvdSControl) procedure WriteAnsiSequence; (* ZABRANJENO! *) end;
Target-specifični Rendereri
Rendereri crtaju Model u 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 kao Default
Svaki Control ima standardno aktiviran Anchoring:
Anchors: Left, Top, Right, Bottom Default: Left+Top (stabilna pozicija) Left+Right: Širina se rasteže s Parentom Top+Bottom: Visina se rasteže s Parentom Sva četiri: Rect se rasteže u oba smjera
Dokumentacija za TUI
| Dokument | Sadržaj |
|---|---|
| TUI Engine | CellBuffer, DiffEngine, Terminal Capabilities |
| TUI Controls | Implementacija Controla, Focus, Input |
| TUI Layout | Anchoring, Responsive, Breakpoints |
Brzi početak: Kreiranje TUI Controla
1. Model Unit (target-neutralno)
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"] } }
Verifikacija
Svaka TUI-implementacija mora se verificirati:
[ ] Nema flickera pri ponovljenom Repaintu [ ] Resize proizvodi stabilan Layout [ ] TextEdit Caret je stabilan kod Wide/Combining Chars [ ] Table/List renderira 10k redaka s glatkim Scrollom [ ] Images se ponašaju ispravno prema TerminalCaps [ ] Focus ostaje stabilan kroz Reflow
Vidi također
Zuletzt geändert: 29.01.2026. u 22:39