41 lines
1.2 KiB
Python
41 lines
1.2 KiB
Python
from pathlib import Path
|
|
|
|
from PySide6.QtCore import QObject, QFileSystemWatcher
|
|
|
|
|
|
class QssReloader(QObject):
|
|
instance = None
|
|
|
|
def __new__(cls, *args, **kwargs):
|
|
if cls.instance is None:
|
|
cls.instance = super().__new__(cls)
|
|
return cls.instance
|
|
|
|
def __init__(self):
|
|
super().__init__()
|
|
self.path2objs = {}
|
|
self.watcher = QFileSystemWatcher(self)
|
|
self.watcher.fileChanged.connect(self.on_file_changed)
|
|
|
|
def register(self, qss_path: str, ui_obj):
|
|
path = str(Path(qss_path).resolve())
|
|
obj_list = self.path2objs.setdefault(path, [])
|
|
if ui_obj not in obj_list:
|
|
obj_list.append(ui_obj)
|
|
if path not in self.watcher.files():
|
|
self.watcher.addPath(path)
|
|
self.apply_one(path, ui_obj)
|
|
|
|
def on_file_changed(self, path: str):
|
|
for obj in self.path2objs.get(path, []):
|
|
self.apply_one(path, obj)
|
|
if path not in self.watcher.files():
|
|
self.watcher.addPath(path)
|
|
|
|
@staticmethod
|
|
def apply_one(path: str, obj):
|
|
qss = Path(path).read_text(encoding="utf-8")
|
|
obj.setStyleSheet(qss)
|
|
|
|
|
|
qss_reloader = QssReloader() |