from typing import List, Optional from textual.app import ComposeResult from textual.containers import Horizontal, Vertical from textual.screen import ModalScreen from textual.widgets import Button, Label class OverwriteConfirmScreen(ModalScreen[bool]): """Dialog confirming an overwrite of protected (hard-to-regenerate) outputs.""" def __init__(self, directory: str, conflicts: Optional[List[str]] = None): super().__init__() self.directory = directory # Human-readable descriptions of the protected artifacts at risk. When # empty, falls back to a generic non-empty-directory warning. self.conflicts = conflicts or [] def compose(self) -> ComposeResult: if self.conflicts: items = "\n".join(f" • {c}" for c in self.conflicts) body = ( f"This scenario will overwrite existing, hard-to-regenerate " f"outputs in:\n[dim]{self.directory}[/dim]\n\n{items}\n\nProceed?" ) else: body = ( f"The output directory is not empty:\n[dim]{self.directory}[/dim]" "\n\nProceeding will likely overwrite existing experiment data." ) with Vertical(id="dialog"): yield Label("[bold red]WARNING[/bold red]") yield Label(body, id="warning_label") with Horizontal(id="dialog_buttons"): yield Button("Cancel", variant="primary", id="btn_cancel") yield Button("Overwrite", variant="error", id="btn_proceed") def on_button_pressed(self, event: Button.Pressed) -> None: if event.button.id == "btn_proceed": self.dismiss(True) else: self.dismiss(False)