Inhaltsverzeichnis
TUI razvoj
Pregled razvoja terminalskega uporabniškega vmesnika (TUI) za WvdS FPC RAD Studio.
TUI izrisovanje v WvdS dosega kakovost podobno GUI: brez utripanja, pravilna podpora Unicode, tematizacija, virtualizacija.
Kaj je TUI?
Terminal User Interface (TUI) omogoča grafične vmesnike v terminalu:
- Tekstovna predstavitev - Znaki namesto slikovnih pik
- Medplatformno - Deluje na Windows Terminal, WezTerm, iTerm2, Linux Console
- Varčno z viri - Idealno za strežnike, SSH, kontejnerje
- Dostopno - Združljivo z bralniki zaslona
Kdaj uporabiti TUI
| Primer uporabe | Priporočeno |
|---|---|
| Administracija strežnikov | TUI |
| SSH orodja | TUI |
| Kontejnerji/Docker | TUI |
| CI/CD cevovodi | TUI |
| Namizna aplikacija z GUI | Desktop (LCL) |
| Spletna aplikacija | Web (pas2js) |
| Oboje (strežnik + namizje) | TUI + Desktop |
WVDS TUI standard
WVDS TUI standard se zgleduje po Ratatui kakovosti ali boljši:
Značilnosti kakovosti
| Značilnost | Opis |
|---|---|
| Brez utripanja | Dvojno medpomnenje, diferenčno izpiranje |
| Pravilna podpora Unicode | Široki znaki, emoji, kurzor zaveden grafemov |
| Tematizacija | Žetoni slogov, plastenje stanj |
| Virtualizacija | Učinkovito izrisovanje velikih količin podatkov |
| Odzivnost | Sidranje kot privzeto, stabilno ob spremembi velikosti |
| Podpora slik | Kitty/Sixel z nadomestno rešitvijo |
Pregled arhitekture
┌─────────────────────────────────────────────────────────────┐ │ PXAML (Markup) │ ├─────────────────────────────────────────────────────────────┤ │ Control Model (TWvdS*) - Ciljno neodvisen │ ├─────────────────────────────────────────────────────────────┤ │ TUI Renderer - Ciljno specifičen │ ├─────────────────────────────────────────────────────────────┤ │ Render Surface → CellBuffer → DiffEngine │ ├─────────────────────────────────────────────────────────────┤ │ Terminal IO (ANSI Escape Sequences) │ └─────────────────────────────────────────────────────────────┘
Ključni koncepti
Ciljno neodvisni modeli
Modeli kontrol ne vsebujejo nobene terminalsko specifične logike:
(* PRAVILNO - Ciljno neodvisno *) TWvdSButton = class(TWvdSControl) private FCaption: string; FOnClick: TNotifyEvent; public property Caption: string read FCaption write SetCaption; property OnClick: TNotifyEvent read FOnClick write FOnClick; end; (* PREPOVEDANO - Terminalsko specifično v modelu *) TWvdSButton = class(TWvdSControl) procedure WriteAnsiSequence; (* PREPOVEDANO! *) end;
Ciljno specifični izrisovalniki
Izrisovalniki rišejo model v 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;
Sidranje kot privzeto
Vsaka kontrola ima privzeto omogočeno sidranje:
Anchors: Left, Top, Right, Bottom Privzeto: Left+Top (stabilna pozicija) Left+Right: Širina se raztegne s staršem Top+Bottom: Višina se raztegne s staršem Vsa štiri: Pravokotnik se raztegne v obe smeri
Dokumentacija za TUI
| Dokument | Vsebina |
|---|---|
| TUI Engine | CellBuffer, DiffEngine, zmogljivosti terminala |
| TUI Controls | Implementacija kontrol, fokus, vnos |
| TUI Layout | Sidranje, odzivnost, prelomne točke |
Hiter začetek: Ustvarjanje TUI kontrole
1. Enota modela (ciljno neodvisna)
unit WvdS.UI.Controls.MyControl; type TWvdSMyControl = class(TWvdSControl) private FValue: string; public property Value: string read FValue write SetValue; end;
2. Enota TUI izrisovalnika
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. Manifest paketa
{ "id": "mycontrol", "renderers": { "tui": { "unit": "WvdS.UI.TUI.Renderers.MyControl", "class": "TWvdSTUIMyControlRenderer" } }, "targetCaps": { "requires": ["keyboard"], "optional": ["mouse"] } }
Preverjanje
Vsaka TUI implementacija mora biti preverjena:
[ ] Brez utripanja pri ponavljajočem se ponovnem izrisovanju [ ] Sprememba velikosti proizvede stabilen razpored [ ] Kazalec TextEdit je stabilen pri širokih/kombiniranih znakih [ ] Table/List izrisuje 10k vrstic z gladkim drsenjem [ ] Slike se pravilno obnašajo glede na TerminalCaps [ ] Fokus ostane stabilen skozi prerazporeditev
Glejte tudi
Zuletzt geändert: dne 29.01.2026 ob 22:24