Skip to content

Commit

Permalink
添加系统主题监听器 SystemThemeListener (#954)
Browse files Browse the repository at this point in the history
  • Loading branch information
zhiyiYo committed Sep 15, 2024
1 parent b6ed584 commit 0d7a5b5
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 4 deletions.
22 changes: 20 additions & 2 deletions examples/gallery/app/view/main_window.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
# coding: utf-8
from PyQt5.QtCore import QUrl, QSize
from PyQt5.QtCore import QUrl, QSize, QTimer
from PyQt5.QtGui import QIcon, QDesktopServices, QColor
from PyQt5.QtWidgets import QApplication

from qfluentwidgets import (NavigationAvatarWidget, NavigationItemPosition, MessageBox, FluentWindow,
SplashScreen)
SplashScreen, SystemThemeListener, isDarkTheme)
from qfluentwidgets import FluentIcon as FIF

from .gallery_interface import GalleryInterface
Expand Down Expand Up @@ -35,6 +35,9 @@ def __init__(self):
super().__init__()
self.initWindow()

# create system theme listener
self.themeListener = SystemThemeListener(self)

# create sub interface
self.homeInterface = HomeInterface(self)
self.iconInterface = IconInterface(self)
Expand All @@ -60,6 +63,9 @@ def __init__(self):
self.initNavigation()
self.splashScreen.finish()

# start theme listener
self.themeListener.start()

def connectSignalToSlot(self):
signalBus.micaEnableChanged.connect(self.setMicaEffectEnabled)
signalBus.switchToSampleCard.connect(self.switchToSample)
Expand Down Expand Up @@ -129,6 +135,18 @@ def resizeEvent(self, e):
if hasattr(self, 'splashScreen'):
self.splashScreen.resize(self.size())

def closeEvent(self, e):
self.themeListener.terminate()
self.themeListener.deleteLater()
super().closeEvent(e)

def _onThemeChangedFinished(self):
super()._onThemeChangedFinished()

# retry
if self.isMicaEffectEnabled():
QTimer.singleShot(100, lambda: self.windowEffect.setMicaEffect(self.winId(), isDarkTheme()))

def switchToSample(self, routeKey, index):
""" switch to sample """
interfaces = self.findChildren(GalleryInterface)
Expand Down
2 changes: 1 addition & 1 deletion examples/gallery/app/view/setting_interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,7 @@ def __connectSignalToSlot(self):
self.__onDownloadFolderCardClicked)

# personalization
self.themeCard.optionChanged.connect(lambda ci: setTheme(cfg.get(ci)))
cfg.themeChanged.connect(setTheme)
self.themeColorCard.colorChanged.connect(lambda c: setThemeColor(c))
self.micaCard.checkedChanged.connect(signalBus.micaEnableChanged)

Expand Down
3 changes: 2 additions & 1 deletion qfluentwidgets/common/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@
from .smooth_scroll import SmoothScroll, SmoothMode
from .translator import FluentTranslator
from .router import qrouter, Router
from .color import FluentThemeColor
from .color import FluentThemeColor
from .theme_listener import SystemThemeListener
27 changes: 27 additions & 0 deletions qfluentwidgets/common/theme_listener.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# coding:utf-8
from PyQt5.QtCore import QThread, pyqtSignal

from .config import Theme, qconfig
import darkdetect


class SystemThemeListener(QThread):
""" System theme listener """

systemThemeChanged = pyqtSignal()

def __init__(self, parent=None):
super().__init__(parent=parent)

def run(self):
darkdetect.listener(self._onThemeChanged)

def _onThemeChanged(self, theme: str):
theme = Theme.DARK if theme.lower() == "dark" else Theme.LIGHT

if qconfig.themeMode.value != Theme.AUTO or theme == qconfig.theme:
return

qconfig.theme = Theme.AUTO
qconfig._cfg.themeChanged.emit(Theme.AUTO)
self.systemThemeChanged.emit()

0 comments on commit 0d7a5b5

Please sign in to comment.