====== 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|TUI Engine]] | CellBuffer, DiffEngine, zmogljivosti terminala | | [[.:tui-controls|TUI Controls]] | Implementacija kontrol, fokus, vnos | | [[.:tui-layout|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 ===== * [[.:tui-engine|TUI Engine]] * [[.:tui-controls|TUI Controls]] * [[.:tui-layout|TUI Layout]] * [[.:targets|Gradbeni cilji]] * [[.:control-entwicklung|Razvoj kontrol]]