nosignal-shell/plugin/src/Caelestia/Config/config.cpp
2026-04-22 22:47:18 +10:00

119 lines
3.8 KiB
C++

#include "config.hpp"
#include "appearanceconfig.hpp"
#include "backgroundconfig.hpp"
#include "barconfig.hpp"
#include "borderconfig.hpp"
#include "controlcenterconfig.hpp"
#include "dashboardconfig.hpp"
#include "generalconfig.hpp"
#include "launcherconfig.hpp"
#include "lockconfig.hpp"
#include "monitorconfigmanager.hpp"
#include "notifsconfig.hpp"
#include "osdconfig.hpp"
#include "serviceconfig.hpp"
#include "sessionconfig.hpp"
#include "sidebarconfig.hpp"
#include "tokens.hpp"
#include "userpaths.hpp"
#include "utilitiesconfig.hpp"
#include "winfoconfig.hpp"
#include <qqmlengine.h>
#include <qstandardpaths.h>
namespace caelestia::config {
namespace {
QString configDir() {
return QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) + QStringLiteral("/caelestia/");
}
} // namespace
GlobalConfig::GlobalConfig(QObject* parent)
: RootConfig(parent)
, m_appearance(new AppearanceConfig(this))
, m_general(new GeneralConfig(this))
, m_background(new BackgroundConfig(this))
, m_bar(new BarConfig(this))
, m_border(new BorderConfig(this))
, m_dashboard(new DashboardConfig(this))
, m_controlCenter(new ControlCenterConfig(this))
, m_launcher(new LauncherConfig(this))
, m_notifs(new NotifsConfig(this))
, m_osd(new OsdConfig(this))
, m_session(new SessionConfig(this))
, m_winfo(new WInfoConfig(this))
, m_lock(new LockConfig(this))
, m_utilities(new UtilitiesConfig(this))
, m_sidebar(new SidebarConfig(this))
, m_services(new ServiceConfig(this))
, m_paths(new UserPaths(this)) {
setupFileBackend(configDir() + QStringLiteral("shell.json"));
}
GlobalConfig::GlobalConfig(GlobalConfig* fallback, const QString& filePath, const QString& screen, QObject* parent)
: RootConfig(parent)
, m_appearance(new AppearanceConfig(this))
, m_general(new GeneralConfig(this))
, m_background(new BackgroundConfig(this))
, m_bar(new BarConfig(this))
, m_border(new BorderConfig(this))
, m_dashboard(new DashboardConfig(this))
, m_controlCenter(new ControlCenterConfig(this))
, m_launcher(new LauncherConfig(this))
, m_notifs(new NotifsConfig(this))
, m_osd(new OsdConfig(this))
, m_session(new SessionConfig(this))
, m_winfo(new WInfoConfig(this))
, m_lock(new LockConfig(this))
, m_utilities(new UtilitiesConfig(this))
, m_sidebar(new SidebarConfig(this))
, m_services(new ServiceConfig(this))
, m_paths(new UserPaths(this)) {
if (!filePath.isEmpty())
setupFileBackend(filePath, screen);
if (fallback)
syncFromGlobal(fallback);
// Bind appearance computed properties to token base values
bindAppearanceTokens();
}
GlobalConfig* GlobalConfig::instance() {
static GlobalConfig instance;
instance.bindAppearanceTokens();
return &instance;
}
GlobalConfig* GlobalConfig::defaults() {
if (!m_defaults)
m_defaults = new GlobalConfig(nullptr, QString(), QString(), this);
return m_defaults;
}
void GlobalConfig::bindAppearanceTokens() {
if (m_tokensBound)
return;
qCDebug(lcConfig) << "GlobalConfig::bindAppearanceTokens: binding appearance to token values";
auto* const tokenAppearance = TokenConfig::instance()->appearance();
m_appearance->rounding()->bindTokens(tokenAppearance->rounding());
m_appearance->spacing()->bindTokens(tokenAppearance->spacing());
m_appearance->padding()->bindTokens(tokenAppearance->padding());
m_appearance->anim()->durations()->bindTokens(tokenAppearance->animDurations());
m_tokensBound = true;
}
GlobalConfig* GlobalConfig::forScreen(const QString& screen) {
return MonitorConfigManager::instance()->configForScreen(screen);
}
GlobalConfig* GlobalConfig::create(QQmlEngine*, QJSEngine*) {
QQmlEngine::setObjectOwnership(instance(), QQmlEngine::CppOwnership);
return instance();
}
} // namespace caelestia::config