From bea72b4a640786c84495705bf7cd9af09111c1b8 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sun, 12 Apr 2026 03:20:25 +1000 Subject: [PATCH] feat: emit signals on startup Except loaded signal --- plugin/src/Caelestia/Config/rootconfig.cpp | 37 +++++++++++++++------- plugin/src/Caelestia/Config/rootconfig.hpp | 2 ++ 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/plugin/src/Caelestia/Config/rootconfig.cpp b/plugin/src/Caelestia/Config/rootconfig.cpp index 8a10c950..611abd57 100644 --- a/plugin/src/Caelestia/Config/rootconfig.cpp +++ b/plugin/src/Caelestia/Config/rootconfig.cpp @@ -102,7 +102,13 @@ void RootConfig::setupFileBackend(const QString& path, const QString& screen) { qCDebug(lcConfig) << "Setting up file backend for" << metaObject()->className() << "at" << path; updateWatch(); - reload(); + + // Load immediately so values are available during construction. + // Defer signal emissions to next event loop tick so QML has time to connect. + auto result = reloadFromFile(); + QTimer::singleShot(0, this, [this, result] { + emitLoadSignals(result, false); + }); } void RootConfig::updateWatch() { @@ -189,12 +195,11 @@ std::optional RootConfig::reloadFromFile() { clearLoadedKeys(); auto jsonObj = doc.object(); - const auto unknownKeys = collectUnknownKeys(this, jsonObj); - for (const auto& key : unknownKeys) - emit unknownOption(key, m_screen); - loadFromJson(jsonObj); + // Collect unknown keys — caller is responsible for emitting signals + m_lastUnknownKeys = collectUnknownKeys(this, jsonObj); + return QString(); // success } @@ -202,14 +207,24 @@ void RootConfig::save() { saveToFile(); } -void RootConfig::reload() { - auto result = reloadFromFile(); - if (result.has_value()) { - if (result->isEmpty()) +void RootConfig::emitLoadSignals(const std::optional& result, bool emitLoaded) { + if (!result.has_value()) + return; + + for (const auto& key : std::as_const(m_lastUnknownKeys)) + emit unknownOption(key, m_screen); + m_lastUnknownKeys.clear(); + + if (result->isEmpty()) { + if (emitLoaded) emit loaded(m_screen); - else - emit loadFailed(*result, m_screen); + } else { + emit loadFailed(*result, m_screen); } } +void RootConfig::reload() { + emitLoadSignals(reloadFromFile()); +} + } // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/rootconfig.hpp b/plugin/src/Caelestia/Config/rootconfig.hpp index 25b69002..fb6a68b5 100644 --- a/plugin/src/Caelestia/Config/rootconfig.hpp +++ b/plugin/src/Caelestia/Config/rootconfig.hpp @@ -35,6 +35,7 @@ signals: private: static QStringList collectUnknownKeys(const ConfigObject* obj, const QJsonObject& json); + void emitLoadSignals(const std::optional& result, bool emitLoaded = true); void updateWatch(); void onWatcherEvent(); @@ -49,6 +50,7 @@ private: QTimer* m_retryTimer = nullptr; QTimer* m_reloadDebounce = nullptr; int m_parseRetries = 0; + QStringList m_lastUnknownKeys; }; } // namespace caelestia::config