diff --git a/plugin/src/Caelestia/Config/config.cpp b/plugin/src/Caelestia/Config/config.cpp index 345655ec..7a8ea1f7 100644 --- a/plugin/src/Caelestia/Config/config.cpp +++ b/plugin/src/Caelestia/Config/config.cpp @@ -1,5 +1,6 @@ #include "config.hpp" #include "configscope.hpp" +#include "tokens.hpp" #include #include @@ -39,6 +40,10 @@ GlobalConfig::GlobalConfig(QObject* parent) s_instance = this; setupFileBackend(configDir() + QStringLiteral("shell.json")); + + // If TokenConfig was created before us, bind now + if (TokenConfig::instance()) + bindAppearanceTokens(); } GlobalConfig::GlobalConfig(GlobalConfig* fallback, const QString& filePath, QObject* parent) @@ -74,8 +79,32 @@ GlobalConfig* GlobalConfig::instance() { return s_instance; } -GlobalConfig* GlobalConfig::create(QQmlEngine* engine, QJSEngine*) { +void GlobalConfig::bindAppearanceTokens() { + auto* tokens = TokenConfig::instance(); + if (!tokens) { + qCDebug(lcConfig) << "GlobalConfig::bindAppearanceTokens: TokenConfig not yet available"; + return; + } + + qCDebug(lcConfig) << "GlobalConfig::bindAppearanceTokens: binding appearance to token values"; + auto* tokenAppearance = tokens->appearance(); + m_appearance->rounding()->bindTokens(tokenAppearance->rounding()); + m_appearance->spacing()->bindTokens(tokenAppearance->spacing()); + m_appearance->padding()->bindTokens(tokenAppearance->padding()); + m_appearance->font()->size()->bindTokens(tokenAppearance->fontSize()); + m_appearance->anim()->durations()->bindTokens(tokenAppearance->animDurations()); +} + +GlobalConfig* GlobalConfig::create(QQmlEngine* engine, QJSEngine* jsEngine) { auto* config = new GlobalConfig(engine); + + // Ensure TokenConfig is created — appearance computed properties depend on token binding. + if (!TokenConfig::instance()) + TokenConfig::create(engine, jsEngine); + + // Bind now that both singletons exist + config->bindAppearanceTokens(); + return config; } diff --git a/plugin/src/Caelestia/Config/config.hpp b/plugin/src/Caelestia/Config/config.hpp index f74c30b2..2df63a03 100644 --- a/plugin/src/Caelestia/Config/config.hpp +++ b/plugin/src/Caelestia/Config/config.hpp @@ -54,6 +54,8 @@ public: ~GlobalConfig() override; + void bindAppearanceTokens(); + private: friend class MonitorConfigManager; explicit GlobalConfig(QObject* parent = nullptr); diff --git a/plugin/src/Caelestia/Config/configobject.hpp b/plugin/src/Caelestia/Config/configobject.hpp index 91c6c3f4..bb56e9c7 100644 --- a/plugin/src/Caelestia/Config/configobject.hpp +++ b/plugin/src/Caelestia/Config/configobject.hpp @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -42,6 +43,8 @@ private: namespace caelestia::config { +Q_DECLARE_LOGGING_CATEGORY(lcConfig) + class ConfigObject : public QObject { Q_OBJECT diff --git a/plugin/src/Caelestia/Config/tokens.cpp b/plugin/src/Caelestia/Config/tokens.cpp index 8aab816e..e03992a4 100644 --- a/plugin/src/Caelestia/Config/tokens.cpp +++ b/plugin/src/Caelestia/Config/tokens.cpp @@ -33,17 +33,11 @@ TokenConfig::TokenConfig(QObject* parent) , m_controlCenter(new ControlCenterTokens(this)) { s_instance = this; - // Bind token base values to GlobalConfig appearance computed properties - if (auto* global = GlobalConfig::instance()) { - auto* appearanceConfig = global->appearance(); - appearanceConfig->rounding()->bindTokens(m_appearance->rounding()); - appearanceConfig->spacing()->bindTokens(m_appearance->spacing()); - appearanceConfig->padding()->bindTokens(m_appearance->padding()); - appearanceConfig->font()->size()->bindTokens(m_appearance->fontSize()); - appearanceConfig->anim()->durations()->bindTokens(m_appearance->animDurations()); - } - setupFileBackend(configDir() + QStringLiteral("shell-tokens.json")); + + // If GlobalConfig was created before us, trigger its binding + if (auto* global = GlobalConfig::instance()) + global->bindAppearanceTokens(); } TokenConfig::TokenConfig(TokenConfig* fallback, const QString& filePath, QObject* parent)