Компактный диалог операции и кнопки, которые не уезжают
Пары Switch + Label заменены на Checkbox с встроенной подписью: строка вместо трёх. Поля стали однострочными, чекбоксы дампа встали в ряд, заголовок и имя базы слились в одну строку — диалог ужался с почти целого экрана до 17-18 строк на любом размере консоли. Ряд кнопок пропадал потому, что .dialog с height: auto складывал высоту детей и упирался в max-height, обрезая нижнюю строку. Теперь у диалога операции своя высота, а форма забирает остаток через height: 1fr и скроллится сама. Диалог restore приведён к тому же виду.
This commit is contained in:
+31
-3
@@ -21,7 +21,7 @@ sys.path.insert(0, str(Path(__file__).parent))
|
||||
|
||||
import pg_stand_sync as core
|
||||
import pg_stand_sync_tui as tui
|
||||
from textual.widgets import Input, Switch
|
||||
from textual.widgets import Checkbox, Collapsible, Input
|
||||
|
||||
PY = sys.executable
|
||||
DBS = [("zpas", "1284 MB"), ("zpas_arch", "312 MB"), ("zpas_test", "88 MB"),
|
||||
@@ -763,7 +763,7 @@ def test_db_dialog_carries_dump_options(cfg, monkeypatch):
|
||||
await settle(app, pilot)
|
||||
modal = await _open_db_dialog(app, pilot)
|
||||
assert isinstance(modal, tui.DbOpModal)
|
||||
modal.query_one("#schema-only", Switch).value = True
|
||||
modal.query_one("#schema-only", Checkbox).value = True
|
||||
modal.query_one("#compress", Input).value = "0"
|
||||
modal.query_one("#ex-schemas", Input).value = "audit, tmp"
|
||||
modal.action_start()
|
||||
@@ -790,7 +790,7 @@ def test_autorestore_switch_picks_operation(cfg, monkeypatch):
|
||||
async with app.run_test(size=(120, 40)) as pilot:
|
||||
await settle(app, pilot)
|
||||
modal = await _open_db_dialog(app, pilot)
|
||||
switch = modal.query_one("#autorestore", Switch)
|
||||
switch = modal.query_one("#autorestore", Checkbox)
|
||||
assert switch.value is True # главный сценарий по умолчанию
|
||||
switch.value = False
|
||||
await pilot.pause()
|
||||
@@ -970,3 +970,31 @@ def test_ru_layout_covers_every_ctrl_hotkey():
|
||||
if key.startswith("ctrl+") and len(key) == 6 and key[5].isascii():
|
||||
twin = f"ctrl+{tui.RU_LAYOUT[key[5]]}"
|
||||
assert pairs.get(twin) == action, f"нет двойника для {key}"
|
||||
|
||||
|
||||
def test_op_dialog_fits_and_keeps_buttons_visible(cfg, monkeypatch):
|
||||
"""Форма не должна выдавливать ряд кнопок за нижнюю границу диалога."""
|
||||
app = make_app(cfg, monkeypatch)
|
||||
|
||||
async def scenario():
|
||||
async with app.run_test(size=(80, 24)) 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
|
||||
modal = app.screen
|
||||
modal.query_one(Collapsible).collapsed = False # самый длинный вариант формы
|
||||
await pilot.pause()
|
||||
dialog = modal.query_one(".dialog")
|
||||
start = modal.query_one("#start")
|
||||
assert dialog.size.height <= 24
|
||||
assert start.region.height > 0
|
||||
assert dialog.region.y <= start.region.y
|
||||
assert start.region.bottom <= dialog.region.bottom
|
||||
form = modal.query_one(".form")
|
||||
assert form.virtual_size.height > form.size.height # длинное уезжает в скролл
|
||||
await pilot.press("escape")
|
||||
await pilot.pause()
|
||||
asyncio.run(scenario())
|
||||
|
||||
Reference in New Issue
Block a user