fix: per monitor configs
Use c++ singleton pattern for monitor manager and bind appearance tokens properly Also use scoped properties on ContentWindow
This commit is contained in:
parent
37b61fedc9
commit
9be9ec10a6
5 changed files with 27 additions and 46 deletions
|
|
@ -8,6 +8,7 @@ PanelWindow {
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
required property string name
|
required property string name
|
||||||
|
readonly property alias configScope: scope
|
||||||
default property alias contentData: scope.data
|
default property alias contentData: scope.data
|
||||||
|
|
||||||
WlrLayershell.namespace: `caelestia-${name}`
|
WlrLayershell.namespace: `caelestia-${name}`
|
||||||
|
|
|
||||||
|
|
@ -30,9 +30,9 @@ StyledWindow {
|
||||||
}
|
}
|
||||||
return monitor?.activeWorkspace?.toplevels.values.some(t => t.lastIpcObject.fullscreen > 1) ?? false;
|
return monitor?.activeWorkspace?.toplevels.values.some(t => t.lastIpcObject.fullscreen > 1) ?? false;
|
||||||
}
|
}
|
||||||
property real borderThickness: hasFullscreen ? 0 : Config.border.thickness
|
property real borderThickness: hasFullscreen ? 0 : configScope.Config.border.thickness
|
||||||
readonly property real borderLayoutThickness: hasFullscreen ? 0 : Config.border.thickness
|
readonly property real borderLayoutThickness: hasFullscreen ? 0 : configScope.Config.border.thickness
|
||||||
property real borderRounding: hasFullscreen ? 0 : Config.border.rounding
|
property real borderRounding: hasFullscreen ? 0 : configScope.Config.border.rounding
|
||||||
property real shadowOpacity: hasFullscreen ? 0 : 0.7
|
property real shadowOpacity: hasFullscreen ? 0 : 0.7
|
||||||
|
|
||||||
readonly property int dragMaskPadding: {
|
readonly property int dragMaskPadding: {
|
||||||
|
|
@ -44,8 +44,8 @@ StyledWindow {
|
||||||
|
|
||||||
const thresholds = [];
|
const thresholds = [];
|
||||||
for (const panel of ["dashboard", "launcher", "session", "sidebar"])
|
for (const panel of ["dashboard", "launcher", "session", "sidebar"])
|
||||||
if (Config[panel].enabled)
|
if (configScope.Config[panel].enabled)
|
||||||
thresholds.push(Config[panel].dragThreshold);
|
thresholds.push(configScope.Config[panel].dragThreshold);
|
||||||
return Math.max(...thresholds);
|
return Math.max(...thresholds);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -61,6 +61,9 @@ GlobalConfig::GlobalConfig(GlobalConfig* fallback, const QString& filePath, QObj
|
||||||
setupFileBackend(filePath);
|
setupFileBackend(filePath);
|
||||||
if (fallback)
|
if (fallback)
|
||||||
syncFromGlobal(fallback);
|
syncFromGlobal(fallback);
|
||||||
|
|
||||||
|
// Bind appearance computed properties to token base values
|
||||||
|
bindAppearanceTokens();
|
||||||
}
|
}
|
||||||
|
|
||||||
GlobalConfig* GlobalConfig::instance() {
|
GlobalConfig* GlobalConfig::instance() {
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,6 @@
|
||||||
|
|
||||||
namespace caelestia::config {
|
namespace caelestia::config {
|
||||||
|
|
||||||
MonitorConfigManager* MonitorConfigManager::s_instance = nullptr;
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
QString monitorConfigDir(const QString& screen) {
|
QString monitorConfigDir(const QString& screen) {
|
||||||
|
|
@ -18,52 +16,34 @@ QString monitorConfigDir(const QString& screen) {
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
MonitorConfigManager::MonitorConfigManager(QObject* parent)
|
MonitorConfigManager::MonitorConfigManager(QObject* parent)
|
||||||
: QObject(parent) {
|
: QObject(parent) {}
|
||||||
s_instance = this;
|
|
||||||
}
|
|
||||||
|
|
||||||
MonitorConfigManager::~MonitorConfigManager() {
|
|
||||||
s_instance = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
MonitorConfigManager* MonitorConfigManager::instance() {
|
MonitorConfigManager* MonitorConfigManager::instance() {
|
||||||
return s_instance;
|
static MonitorConfigManager instance;
|
||||||
|
return &instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
MonitorConfigManager* MonitorConfigManager::create(QQmlEngine* engine, QJSEngine*) {
|
MonitorConfigManager* MonitorConfigManager::create(QQmlEngine*, QJSEngine*) {
|
||||||
return new MonitorConfigManager(engine);
|
QQmlEngine::setObjectOwnership(instance(), QQmlEngine::CppOwnership);
|
||||||
|
return instance();
|
||||||
}
|
}
|
||||||
|
|
||||||
GlobalConfig* MonitorConfigManager::configForScreen(const QString& screen) {
|
GlobalConfig* MonitorConfigManager::configForScreen(const QString& screen) {
|
||||||
auto it = m_overlays.find(screen);
|
auto& overlay = m_overlays[screen];
|
||||||
if (it != m_overlays.end() && it->config)
|
if (!overlay.config) {
|
||||||
return it->config;
|
|
||||||
|
|
||||||
auto* global = GlobalConfig::instance();
|
|
||||||
if (!global)
|
|
||||||
return nullptr;
|
|
||||||
|
|
||||||
auto dir = monitorConfigDir(screen);
|
auto dir = monitorConfigDir(screen);
|
||||||
auto* overlay = new GlobalConfig(global, dir + QStringLiteral("shell.json"), this);
|
overlay.config = new GlobalConfig(GlobalConfig::instance(), dir + QStringLiteral("shell.json"), this);
|
||||||
|
}
|
||||||
m_overlays[screen].config = overlay;
|
return overlay.config;
|
||||||
return overlay;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TokenConfig* MonitorConfigManager::tokensForScreen(const QString& screen) {
|
TokenConfig* MonitorConfigManager::tokensForScreen(const QString& screen) {
|
||||||
auto it = m_overlays.find(screen);
|
auto& overlay = m_overlays[screen];
|
||||||
if (it != m_overlays.end() && it->tokens)
|
if (!overlay.tokens) {
|
||||||
return it->tokens;
|
|
||||||
|
|
||||||
auto* global = TokenConfig::instance();
|
|
||||||
if (!global)
|
|
||||||
return nullptr;
|
|
||||||
|
|
||||||
auto dir = monitorConfigDir(screen);
|
auto dir = monitorConfigDir(screen);
|
||||||
auto* overlay = new TokenConfig(global, dir + QStringLiteral("shell-tokens.json"), this);
|
overlay.tokens = new TokenConfig(TokenConfig::instance(), dir + QStringLiteral("shell-tokens.json"), this);
|
||||||
|
}
|
||||||
m_overlays[screen].tokens = overlay;
|
return overlay.tokens;
|
||||||
return overlay;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace caelestia::config
|
} // namespace caelestia::config
|
||||||
|
|
|
||||||
|
|
@ -21,8 +21,6 @@ public:
|
||||||
[[nodiscard]] Q_INVOKABLE GlobalConfig* configForScreen(const QString& screen);
|
[[nodiscard]] Q_INVOKABLE GlobalConfig* configForScreen(const QString& screen);
|
||||||
[[nodiscard]] Q_INVOKABLE TokenConfig* tokensForScreen(const QString& screen);
|
[[nodiscard]] Q_INVOKABLE TokenConfig* tokensForScreen(const QString& screen);
|
||||||
|
|
||||||
~MonitorConfigManager() override;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
explicit MonitorConfigManager(QObject* parent = nullptr);
|
explicit MonitorConfigManager(QObject* parent = nullptr);
|
||||||
|
|
||||||
|
|
@ -32,7 +30,6 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
QHash<QString, ScreenOverlay> m_overlays;
|
QHash<QString, ScreenOverlay> m_overlays;
|
||||||
static MonitorConfigManager* s_instance;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace caelestia::config
|
} // namespace caelestia::config
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue