====== 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|TUI Engine]] | CellBuffer, DiffEngine, Terminal Capabilities |
| [[.:tui-controls|TUI Controls]] | Implementacija Controla, Focus, Input |
| [[.:tui-layout|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 =====
* [[.:tui-engine|TUI Engine]]
* [[.:tui-controls|TUI Controls]]
* [[.:tui-layout|TUI Layout]]
* [[.:targets|Build-Targets]]
* [[.:control-entwicklung|Razvoj Controla]]