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:
| Platforma | Modul | Metoda |
|---|---|---|
| Windows | msvcrt | msvcrt.getch() pro neblokující čtení kláves. Šipky se detekují přes dvoubajtové sekvence (prefix 0xE0). |
| macOS / Linux | termios, tty, select | Př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ávesa | Windows kód | Unix sekvence | Návratová hodnota |
|---|---|---|---|
| Šipka nahoru | 0xE0 + 'H' | \x1b[A | 'up' |
| Šipka dolů | 0xE0 + 'P' | \x1b[B | 'down' |
| Šipka doprava | 0xE0 + 'M' | \x1b[C | 'right' |
| Šipka doleva | 0xE0 + '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.
Aktuální omezení
- Podporovány jsou pouze šipky a Enter
- Input handling má pouze typ choice
- Neexistuje focus management pro více komponent