Навигация стрелками по полям диалогов

Оба диалога наследуются от FormScreen с action_walk: у Screen нет
готового action_focus_next, поэтому биндинг стрелок на него молча
ничего не делал. Вверх и вниз ходят по полям, влево и вправо остаются
за курсором внутри поля ввода — биндинги намеренно без priority.
This commit is contained in:
2026-08-20 05:54:16 +03:00
parent e8fd19714a
commit 9404d1dd08
4 changed files with 65 additions and 4 deletions
+36
View File
@@ -998,3 +998,39 @@ def test_op_dialog_fits_and_keeps_buttons_visible(cfg, monkeypatch):
await pilot.press("escape")
await pilot.pause()
asyncio.run(scenario())
def test_arrows_walk_dialog_fields(cfg, monkeypatch):
"""В диалоге операции стрелки должны ходить по полям, а не только Tab."""
app = make_app(cfg, monkeypatch)
async def scenario():
async with app.run_test(size=(120, 40)) as pilot:
await settle(app, pilot)
app.dashboard.open_db_op(autorestore=True)
for _ in range(40):
await pilot.pause()
if isinstance(app.screen, tui.DbOpModal):
break
seen = []
for _ in range(6):
await pilot.press("down")
await pilot.pause()
seen.append(app.focused.id)
assert len(set(seen)) > 1, f"фокус не двигается: {seen}"
back = app.focused.id
await pilot.press("up")
await pilot.pause()
assert app.focused.id != back # вверх возвращает на предыдущее поле
# стрелки внутри поля ввода остаются за курсором: значение не должно меняться
field = app.screen.query_one("#compress", Input)
field.focus()
await pilot.pause()
await pilot.press("left", "right")
await pilot.pause()
assert field.value == "6"
await pilot.press("escape")
await pilot.pause()
asyncio.run(scenario())