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

Оба диалога наследуются от 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
+22 -4
View File
@@ -283,6 +283,24 @@ class DumpList(FilterList):
# --------------------------------------------------------------------------- модалки
# Стрелки как способ ходить по полям диалога: Tab знают не все, а мышь в консоли не всегда
# под рукой. Без priority — внутри Input стрелки вверх/вниз свободны и всплывают сюда сами.
FORM_NAV = [
Binding("down", "walk(1)", "ниже", show=False),
Binding("up", "walk(-1)", "выше", show=False),
]
class FormScreen(ModalScreen):
"""Диалог, по полям которого ходят стрелками: у Screen нет готового action для фокуса."""
def action_walk(self, step: int) -> None:
if step > 0:
self.focus_next()
else:
self.focus_previous()
class PasswordModal(ModalScreen):
"""getpass под запущенным Textual невозможен: пароль спрашивается только отсюда."""
@@ -310,11 +328,11 @@ class PasswordModal(ModalScreen):
self.dismiss(None)
class ConfirmModal(ModalScreen):
class ConfirmModal(FormScreen):
"""Последний экран перед деструктивной операцией: имя базы, режим и прямая формулировка."""
BINDINGS = [Binding("escape", "cancel", "отмена"),
Binding("ctrl+enter", "start", "начать", priority=True)]
Binding("ctrl+enter", "start", "начать", priority=True), *FORM_NAV]
TITLES = {"sync": "Dump + Restore", "dump": "Dump", "restore": "Restore"}
@@ -391,7 +409,7 @@ def _split_csv(text: str) -> list:
return [part.strip() for part in text.split(",") if part.strip()]
class DbOpModal(ModalScreen):
class DbOpModal(FormScreen):
"""Что делаем с выбранной базой: параметры дампа и галочка автоподнятия локально.
Заменяет собой выбор действия: снятый флаг — просто dump, поднятый — dump + restore.
@@ -399,7 +417,7 @@ class DbOpModal(ModalScreen):
"""
BINDINGS = [Binding("escape", "cancel", "отмена"),
Binding("ctrl+enter", "start", "начать", priority=True)]
Binding("ctrl+enter", "start", "начать", priority=True), *FORM_NAV]
def __init__(self, dbs: list, cfg: dict, defaults: dict) -> None:
super().__init__()