Files

93 lines
2.8 KiB
Python
Raw Permalink Normal View History

2025-08-14 18:45:16 +08:00
# coding:utf-8
from typing import Union
import sys
from PySide6.QtCore import Qt, QSize, QRectF, QEvent
from PySide6.QtGui import QPixmap, QPainter, QColor, QIcon
from PySide6.QtWidgets import QWidget, QVBoxLayout, QGraphicsDropShadowEffect
from ..common.icon import FluentIconBase, drawIcon, toQIcon
from ..common.style_sheet import isDarkTheme, FluentStyleSheet
from ..components.widgets import IconWidget
from qframelesswindow import TitleBar
class SplashScreen(QWidget):
""" Splash screen """
def __init__(self, icon: Union[str, QIcon, FluentIconBase], parent=None, enableShadow=True):
super().__init__(parent=parent)
self._icon = icon
self._iconSize = QSize(96, 96)
self.titleBar = TitleBar(self)
self.iconWidget = IconWidget(icon, self)
self.shadowEffect = QGraphicsDropShadowEffect(self)
self.iconWidget.setFixedSize(self._iconSize)
self.shadowEffect.setColor(QColor(0, 0, 0, 50))
self.shadowEffect.setBlurRadius(15)
self.shadowEffect.setOffset(0, 4)
FluentStyleSheet.FLUENT_WINDOW.apply(self.titleBar)
if enableShadow:
self.iconWidget.setGraphicsEffect(self.shadowEffect)
if parent:
parent.installEventFilter(self)
if sys.platform == "darwin":
self.titleBar.hide()
def setIcon(self, icon: Union[str, QIcon, FluentIconBase]):
self._icon = icon
self.update()
def icon(self):
return toQIcon(self._icon)
def setIconSize(self, size: QSize):
self._iconSize = size
self.iconWidget.setFixedSize(size)
self.update()
def iconSize(self):
return self._iconSize
def setTitleBar(self, titleBar: QWidget):
""" set title bar """
self.titleBar.deleteLater()
self.titleBar = titleBar
titleBar.setParent(self)
titleBar.raise_()
self.titleBar.resize(self.width(), self.titleBar.height())
def eventFilter(self, obj, e: QEvent):
if obj is self.parent():
if e.type() == QEvent.Resize:
self.resize(e.size())
elif e.type() == QEvent.ChildAdded:
self.raise_()
return super().eventFilter(obj, e)
def resizeEvent(self, e):
iw, ih = self.iconSize().width(), self.iconSize().height()
self.iconWidget.move(self.width()//2 - iw//2, self.height()//2 - ih//2)
self.titleBar.resize(self.width(), self.titleBar.height())
def finish(self):
""" close splash screen """
self.close()
def paintEvent(self, e):
painter = QPainter(self)
painter.setPen(Qt.NoPen)
# draw background
c = 32 if isDarkTheme() else 255
painter.setBrush(QColor(c, c, c))
painter.drawRect(self.rect())