"""
WizardHintPanel — pannello istruzione contestuale per il wizard.
Mostra un suggerimento specifico per ogni step, si nasconde automaticamente
quando lo step avanza.
"""
from PyQt6.QtWidgets import QFrame, QHBoxLayout, QVBoxLayout, QLabel, QPushButton
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QFont
# Testi per step (indice = numero step)
_HINTS = {
0: (
'Come procedere',
'Incolla i dati del listino fornitore nelle celle della griglia '
'(TI = titolo italiano, TO = titolo originale, '
'ANNO, REGISTA). '
'Quando hai inserito tutti i titoli premi ▶ Avvia aggancio.'
'
'
'DECORRENZA — data di disponibilità indicata dal fornitore. '
'È opzionale, ma utile per verifiche successive sugli agganci.'
),
1: (
'Aggancio in corso',
'Il sistema sta cercando la corrispondenza di ciascun titolo '
'nel catalogo Mediaset. Attendi il completamento.'
),
2: (
'Revisiona i risultati',
'Verde — titolo trovato con certezza. '
' '
'Giallo — match derivato o parziale. '
' '
'Rosso — nessun match trovato.
'
'Fai doppio clic su una riga rossa o gialla per effettuare una ricerca manuale.
'
'Quando sei soddisfatto del risultato, premi Salva agganci per registrare '
'nel repository associando i titoli a un fornitore, oppure usa '
'≡ → Esporta per salvare in Excel.'
),
}
_HINTS_VALUTAZIONI = {
0: (
'Come procedere',
'Incolla le valutazioni dalla tua fonte (es. Excel) con Ctrl+V. '
'Le colonne corrispondono alle reti: C5, I1, R4, LA5, I2, IRIS, TOP CRIME, '
'FOCUS, C20, CINE34, TWENTY SEVEN.
'
'La colonna IMDB (ultima) è obbligatoria per l\'archiviazione: '
'assicurati di includerla nel copia-incolla.
'
'Quando hai finito di incollare premi ▶ Verifica IMDB.'
),
1: (
'Verifica codici IMDB',
'Le righe evidenziate in rosso non hanno il codice IMDB '
'e non potranno essere archiviate.
'
'Completa i codici mancanti direttamente nelle celle, poi premi '
'▶ Archivia per procedere al salvataggio.'
),
2: (
'Archivia le valutazioni',
'Tutte le righe sono pronte per essere archiviate.
'
'Premi 💾 Salva valutazioni per aprire il dialog di archiviazione, '
'scegliere il fornitore e confermare la data.'
),
}
class WizardHintPanel(QFrame):
def __init__(self, parent=None, *, hints=None):
super().__init__(parent)
self._hints = hints if hints is not None else _HINTS
self.setFrameShape(QFrame.Shape.NoFrame)
self.setStyleSheet(
'background-color: #EFF3FF;'
'border-bottom: 1px solid #C5CAE9;'
)
outer = QVBoxLayout(self)
outer.setContentsMargins(16, 10, 16, 10)
outer.setSpacing(6)
# Riga titolo + X
top_row = QHBoxLayout()
top_row.setContentsMargins(0, 0, 0, 0)
top_row.setSpacing(8)
self._title = QLabel()
self._title.setFont(QFont('Segoe UI', 9, QFont.Weight.Bold))
self._title.setStyleSheet('color: #283593;')
top_row.addWidget(self._title, 1)
btn_x = QPushButton('✕')
btn_x.setFixedSize(18, 18)
btn_x.setStyleSheet(
'QPushButton { border: none; color: #BDBDBD; font-size: 10px; background: transparent; }'
'QPushButton:hover { color: #555; }'
)
btn_x.clicked.connect(self.hide)
top_row.addWidget(btn_x, alignment=Qt.AlignmentFlag.AlignTop)
outer.addLayout(top_row)
self._body = QLabel()
self._body.setWordWrap(True)
self._body.setFont(QFont('Segoe UI', 9))
self._body.setStyleSheet('color: #37474F;')
self._body.setTextFormat(Qt.TextFormat.RichText)
outer.addWidget(self._body)
# Pulsante "Ho capito"
btn_row = QHBoxLayout()
btn_row.setContentsMargins(0, 2, 0, 0)
btn_row.addStretch()
btn_ok = QPushButton('Ho capito')
btn_ok.setFixedHeight(24)
btn_ok.setStyleSheet(
'QPushButton { background: #5C6BC0; color: white; border: none;'
' border-radius: 4px; padding: 0 14px; font-size: 11px; font-weight: 600; }'
'QPushButton:hover { background: #3F51B5; }'
)
btn_ok.clicked.connect(self.hide)
btn_row.addWidget(btn_ok)
outer.addLayout(btn_row)
self.set_step(0)
def set_step(self, index: int):
hint = self._hints.get(index)
if hint is None:
self.hide()
return
title, body = hint
self._title.setText(title)
self._body.setText(body)
self.show()
self.adjustSize()