nosignal-shell/plugin/src/Caelestia/Config/tokensattached.cpp

77 lines
2.5 KiB
C++

#include "tokensattached.hpp"
#include "anim.hpp"
#include "config.hpp"
#include "configscope.hpp"
#include "monitorconfigmanager.hpp"
#include "tokens.hpp"
namespace caelestia::config {
namespace {
const AppearanceConfig* resolveAppearance(ConfigScope* scope, const char* prop, QObject* parent) {
if (scope && scope->config())
return scope->config()->appearance();
if (parent)
qCWarning(lcConfig, "Tokens.%s accessed without a ConfigScope ancestor on %s", prop,
parent->metaObject()->className());
return GlobalConfig::instance()->appearance();
}
} // namespace
Tokens::Tokens(ConfigScope* scope, QObject* parent)
: QObject(parent)
, m_scope(scope)
, m_anim(new AnimTokens(this)) {
connectScope();
bindAnim();
}
void Tokens::connectScope() {
if (!m_scope)
return;
connect(m_scope, &ConfigScope::configChanged, this, &Tokens::sourceChanged);
}
void Tokens::bindAnim() {
m_anim->bindDurations(GlobalConfig::instance()->appearance()->anim()->durations());
m_anim->bindCurves(TokenConfig::instance()->appearance()->curves());
}
#define TOKENS_ATTACHED_GETTER(Type, name) \
const Type* Tokens::name() const { \
auto* a = resolveAppearance(m_scope, #name, parent()); \
return a ? a->name() : nullptr; \
}
TOKENS_ATTACHED_GETTER(AppearanceRounding, rounding)
TOKENS_ATTACHED_GETTER(AppearanceSpacing, spacing)
TOKENS_ATTACHED_GETTER(AppearancePadding, padding)
TOKENS_ATTACHED_GETTER(AppearanceFont, font)
TOKENS_ATTACHED_GETTER(AppearanceTransparency, transparency)
#undef TOKENS_ATTACHED_GETTER
const SizeTokens* Tokens::sizes() const {
if (m_scope && m_scope->tokens())
return m_scope->tokens()->sizes();
if (parent())
qCWarning(lcConfig, "Tokens.sizes accessed without a ConfigScope ancestor on %s",
parent()->metaObject()->className());
return TokenConfig::instance()->sizes();
}
const AnimTokens* Tokens::anim() const {
return m_anim;
}
TokenConfig* Tokens::forScreen(const QString& screen) {
return TokenConfig::forScreen(screen);
}
Tokens* Tokens::qmlAttachedProperties(QObject* object) {
return new Tokens(ConfigScope::find(object), object);
}
} // namespace caelestia::config