fix: create tokens singleton when global config is created

GlobalConfig depends on TokenConfig to forward properties
This commit is contained in:
2 * r + 2 * t 2026-04-11 18:35:05 +10:00
parent 9a8c5ec7f9
commit f15b234753
4 changed files with 39 additions and 11 deletions

View file

@ -1,5 +1,6 @@
#include "config.hpp"
#include "configscope.hpp"
#include "tokens.hpp"
#include <qqmlengine.h>
#include <qstandardpaths.h>
@ -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;
}

View file

@ -54,6 +54,8 @@ public:
~GlobalConfig() override;
void bindAppearanceTokens();
private:
friend class MonitorConfigManager;
explicit GlobalConfig(QObject* parent = nullptr);

View file

@ -2,6 +2,7 @@
#include <qfilesystemwatcher.h>
#include <qjsonobject.h>
#include <qloggingcategory.h>
#include <qmap.h>
#include <qobject.h>
#include <qqmlintegration.h>
@ -42,6 +43,8 @@ private:
namespace caelestia::config {
Q_DECLARE_LOGGING_CATEGORY(lcConfig)
class ConfigObject : public QObject {
Q_OBJECT

View file

@ -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)