Source code for magscope.startup_splash
from importlib import resources
[docs]
def _load_logo_pixmap():
from PyQt6.QtGui import QPixmap
logo_resource = resources.files("magscope").joinpath("assets/logo.png")
if not logo_resource.is_file():
return None
with resources.as_file(logo_resource) as logo_path:
pixmap = QPixmap(str(logo_path))
if pixmap.isNull():
return None
return pixmap
[docs]
def _build_startup_splash_window():
from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import QGridLayout, QLabel, QProgressBar, QVBoxLayout, QWidget
window = QWidget()
window.setWindowFlag(Qt.WindowType.FramelessWindowHint, True)
window.setWindowFlag(Qt.WindowType.WindowStaysOnTopHint, True)
window.setObjectName("startupSplash")
window.setStyleSheet(
"#startupSplash {"
"background: #ffffff;"
"border: 1px solid #d7dde2;"
"}"
"QLabel { background: transparent; }"
"QProgressBar {"
"background: #eef2f5;"
"border: 1px solid #d7dde2;"
"border-radius: 6px;"
"}"
"QProgressBar::chunk {"
"background: #2a7fff;"
"border-radius: 6px;"
"}"
"#startupSplashProgressLabel {"
"color: #1c1f23;"
"font-size: 12px;"
"font-weight: 500;"
"background: transparent;"
"}"
)
layout = QVBoxLayout(window)
layout.setContentsMargins(0, 0, 0, 0)
layout.setSpacing(0)
content = QWidget()
content_layout = QVBoxLayout(content)
content_layout.setContentsMargins(36, 36, 36, 20)
content_layout.setSpacing(0)
logo = QLabel()
logo.setAlignment(Qt.AlignmentFlag.AlignCenter)
if pixmap := _load_logo_pixmap():
logo.setPixmap(
pixmap.scaled(
568,
288,
Qt.AspectRatioMode.KeepAspectRatio,
Qt.TransformationMode.SmoothTransformation,
)
)
content_layout.addWidget(logo)
layout.addWidget(content, 1)
progress_container = QWidget()
progress_layout = QGridLayout(progress_container)
progress_layout.setContentsMargins(0, 0, 0, 0)
progress_bar = QProgressBar()
progress_bar.setObjectName("startupSplashProgressBar")
progress_bar.setRange(0, 0)
progress_bar.setTextVisible(False)
progress_bar.setFixedHeight(25)
progress_layout.addWidget(progress_bar, 0, 0)
progress_label = QLabel("loading ...")
progress_label.setObjectName("startupSplashProgressLabel")
progress_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
progress_label.setAttribute(Qt.WidgetAttribute.WA_TransparentForMouseEvents, True)
progress_layout.addWidget(progress_label, 0, 0)
layout.addWidget(progress_container)
window.resize(640, 360)
return window
[docs]
def run_startup_splash(close_event) -> None:
"""Display the startup splash until ``close_event`` is set."""
from PyQt6.QtCore import QTimer
from PyQt6.QtWidgets import QApplication
app = QApplication.instance()
if app is None:
app = QApplication(["MagScope Splash"])
window = _build_startup_splash_window()
window.show()
if screen := app.primaryScreen():
geometry = screen.availableGeometry()
frame = window.frameGeometry()
frame.moveCenter(geometry.center())
window.move(frame.topLeft())
timer = QTimer()
timer.setInterval(30)
timer.timeout.connect(lambda: window.close() if close_event.is_set() else None)
timer.timeout.connect(lambda: app.quit() if close_event.is_set() else None)
timer.start()
app.exec()