diff --git a/ui/extends/shared/settings.py b/ui/extends/shared/settings.py index 00f0187..c48b598 100644 --- a/ui/extends/shared/settings.py +++ b/ui/extends/shared/settings.py @@ -1,6 +1,8 @@ import sys -from PySide6.QtCore import QFileInfo, QSettings +from PySide6.QtCore import QFileInfo, QSettings, Signal + +from .singleton import QObjectSingleton __all__ = [ "DATABASE_URL", @@ -29,7 +31,9 @@ ANDREAL_FOLDER = "Andreal/AndrealFolder" ANDREAL_EXECUTABLE = "Andreal/AndrealExecutable" -class Settings(QSettings): +class Settings(QSettings, metaclass=QObjectSingleton): + updated = Signal(str) + def __init__(self, parent=None): super().__init__( QFileInfo(sys.argv[0]).dir().absoluteFilePath("arcaea_offline.ini"), @@ -37,6 +41,10 @@ class Settings(QSettings): parent, ) + def setValue(self, key: str, value) -> None: + super().setValue(key, value) + self.updated.emit(key) + def _strItem(self, key: str) -> str | None: return self.value(key, None, str) diff --git a/ui/extends/shared/singleton.py b/ui/extends/shared/singleton.py new file mode 100644 index 0000000..2ef9da9 --- /dev/null +++ b/ui/extends/shared/singleton.py @@ -0,0 +1,18 @@ +from typing import Generic, TypeVar + +from PySide6.QtCore import QObject + +T = TypeVar("T") + + +class Singleton(type, Generic[T]): + _instance = None + + def __call__(cls, *args, **kwargs) -> T: + if cls._instance is None: + cls._instance = super().__call__(*args, **kwargs) + return cls._instance + + +class QObjectSingleton(type(QObject), Singleton): + pass