diff --git a/map/src/MapWindow/BaseWindow.cpp b/map/src/MapWindow/BaseWindow.cpp index 4b9bd5e8..54f1dab9 100644 --- a/map/src/MapWindow/BaseWindow.cpp +++ b/map/src/MapWindow/BaseWindow.cpp @@ -192,6 +192,7 @@ void Satisfactory3DMap::BaseWindow::run() { return; } running_ = true; + config_->registerDone(); while (!glfwWindowShouldClose(window_)) { draw(); glfwSwapBuffers(window_); diff --git a/map/src/MapWindow/Config/Configuration.cpp b/map/src/MapWindow/Config/Configuration.cpp index f7764125..2f2e916d 100644 --- a/map/src/MapWindow/Config/Configuration.cpp +++ b/map/src/MapWindow/Config/Configuration.cpp @@ -28,6 +28,9 @@ Satisfactory3DMap::Configuration::Configuration() { } void Satisfactory3DMap::Configuration::registerSetting(std::shared_ptr setting) { + if (registerDone_) { + spdlog::error("Register setting after register done: {}", setting->name()); + } setting->registerConfig(weak_from_this()); try { if (json_.contains(setting->name())) { @@ -39,13 +42,24 @@ void Satisfactory3DMap::Configuration::registerSetting(std::shared_ptr settings_.emplace_back(std::move(setting)); } +void Satisfactory3DMap::Configuration::registerDone() { + registerDone_ = true; + if (requestSave_) { + saveOnDisk(); + } +} + void Satisfactory3DMap::Configuration::requestSave() { + requestSave_ = true; // TODO cache save request and only write every x seconds to disk. - saveOnDisk(); + if (registerDone_) { + saveOnDisk(); + } } -void Satisfactory3DMap::Configuration::saveOnDisk() const { +void Satisfactory3DMap::Configuration::saveOnDisk() { try { + requestSave_ = false; nlohmann::json j; for (const auto& s : settings_) { nlohmann::json serialized; diff --git a/map/src/MapWindow/Config/Configuration.h b/map/src/MapWindow/Config/Configuration.h index 20636f17..8c25eefd 100644 --- a/map/src/MapWindow/Config/Configuration.h +++ b/map/src/MapWindow/Config/Configuration.h @@ -21,12 +21,18 @@ namespace Satisfactory3DMap { void registerSetting(std::shared_ptr setting); + /* + * Call once after all initialization is done! All save requests are blocked by this to avoid writing an + * incomplete configuration before all settings are registered. + */ + void registerDone(); + void requestSave(); protected: Configuration(); - void saveOnDisk() const; + void saveOnDisk(); friend class SettingsWindow; @@ -36,5 +42,7 @@ namespace Satisfactory3DMap { nlohmann::json json_; std::vector> settings_; + bool registerDone_ = false; + bool requestSave_ = false; }; } // namespace Satisfactory3DMap