""" Filename: welcome.py Description: Welcome dialog window Note: Compliant with pylance strict type checking Author: Tyler de Zeeuw License: GPL-3.0 """ # External library imports 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, PLATFORM_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) icon_ext = "icns" if PLATFORM_NAME == "darwin" else "ico" logo_label.setPixmap(QIcon(resource_path(f"icons/main.{icon_ext}")).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()