"""Paso 6: refinamiento manual (Sprint 2). En Sprint 1 era placeholder. En Sprint 2 permite reasignar ubicaciones de equipos y editar tag_prefix con una vista preview de la silueta. """ from __future__ import annotations from PySide6.QtWidgets import ( QLabel, QListWidget, QVBoxLayout, QWidget, QWizardPage, ) from vmssailor.studio.theme import C_FOG, mono_font, ui_font class Step06Refinement(QWizardPage): """Muestra resumen de equipos aceptados con preview textual.""" def __init__(self, parent: QWidget | None = None) -> None: super().__init__(parent) self.setTitle("Paso 6 · Refinamiento") self.setSubTitle( "Revisa los equipos finales antes de generar topología. " "El editor visual completo viene en Sprint 3." ) layout = QVBoxLayout(self) layout.setSpacing(12) self._list = QListWidget() self._list.setFont(mono_font(10)) layout.addWidget(self._list, 1) # Stats self._stats = QLabel("Cargando…") self._stats.setStyleSheet(f"color: {C_FOG};") self._stats.setFont(ui_font(10)) layout.addWidget(self._stats) def initializePage(self) -> None: from vmssailor.studio.wizard.wizard import F_PROPOSALS proposals = self.field(F_PROPOSALS) or [] self._list.clear() by_system: dict[str, int] = {} for p in proposals: self._list.addItem( f"{p.system_id.value:20s} {p.tag_prefix:14s} " f"{p.model_ref:30s} @ x_pp={p.location_x_pp:.2f}m y_cl={p.location_y_cl:+.2f}m" ) by_system[p.system_id.value] = by_system.get(p.system_id.value, 0) + 1 n = len(proposals) groups = ", ".join(f"{k}: {v}" for k, v in sorted(by_system.items())) self._stats.setText( f"{n} equipos aceptados · {groups}" if n else "Sin equipos aceptados. Vuelve atrás y selecciona al menos uno." )