Viewporty a virtuální prostor obsahu
V TUIX v0.6 mohou widgety fungovat jako vlastníci viewportu, kteří udržují virtuální souřadnicový systém větší než fyzická obrazovka terminálu. Kompozitor, geometry resolver, ořezávací engine a směrovač hitmapy nativně rozumí virtuálním rozměrům obsahu, offsetům posouvání a vnitřním insetům.
Prostor obrazovky vs prostor obsahu
Běžné widgety počítají svoji pozici a rozměry jako zlomky velikosti terminálu. Vlastníci viewportu (jako `ScrollContainer`, `ListView`, `TextArea` a `Dialog`) vytvářejí virtuální prostor obsahu měřený v absolutních buňkových souřadnicích `(content_x, content_y, content_w, content_h)`.
| Prostor souřadnic | Jednotky | Použití |
|---|---|---|
| Screen / Terminal Space | Floating-point fractions (0.0 to 1.0) | Proporcionální layout, kořenové kontejnery scén, split panely a mřížky. |
| Virtual Content Space | Integer cell coordinates (x, y, w, h) | Virtuální rolovací seznamy, editace víceřádkových dokumentů, canvas grafy a herní světy. |
Nativní viewport protokol
Nativní builder se stane vlastníkem viewportu implementací tří klíčových callbacků ve svém deskriptoru `TuixBuilder`: 1. `get_viewport_offset`: Vrací aktuální posun `(offset_x, offset_y)`. 2. `get_viewport_insets`: Vrací okraje rámečku a titulku `(left, top, right, bottom)`. 3. `get_viewport_content_size`: Vrací celkové virtuální rozměry `(content_w, content_h)`.
Ořezávání viewportu a translace hitmapy
Během kompozice scény jsou potomkovské buffery umístěné mimo viditelný obdélník viewportu automaticky oříznuty na úrovni C. Při události myši směrovač hitmapy transformuje souřadnice obrazovky terminálu přes offset viewportu, takže interaktivní potomci obdrží kliknutí ve svém lokálním prostoru obsahu.
from tuix.core import object as objects, content_builder, viewport
# Create a scroll container viewport
uid = objects.create_object(content_builder.SCROLL_CONTAINER, b'Main', 0.8, 0.6, 0.1, 0.1)
scroll = objects.get_object_by_uid(uid)
# Configure virtual canvas: 200 columns by 500 rows
objects.tuix_scroll_container_set_content_size(scroll, 200, 500)
objects.tuix_scroll_container_set_offset(scroll, 0, 50)
# Query viewport properties via modular viewport package
is_vp = viewport.tuix_object_is_viewport(scroll)
offset = viewport.tuix_object_get_viewport_offset(scroll)
size = viewport.tuix_object_get_viewport_content_size(scroll)