feat: Tokens attached object points to Config.appearance

This commit is contained in:
2 * r + 2 * t 2026-04-11 21:16:35 +10:00
parent 324acb492a
commit 0429650a6e
2 changed files with 51 additions and 51 deletions

View file

@ -91,38 +91,52 @@ Tokens::Tokens(ConfigScope* scope, QObject* parent)
void Tokens::connectScope() {
if (!m_scope)
return;
connect(m_scope, &ConfigScope::tokensChanged, this, &Tokens::sourceChanged);
connect(m_scope, &ConfigScope::configChanged, this, &Tokens::sourceChanged);
}
#define TOKENS_ATTACHED_GETTER(Type, name) \
const Type* Tokens::name() const { \
if (m_scope && m_scope->tokens()) \
return m_scope->tokens()->name(); \
auto* global = TokenConfig::instance(); \
return global ? global->name() : nullptr; \
}
// Resolve appearance from per-monitor GlobalConfig overlay or global GlobalConfig
static const AppearanceConfig* resolveAppearance(ConfigScope* scope) {
if (scope && scope->config())
return scope->config()->appearance();
auto* global = GlobalConfig::instance();
return global ? global->appearance() : nullptr;
}
TOKENS_ATTACHED_GETTER(AppearanceTokens, appearance)
TOKENS_ATTACHED_GETTER(BarTokens, bar)
TOKENS_ATTACHED_GETTER(DashboardTokens, dashboard)
TOKENS_ATTACHED_GETTER(LauncherTokens, launcher)
TOKENS_ATTACHED_GETTER(NotifsTokens, notifs)
TOKENS_ATTACHED_GETTER(OsdTokens, osd)
TOKENS_ATTACHED_GETTER(SessionTokens, session)
TOKENS_ATTACHED_GETTER(SidebarTokens, sidebar)
TOKENS_ATTACHED_GETTER(UtilitiesTokens, utilities)
TOKENS_ATTACHED_GETTER(LockTokens, lock)
TOKENS_ATTACHED_GETTER(WInfoTokens, winfo)
TOKENS_ATTACHED_GETTER(ControlCenterTokens, controlCenter)
const AppearanceRounding* Tokens::rounding() const {
auto* a = resolveAppearance(m_scope);
return a ? a->rounding() : nullptr;
}
#undef TOKENS_ATTACHED_GETTER
const AppearanceSpacing* Tokens::spacing() const {
auto* a = resolveAppearance(m_scope);
return a ? a->spacing() : nullptr;
}
const AppearancePadding* Tokens::padding() const {
auto* a = resolveAppearance(m_scope);
return a ? a->padding() : nullptr;
}
const AppearanceFont* Tokens::font() const {
auto* a = resolveAppearance(m_scope);
return a ? a->font() : nullptr;
}
const AppearanceAnim* Tokens::anim() const {
auto* a = resolveAppearance(m_scope);
return a ? a->anim() : nullptr;
}
const AppearanceTransparency* Tokens::transparency() const {
auto* a = resolveAppearance(m_scope);
return a ? a->transparency() : nullptr;
}
Tokens* Tokens::qmlAttachedProperties(QObject* object) {
// Ensure TokenConfig singleton is created before any attached property access
if (!TokenConfig::instance()) {
// Ensure GlobalConfig singleton is created before any attached property access
if (!GlobalConfig::instance()) {
if (auto* engine = qmlEngine(object))
engine->singletonInstance<TokenConfig*>("Caelestia.Config", "TokenConfig");
engine->singletonInstance<GlobalConfig*>("Caelestia.Config", "GlobalConfig");
}
return new Tokens(ConfigScope::find(object), object);
}

View file

@ -1,5 +1,6 @@
#pragma once
#include "appearanceconfig.hpp"
#include "configobject.hpp"
#include <qlist.h>
@ -329,37 +330,22 @@ class Tokens : public QObject {
QML_UNCREATABLE("")
QML_ATTACHED(Tokens)
Q_PROPERTY(caelestia::config::ConfigScope* scope READ scope NOTIFY sourceChanged)
Q_PROPERTY(const caelestia::config::AppearanceTokens* appearance READ appearance NOTIFY sourceChanged)
Q_PROPERTY(const caelestia::config::BarTokens* bar READ bar NOTIFY sourceChanged)
Q_PROPERTY(const caelestia::config::DashboardTokens* dashboard READ dashboard NOTIFY sourceChanged)
Q_PROPERTY(const caelestia::config::LauncherTokens* launcher READ launcher NOTIFY sourceChanged)
Q_PROPERTY(const caelestia::config::NotifsTokens* notifs READ notifs NOTIFY sourceChanged)
Q_PROPERTY(const caelestia::config::OsdTokens* osd READ osd NOTIFY sourceChanged)
Q_PROPERTY(const caelestia::config::SessionTokens* session READ session NOTIFY sourceChanged)
Q_PROPERTY(const caelestia::config::SidebarTokens* sidebar READ sidebar NOTIFY sourceChanged)
Q_PROPERTY(const caelestia::config::UtilitiesTokens* utilities READ utilities NOTIFY sourceChanged)
Q_PROPERTY(const caelestia::config::LockTokens* lock READ lock NOTIFY sourceChanged)
Q_PROPERTY(const caelestia::config::WInfoTokens* winfo READ winfo NOTIFY sourceChanged)
Q_PROPERTY(const caelestia::config::ControlCenterTokens* controlCenter READ controlCenter NOTIFY sourceChanged)
Q_PROPERTY(const caelestia::config::AppearanceRounding* rounding READ rounding NOTIFY sourceChanged)
Q_PROPERTY(const caelestia::config::AppearanceSpacing* spacing READ spacing NOTIFY sourceChanged)
Q_PROPERTY(const caelestia::config::AppearancePadding* padding READ padding NOTIFY sourceChanged)
Q_PROPERTY(const caelestia::config::AppearanceFont* font READ font NOTIFY sourceChanged)
Q_PROPERTY(const caelestia::config::AppearanceAnim* anim READ anim NOTIFY sourceChanged)
Q_PROPERTY(const caelestia::config::AppearanceTransparency* transparency READ transparency NOTIFY sourceChanged)
public:
explicit Tokens(ConfigScope* scope, QObject* parent = nullptr);
[[nodiscard]] ConfigScope* scope() const { return m_scope; }
[[nodiscard]] const AppearanceTokens* appearance() const;
[[nodiscard]] const BarTokens* bar() const;
[[nodiscard]] const DashboardTokens* dashboard() const;
[[nodiscard]] const LauncherTokens* launcher() const;
[[nodiscard]] const NotifsTokens* notifs() const;
[[nodiscard]] const OsdTokens* osd() const;
[[nodiscard]] const SessionTokens* session() const;
[[nodiscard]] const SidebarTokens* sidebar() const;
[[nodiscard]] const UtilitiesTokens* utilities() const;
[[nodiscard]] const LockTokens* lock() const;
[[nodiscard]] const WInfoTokens* winfo() const;
[[nodiscard]] const ControlCenterTokens* controlCenter() const;
[[nodiscard]] const AppearanceRounding* rounding() const;
[[nodiscard]] const AppearanceSpacing* spacing() const;
[[nodiscard]] const AppearancePadding* padding() const;
[[nodiscard]] const AppearanceFont* font() const;
[[nodiscard]] const AppearanceAnim* anim() const;
[[nodiscard]] const AppearanceTransparency* transparency() const;
static Tokens* qmlAttachedProperties(QObject* object);