Zpět na projekty
TUIX v0.1Alfa

Naposledy aktualizováno: 2026-05-20

InputHandler

Třída InputHandler spravuje vstup z klávesnice pro interaktivní navigaci. Je dostupná přes engine.input, poskytuje cross-platform detekci kláves a řídí stav výběru u choice komponent.

Podpora platforem

InputHandler automaticky detekuje platformu a použije vhodnou vstupní metodu:

PlatformaModulMetoda
Windowsmsvcrtmsvcrt.getch() pro neblokující čtení kláves. Šipky se detekují přes dvoubajtové sekvence (prefix 0xE0).
macOS / Linuxtermios, tty, selectPřepne terminál do raw režimu, používá select() s timeoutem 0.1 s pro neblokující čtení. Escape sekvence (\x1b[A/B/C/D) mapují na šipky.

get_key()

Low-level metoda, která čte jeden stisk klávesy. Vrací string ('up', 'down', 'left', 'right', 'enter') nebo None, pokud nebyla stisknuta žádná klávesa. Na Unixu se po každém volání uloží a obnoví nastavení terminálu.

Mapování kláves

KlávesaWindows kódUnix sekvenceNávratová hodnota
Šipka nahoru0xE0 + 'H'\x1b[A'up'
Šipka dolů0xE0 + 'P'\x1b[B'down'
Šipka doprava0xE0 + 'M'\x1b[C'right'
Šipka doleva0xE0 + 'K'\x1b[D'left'
Enter\r or \n\r or \n'enter'

listen(choices)

Hlavní input smyčka. Volá se automaticky z RenderEngine._draw_choice() po renderu choice komponenty. Běží v blokující while smyčce, dokud není stisknut Enter.

Chování navigace:

  • Šipky nahoru/dolů — pohyb mezi řádky (selected_index se resetuje na 0)
  • Šipky vlevo/vpravo — pohyb mezi tlačítky v aktuálním řádku
  • selected_row je omezeno na [0, len(choices)-1]
  • selected_index je omezeno na [0, len(choices[selected_row])-1]
  • Enter — vyčistí obrazovku, vypíše vybraný index a ukončí smyčku

Po každém stisku šipky listen() volá engine.render._refresh() pro překreslení UI s novým výběrem. Mezi pollováním kláves běží 50ms sleep (time.sleep(0.05)) pro zamezení vysoké zátěže CPU.

Stav výběru

InputHandler udržuje atributy selected_row a selected_index, které sledují aktuální pozici kurzoru. Ty se předávají do RenderEngine._refresh() a používají se v _draw_buttons() pro zvýraznění aktivního tlačítka.

Duální stavInputHandler i RenderEngine udržují vlastní selected_row / selected_index. InputHandler je zdroj pravdy a předává hodnoty RenderEnginu při každém refreshi.

Aktuální omezení

  • Podporovány jsou pouze šipky a Enter
  • Input handling má pouze typ choice
  • Neexistuje focus management pro více komponent
BudoucnostPlán: další klávesové zkratky (Escape, Tab apod.), focus a tab order pro více komponent a input handling pro text_input komponenty.