""" Filename: welcome.py Description: Welcome dialog for FLARES Note: Compliant with pylance strict type checking Author: Tyler de Zeeuw License: GPL-3.0 """ from PySide6.QtWidgets import QTextBrowser, QVBoxLayout, QLabel, QDialog, QHBoxLayout, QPushButton from PySide6.QtGui import QDesktopServices, QIcon from PySide6.QtCore import QUrl from PySide6.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply from src.shared.shareddata import APP_NAME, CURRENT_VERSION, CHANGELOG_URL, resource_path class WelcomeDialog(QDialog): def __init__(self, parent: QDialog | None = None, direct: bool = True, first: bool = False): super().__init__(parent) self.setWindowTitle(f"What's New - {APP_NAME.upper()}") self.setMinimumSize(550, 450) self.resize(800, 500) layout = QVBoxLayout(self) header_layout = QHBoxLayout() logo_label = QLabel(self) # NOTE: might not work on mac and need the icns file logo_label.setPixmap(QIcon(resource_path("icons/main.ico")).pixmap(48, 48)) if first: title_label = QLabel(f"

Welcome to {APP_NAME.upper()}!

", self) elif direct: title_label = QLabel(f"

{APP_NAME.upper()} has been sucessfully updated to version {CURRENT_VERSION}!

", self) else: title_label = QLabel(f"

{APP_NAME.upper()} is currently running version {CURRENT_VERSION}.

", self) header_layout.addWidget(logo_label) header_layout.addWidget(title_label) header_layout.addStretch() layout.addLayout(header_layout) self.text_browser = QTextBrowser(self) self.text_browser.setHtml("

Loading latest updates from server...

") # Ensure links open in the default web browser and not in this window self.text_browser.setOpenLinks(False) self.text_browser.anchorClicked.connect(QDesktopServices.openUrl) layout.addWidget(self.text_browser) footer_layout = QHBoxLayout() ok_button = QPushButton("OK", self) ok_button.setDefault(True) ok_button.clicked.connect(self.accept) footer_layout.addStretch() footer_layout.addWidget(ok_button) layout.addLayout(footer_layout) # Fetch markdown from the web asynchronously self.network_manager = QNetworkAccessManager(self) self.network_manager.finished.connect(self._on_download_complete) self.network_manager.get(QNetworkRequest(QUrl(CHANGELOG_URL))) def _on_download_complete(self, reply: QNetworkReply) -> None: """Processes the downloaded markdown and drops it into the view frame.""" if reply.error() == reply.NetworkError.NoError: raw_bytes = reply.readAll().data() # Convert raw bytes to standard text string markdown_text = str(raw_bytes, encoding='utf-8') self.text_browser.setMarkdown(markdown_text) else: self.text_browser.setHtml( f"

Failed to load content.
Error: {reply.errorString()}

" ) reply.deleteLater()