# -*- coding: utf-8 -*- """ Trainer SubView: Validate (F5). Fuehrt eine Validierung durch und zeigt Ergebnisse: Fehler, Warnungen und GPU-Informationen. """ from __future__ import annotations from textual.app import ComposeResult from textual.containers import Vertical from textual.widgets import Static, Button from trixy_core.tui.views.base import MainView from trixy_core.tui.widgets.status_table import StatusTable class TrainerValidateView(MainView): """F5 im Trainer-Kontext: Validierung.""" TITLE = "Validierung" VIEW_ID = "trainer_validate" def __init__(self, **kwargs) -> None: super().__init__(**kwargs) self._trainer_data: dict = {} def set_trainer(self, trainer_data: dict) -> None: """Setzt die Trainer-Basisdaten.""" self._trainer_data = trainer_data def compose(self) -> ComposeResult: with Vertical(classes="trainer-section"): yield Static( "[bold]Trainings-Validierung[/bold]\n" "Prueft Einstellungen, Dataset und GPU-Verfuegbarkeit.", classes="trainer-section-header", ) yield Button("Validierung starten", id="trainer-validate-btn", variant="primary") with Vertical(id="trainer-validate-result", classes="trainer-section"): yield Static("", id="trainer-validate-status") yield StatusTable(id="trainer-validate-gpu") yield Static("", id="trainer-validate-errors") yield Static("", id="trainer-validate-warnings") async def on_activate(self) -> None: """Zuruecksetzen bei Aktivierung.""" self.query_one("#trainer-validate-status", Static).update("") self.query_one("#trainer-validate-errors", Static).update("") self.query_one("#trainer-validate-warnings", Static).update("") self.query_one("#trainer-validate-gpu", StatusTable).update_data([]) async def on_button_pressed(self, event: Button.Pressed) -> None: """Validierung starten.""" if event.button.id != "trainer-validate-btn": return await self._run_validation() async def _run_validation(self) -> None: """Fuehrt die Validierung durch.""" status = self.query_one("#trainer-validate-status", Static) errors_widget = self.query_one("#trainer-validate-errors", Static) warnings_widget = self.query_one("#trainer-validate-warnings", Static) gpu_table = self.query_one("#trainer-validate-gpu", StatusTable) if not self.connection: status.update("[red]Keine Verbindung[/red]") return trainer_id = self._trainer_data.get("trainer_id", "") if not trainer_id: status.update("[red]Kein Trainer ausgewaehlt[/red]") return # Erst Settings speichern (falls Settings-View Aenderungen hat) settings_view = self.app._view_map.get("trainer_settings") # type: ignore[attr-defined] if settings_view and hasattr(settings_view, "collect_settings"): settings = settings_view.collect_settings() if settings: await self.connection.write_trainer_settings(trainer_id, settings) status.update("[yellow]Validierung laeuft...[/yellow]") try: result = await self.connection.validate_trainer(trainer_id) except Exception as e: status.update(f"[red]Fehler: {e}[/red]") return if result is None: status.update("[red]Keine Antwort vom Server[/red]") return # Ergebnis anzeigen if result.valid: status.update("[green bold]Validierung erfolgreich[/green bold]") else: status.update("[red bold]Validierung fehlgeschlagen[/red bold]") # Fehler if result.errors: lines = "\n".join(f" [red]\u2718[/red] {e}" for e in result.errors) errors_widget.update(f"[bold]Fehler:[/bold]\n{lines}") else: errors_widget.update("") # Warnungen if result.warnings: lines = "\n".join(f" [yellow]\u26A0[/yellow] {w}" for w in result.warnings) warnings_widget.update(f"[bold]Warnungen:[/bold]\n{lines}") else: warnings_widget.update("") # GPU-Info gpu_rows = [] if result.gpu_available: gpu_rows.append(("GPU", f"[green]{result.gpu_name}[/green]")) gpu_rows.append(("GPU-Speicher", f"{result.gpu_memory_mb:.0f} MB")) else: gpu_rows.append(("GPU", "[yellow]Nicht verfuegbar[/yellow]")) gpu_table.update_data(gpu_rows)