from PyQt6.QtWidgets import ( QDialog, QVBoxLayout, QHBoxLayout, QLabel, QDialogButtonBox, QFrame, ) from PyQt6.QtCore import Qt from app.searchable_combo import SearchableCombo class BulkDistribDialog(QDialog): """ Dialog per il cambio distributore multiplo. Mostra quanti prodotti verranno modificati e permette di scegliere il nuovo distributore. """ def __init__(self, count: int, distributori: list[tuple[str, str]], parent=None): super().__init__(parent) self.setWindowTitle("Cambia distributore") self.setMinimumWidth(480) self.resize(500, 380) self.setModal(True) self._distributori = distributori self._combo: SearchableCombo | None = None self._init_ui(count) def _init_ui(self, count: int): layout = QVBoxLayout(self) layout.setSpacing(12) # Campo distributore IN CIMA — il popup si apre verso il basso nello spazio libero row = QHBoxLayout() row.addWidget(QLabel("Nuovo distributore:")) self._combo = SearchableCombo() self._combo.set_items(self._distributori) self._combo.setPlaceholderText("Digita almeno 3 lettere...") self._combo.setMinimumWidth(280) row.addWidget(self._combo, stretch=1) layout.addLayout(row) # Spazio vuoto dove il popup si espande layout.addStretch() sep = QFrame() sep.setFrameShape(QFrame.Shape.HLine) sep.setFrameShadow(QFrame.Shadow.Sunken) layout.addWidget(sep) info = QLabel( f"Stai per modificare il distributore di {count} prodott{'o' if count == 1 else 'i'} selezionat{'o' if count == 1 else 'i'}." ) info.setTextFormat(Qt.TextFormat.RichText) info.setWordWrap(True) layout.addWidget(info) buttons = QDialogButtonBox( QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel ) buttons.button(QDialogButtonBox.StandardButton.Ok).setText("Applica") buttons.button(QDialogButtonBox.StandardButton.Cancel).setText("Annulla") buttons.accepted.connect(self._on_accept) buttons.rejected.connect(self.reject) layout.addWidget(buttons) def _on_accept(self): sel_id = self._combo.selected_id() sel_name = self._combo.text().strip() if not sel_name: from PyQt6.QtWidgets import QMessageBox QMessageBox.warning(self, "Attenzione", "Seleziona un distributore.") return if not sel_id: # Cerca corrispondenza esatta nella lista match = next((i for n, i in self._distributori if n.lower() == sel_name.lower()), None) if not match: from PyQt6.QtWidgets import QMessageBox QMessageBox.warning(self, "Attenzione", "Distributore non trovato. Digita almeno 3 lettere e scegli dal popup.") return self._combo._selected_id = match self.accept() def result_distributore(self) -> tuple[str, str]: """Restituisce (nome, id) del distributore scelto.""" return self._combo.text().strip(), self._combo.selected_id()