screens.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. from typing import List, Optional
  2. from textual.app import ComposeResult
  3. from textual.containers import Horizontal, Vertical
  4. from textual.screen import ModalScreen
  5. from textual.widgets import Button, Label
  6. class OverwriteConfirmScreen(ModalScreen[bool]):
  7. """Dialog confirming an overwrite of protected (hard-to-regenerate) outputs."""
  8. def __init__(self, directory: str, conflicts: Optional[List[str]] = None):
  9. super().__init__()
  10. self.directory = directory
  11. # Human-readable descriptions of the protected artifacts at risk. When
  12. # empty, falls back to a generic non-empty-directory warning.
  13. self.conflicts = conflicts or []
  14. def compose(self) -> ComposeResult:
  15. if self.conflicts:
  16. items = "\n".join(f" • {c}" for c in self.conflicts)
  17. body = (
  18. f"This scenario will overwrite existing, hard-to-regenerate "
  19. f"outputs in:\n[dim]{self.directory}[/dim]\n\n{items}\n\nProceed?"
  20. )
  21. else:
  22. body = (
  23. f"The output directory is not empty:\n[dim]{self.directory}[/dim]"
  24. "\n\nProceeding will likely overwrite existing experiment data."
  25. )
  26. with Vertical(id="dialog"):
  27. yield Label("[bold red]WARNING[/bold red]")
  28. yield Label(body, id="warning_label")
  29. with Horizontal(id="dialog_buttons"):
  30. yield Button("Cancel", variant="primary", id="btn_cancel")
  31. yield Button("Overwrite", variant="error", id="btn_proceed")
  32. def on_button_pressed(self, event: Button.Pressed) -> None:
  33. if event.button.id == "btn_proceed":
  34. self.dismiss(True)
  35. else:
  36. self.dismiss(False)