""" Dialog di selezione funzionalità wizard per Aggancio Multiplo. Flusso: 1. WizardOptInDialog — "Vuoi usare il wizard?" (solo se pref=None) 2. FunzionalitaDialog — "Cosa vuoi fare?" """ from PyQt6.QtWidgets import ( QDialog, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QCheckBox, QFrame, ) from PyQt6.QtCore import Qt from PyQt6.QtGui import QFont # ------------------------------------------------------------------ # # Dialog 1 — opt-in wizard # # ------------------------------------------------------------------ # class WizardOptInDialog(QDialog): """Chiede se l'utente vuole usare il wizard guidato.""" def __init__(self, parent=None): super().__init__(parent) self.setWindowTitle("Aggancio Multiplo") self.setFixedWidth(380) self.setWindowFlags(self.windowFlags() & ~Qt.WindowType.WindowContextHelpButtonHint) self._use = False self._remember = False self._build_ui() def _build_ui(self): layout = QVBoxLayout(self) layout.setSpacing(16) layout.setContentsMargins(24, 20, 24, 20) title = QLabel('Vuoi usare il wizard guidato?') title.setFont(QFont('Segoe UI', 11, QFont.Weight.Bold)) title.setAlignment(Qt.AlignmentFlag.AlignCenter) layout.addWidget(title) desc = QLabel('Il wizard ti guida passo dopo passo nelle operazioni ' 'disponibili in Aggancio Multiplo.') desc.setWordWrap(True) desc.setStyleSheet('color: #555;') desc.setAlignment(Qt.AlignmentFlag.AlignCenter) layout.addWidget(desc) self._chk_remember = QCheckBox('Non chiedere più') self._chk_remember.setStyleSheet('color: #777; font-size: 11px;') layout.addWidget(self._chk_remember, alignment=Qt.AlignmentFlag.AlignCenter) # Buttons btn_layout = QHBoxLayout() btn_layout.setSpacing(10) btn_no = QPushButton('No, procedi direttamente') btn_no.setStyleSheet(_BTN_SECONDARY) btn_no.clicked.connect(self._on_no) btn_si = QPushButton('Sì, usa il wizard') btn_si.setStyleSheet(_BTN_PRIMARY) btn_si.setDefault(True) btn_si.clicked.connect(self._on_si) btn_layout.addWidget(btn_no) btn_layout.addWidget(btn_si) layout.addLayout(btn_layout) def _on_si(self): self._use = True self._remember = self._chk_remember.isChecked() self.accept() def _on_no(self): self._use = False self._remember = self._chk_remember.isChecked() self.accept() def use_wizard(self) -> bool: return self._use def remember(self) -> bool: return self._remember # ------------------------------------------------------------------ # # Dialog 2 — selezione funzionalità # # ------------------------------------------------------------------ # _FUNZIONALITA = [ ('aggancio_titoli', 'Aggancio titoli', 'Importa un listino fornitore e abbina i titoli al catalogo Mediaset', True), ('valutazioni_reti', 'Valutazioni reti', 'Importa le valutazioni restituite dalle reti sui prodotti', True), ] class FunzionalitaDialog(QDialog): """Chiede all'utente quale funzionalità di Aggancio Multiplo usare.""" def __init__(self, parent=None): super().__init__(parent) self.setWindowTitle('Cosa vuoi fare?') self.setFixedWidth(440) self.setWindowFlags(self.windowFlags() & ~Qt.WindowType.WindowContextHelpButtonHint) self._selected: str | None = None self._build_ui() def _build_ui(self): layout = QVBoxLayout(self) layout.setSpacing(10) layout.setContentsMargins(24, 20, 24, 20) title = QLabel('Cosa vuoi fare?') title.setFont(QFont('Segoe UI', 12, QFont.Weight.Bold)) layout.addWidget(title) sub = QLabel('Seleziona la funzionalità da avviare.') sub.setStyleSheet('color: #666; margin-bottom: 4px;') layout.addWidget(sub) for func_id, label, desc, enabled in _FUNZIONALITA: card = self._make_card(func_id, label, desc, enabled) layout.addWidget(card) layout.addSpacing(4) btn_layout = QHBoxLayout() btn_layout.addStretch() btn_cancel = QPushButton('Annulla') btn_cancel.setStyleSheet(_BTN_SECONDARY) btn_cancel.clicked.connect(self.reject) btn_layout.addWidget(btn_cancel) layout.addLayout(btn_layout) def _make_card(self, func_id, label, desc, enabled): card = QFrame() card.setObjectName('card') if enabled: card.setCursor(Qt.CursorShape.PointingHandCursor) base_style = ('QFrame#card { border: 1px solid #D0D0D0; border-radius: 8px; ' 'background: #FAFAFA; } ' 'QFrame#card:hover { border: 1px solid #5C6BC0; background: #F0F0FF; }') else: base_style = ('QFrame#card { border: 1px solid #E0E0E0; border-radius: 8px; ' 'background: #F5F5F5; }') card.setStyleSheet(base_style) row = QHBoxLayout(card) row.setContentsMargins(14, 12, 14, 12) row.setSpacing(12) text_col = QVBoxLayout() text_col.setSpacing(2) lbl = QLabel(label) lbl.setFont(QFont('Segoe UI', 10, QFont.Weight.Bold if enabled else QFont.Weight.Normal)) if not enabled: lbl.setStyleSheet('color: #AAA;') text_col.addWidget(lbl) desc_lbl = QLabel(desc) desc_lbl.setStyleSheet('color: #888; font-size: 11px;') desc_lbl.setWordWrap(True) text_col.addWidget(desc_lbl) if not enabled: soon = QLabel('Prossimamente') soon.setStyleSheet( 'color: #999; font-size: 10px; font-style: italic;') text_col.addWidget(soon) row.addLayout(text_col, 1) if enabled: arrow = QLabel('›') arrow.setFont(QFont('Segoe UI', 16)) arrow.setStyleSheet('color: #5C6BC0;') row.addWidget(arrow) # Click handler via mousePressEvent override _id = func_id _dlg = self def _press(_, bound_id=_id): _dlg._selected = bound_id _dlg.accept() card.mousePressEvent = _press return card def get_selected(self) -> str | None: return self._selected # ------------------------------------------------------------------ # # Helpers stile # # ------------------------------------------------------------------ # _BTN_PRIMARY = """ QPushButton { background: #5C6BC0; color: white; border: none; border-radius: 6px; padding: 8px 18px; font-size: 13px; } QPushButton:hover { background: #3F51B5; } """ _BTN_SECONDARY = """ QPushButton { background: #F0F0F0; color: #333; border: 1px solid #CCC; border-radius: 6px; padding: 8px 18px; font-size: 13px; } QPushButton:hover { background: #E0E0E0; } """