diff --git a/plugin/src/Caelestia/Config/config.cpp b/plugin/src/Caelestia/Config/config.cpp index 16be07a8..24cbe9e7 100644 --- a/plugin/src/Caelestia/Config/config.cpp +++ b/plugin/src/Caelestia/Config/config.cpp @@ -66,19 +66,29 @@ GlobalConfig::GlobalConfig(GlobalConfig* fallback, const QString& filePath, QObj , m_services(new ServiceConfig(this)) , m_paths(new UserPaths(this)) { setSparse(true); - setupFileBackend(filePath); - syncFromGlobal(fallback); + if (!filePath.isEmpty()) + setupFileBackend(filePath); + if (fallback) + syncFromGlobal(fallback); } GlobalConfig::~GlobalConfig() { - // Clear global instance - s_instance = nullptr; + if (m_defaults) + m_defaults->deleteLater(); + if (s_instance == this) + s_instance = nullptr; } GlobalConfig* GlobalConfig::instance() { return s_instance; } +GlobalConfig* GlobalConfig::defaults() { + if (!m_defaults) + m_defaults = new GlobalConfig(nullptr, QString()); // Non-singleton constructor + return m_defaults; +} + void GlobalConfig::bindAppearanceTokens() { if (m_tokensBound) return; diff --git a/plugin/src/Caelestia/Config/config.hpp b/plugin/src/Caelestia/Config/config.hpp index 888caffc..a6fa2f01 100644 --- a/plugin/src/Caelestia/Config/config.hpp +++ b/plugin/src/Caelestia/Config/config.hpp @@ -47,6 +47,7 @@ class GlobalConfig : public ConfigObject { public: static GlobalConfig* instance(); + [[nodiscard]] Q_INVOKABLE GlobalConfig* defaults(); static GlobalConfig* create(QQmlEngine*, QJSEngine*); Q_INVOKABLE void save(); @@ -59,8 +60,9 @@ public: private: friend class MonitorConfigManager; explicit GlobalConfig(QObject* parent = nullptr); - explicit GlobalConfig(GlobalConfig* fallback, const QString& filePath, QObject* parent); + explicit GlobalConfig(GlobalConfig* fallback, const QString& filePath, QObject* parent = nullptr); + GlobalConfig* m_defaults = nullptr; bool m_tokensBound = false; }; diff --git a/plugin/src/Caelestia/Config/tokens.cpp b/plugin/src/Caelestia/Config/tokens.cpp index e03992a4..f2f8d5cc 100644 --- a/plugin/src/Caelestia/Config/tokens.cpp +++ b/plugin/src/Caelestia/Config/tokens.cpp @@ -55,18 +55,29 @@ TokenConfig::TokenConfig(TokenConfig* fallback, const QString& filePath, QObject , m_winfo(new WInfoTokens(this)) , m_controlCenter(new ControlCenterTokens(this)) { setSparse(true); - setupFileBackend(filePath); - syncFromGlobal(fallback); + if (!filePath.isEmpty()) + setupFileBackend(filePath); + if (fallback) + syncFromGlobal(fallback); } TokenConfig::~TokenConfig() { - s_instance = nullptr; + if (m_defaults) + m_defaults->deleteLater(); + if (s_instance == this) + s_instance = nullptr; } TokenConfig* TokenConfig::instance() { return s_instance; } +TokenConfig* TokenConfig::defaults() { + if (!m_defaults) + m_defaults = new TokenConfig(nullptr, QString()); // Non-singleton constructor + return m_defaults; +} + TokenConfig* TokenConfig::create(QQmlEngine* engine, QJSEngine*) { return new TokenConfig(engine); } diff --git a/plugin/src/Caelestia/Config/tokens.hpp b/plugin/src/Caelestia/Config/tokens.hpp index 9ab1ddc3..3d9d48d5 100644 --- a/plugin/src/Caelestia/Config/tokens.hpp +++ b/plugin/src/Caelestia/Config/tokens.hpp @@ -309,6 +309,7 @@ class TokenConfig : public ConfigObject { public: static TokenConfig* instance(); + [[nodiscard]] Q_INVOKABLE TokenConfig* defaults(); static TokenConfig* create(QQmlEngine*, QJSEngine*); Q_INVOKABLE void save(); @@ -319,7 +320,9 @@ public: private: friend class MonitorConfigManager; explicit TokenConfig(QObject* parent = nullptr); - explicit TokenConfig(TokenConfig* fallback, const QString& filePath, QObject* parent); + explicit TokenConfig(TokenConfig* fallback, const QString& filePath, QObject* parent = nullptr); + + TokenConfig* m_defaults = nullptr; }; class Tokens : public QObject {