# launcher_src/update_ui.py import sys from PyQt6.QtWidgets import ( QApplication, QWidget, QVBoxLayout, QLabel, QProgressBar, QMessageBox ) from PyQt6.QtCore import Qt, QThreadPool from PyQt6.QtGui import QFont from .sync_manager import SyncManager from .worker import SyncWorker class UpdateUI(QWidget): def __init__(self): super().__init__() self.sync_manager = SyncManager() self.threadpool = QThreadPool() self.init_ui() self.run_update_process() def init_ui(self): """Crea l'interfaccia grafica.""" self.setWindowTitle("MyICR Suite Installer") # --- MODIFICA --- Leggermente più grande per far spazio al nuovo testo self.setFixedSize(450, 180) self.setWindowFlags(Qt.WindowType.FramelessWindowHint | Qt.WindowType.WindowStaysOnTopHint) layout = QVBoxLayout(self) layout.setContentsMargins(20, 20, 20, 20) # Aggiunti margini per un look migliore self.title_label = QLabel("MyICR Suite") font = QFont("Segoe UI", 16, QFont.Weight.Bold) self.title_label.setFont(font) self.title_label.setAlignment(Qt.AlignmentFlag.AlignCenter) self.status_label = QLabel("Avvio in corso...") self.status_label.setAlignment(Qt.AlignmentFlag.AlignCenter) self.progress_bar = QProgressBar() self.progress_bar.setRange(0, 0) # Inizia in modalità indeterminata self.progress_bar.setTextVisible(False) # --- MODIFICA --- Aggiunta la nuova etichetta per i dettagli self.detail_label = QLabel("") detail_font = QFont("Segoe UI", 8) self.detail_label.setFont(detail_font) self.detail_label.setAlignment(Qt.AlignmentFlag.AlignCenter) self.detail_label.setStyleSheet("color: #605E5C;") layout.addWidget(self.title_label) layout.addSpacing(10) layout.addWidget(self.status_label) layout.addWidget(self.progress_bar) layout.addWidget(self.detail_label) # Aggiunta al layout self.setStyleSheet(""" QWidget { background-color: #DEECF9; /* <-- AZZURRO LEGGERO */ border: 1px solid #0078D4; /* <-- BORDO BLU MICROSOFT */ } QLabel { border: none; background-color: transparent; /* Assicura che le label siano trasparenti */ } QProgressBar { border: 1px solid #005A9E; border-radius: 3px; text-align: center; } QProgressBar::chunk { background-color: #0078D4; } """) def run_update_process(self): """Crea e avvia il worker in un thread separato.""" worker = SyncWorker(self.sync_manager) worker.signals.progress.connect(self.update_progress) worker.signals.finished.connect(self.on_finished) self.threadpool.start(worker) # --- MODIFICA --- La funzione ora accetta 3 argomenti def update_progress(self, value: int, text: str, detail: str): """Slot per aggiornare la UI in base al progresso.""" if self.progress_bar.minimum() == 0 and self.progress_bar.maximum() == 0: self.progress_bar.setRange(0, 100) self.progress_bar.setValue(value) self.status_label.setText(text) self.detail_label.setText(detail) # Aggiorna la nuova etichetta def on_finished(self, success: bool, message: str): """Slot chiamato quando il worker ha finito.""" if success: QApplication.instance().quit() else: self.show_error_message(message) def show_error_message(self, message: str): """Mostra un popup di errore e chiude l'app.""" msg_box = QMessageBox(self) msg_box.setIcon(QMessageBox.Icon.Critical) msg_box.setText("Errore durante l'aggiornamento") msg_box.setInformativeText(message) msg_box.setWindowTitle("Errore Launcher") msg_box.setStandardButtons(QMessageBox.StandardButton.Ok) msg_box.exec() QApplication.instance().quit()