From 67881d31d58f5371e5b5fa07ac1dd7a944d46941 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Fri, 6 Oct 2023 05:05:59 -0500 Subject: [PATCH] Make SettingsManager an object instead of a namespace --- scwx-qt/source/scwx/qt/main/main.cpp | 4 +- .../scwx/qt/manager/settings_manager.cpp | 76 ++++++++++++------- .../scwx/qt/manager/settings_manager.hpp | 28 +++++-- scwx-qt/source/scwx/qt/ui/settings_dialog.cpp | 2 +- .../scwx/qt/manager/settings_manager.test.cpp | 8 +- 5 files changed, 76 insertions(+), 42 deletions(-) diff --git a/scwx-qt/source/scwx/qt/main/main.cpp b/scwx-qt/source/scwx/qt/main/main.cpp index b841b846..4c0bdac4 100644 --- a/scwx-qt/source/scwx/qt/main/main.cpp +++ b/scwx-qt/source/scwx/qt/main/main.cpp @@ -69,7 +69,7 @@ int main(int argc, char* argv[]) // Initialize application scwx::qt::config::RadarSite::Initialize(); - scwx::qt::manager::SettingsManager::Initialize(); + scwx::qt::manager::SettingsManager::Instance().Initialize(); scwx::qt::manager::ResourceManager::Initialize(); // Run Qt main loop @@ -89,7 +89,7 @@ int main(int argc, char* argv[]) // Shutdown application scwx::qt::manager::ResourceManager::Shutdown(); - scwx::qt::manager::SettingsManager::Shutdown(); + scwx::qt::manager::SettingsManager::Instance().Shutdown(); // Shutdown AWS SDK Aws::ShutdownAPI(awsSdkOptions); diff --git a/scwx-qt/source/scwx/qt/manager/settings_manager.cpp b/scwx-qt/source/scwx/qt/manager/settings_manager.cpp index 1a2f6c04..083453ac 100644 --- a/scwx-qt/source/scwx/qt/manager/settings_manager.cpp +++ b/scwx-qt/source/scwx/qt/manager/settings_manager.cpp @@ -21,21 +21,33 @@ namespace qt { namespace manager { -namespace SettingsManager -{ static const std::string logPrefix_ = "scwx::qt::manager::settings_manager"; static const auto logger_ = scwx::util::Logger::Create(logPrefix_); -static boost::json::value ConvertSettingsToJson(); -static void GenerateDefaultSettings(); -static bool LoadSettings(const boost::json::object& settingsJson); -static void ValidateSettings(); +class SettingsManager::Impl +{ +public: + explicit Impl(SettingsManager* self) : self_ {self} {} + ~Impl() = default; -static bool initialized_ {false}; -static std::string settingsPath_ {}; + void ValidateSettings(); -void Initialize() + static boost::json::value ConvertSettingsToJson(); + static void GenerateDefaultSettings(); + static bool LoadSettings(const boost::json::object& settingsJson); + + SettingsManager* self_; + + bool initialized_ {false}; + std::string settingsPath_ {}; +}; + +SettingsManager::SettingsManager() : p(std::make_unique(this)) {} + +SettingsManager::~SettingsManager() {}; + +void SettingsManager::Initialize() { std::string appDataPath { QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) @@ -50,14 +62,14 @@ void Initialize() } } - settingsPath_ = appDataPath + "/settings.json"; - initialized_ = true; + p->settingsPath_ = appDataPath + "/settings.json"; + p->initialized_ = true; - ReadSettings(settingsPath_); - ValidateSettings(); + ReadSettings(p->settingsPath_); + p->ValidateSettings(); } -void ReadSettings(const std::string& settingsPath) +void SettingsManager::ReadSettings(const std::string& settingsPath) { boost::json::value settingsJson = nullptr; @@ -68,34 +80,34 @@ void ReadSettings(const std::string& settingsPath) if (settingsJson == nullptr || !settingsJson.is_object()) { - GenerateDefaultSettings(); - settingsJson = ConvertSettingsToJson(); + Impl::GenerateDefaultSettings(); + settingsJson = Impl::ConvertSettingsToJson(); util::json::WriteJsonFile(settingsPath, settingsJson); } else { - bool jsonDirty = LoadSettings(settingsJson.as_object()); + bool jsonDirty = Impl::LoadSettings(settingsJson.as_object()); if (jsonDirty) { - settingsJson = ConvertSettingsToJson(); + settingsJson = Impl::ConvertSettingsToJson(); util::json::WriteJsonFile(settingsPath, settingsJson); } }; } -void SaveSettings() +void SettingsManager::SaveSettings() { - if (initialized_) + if (p->initialized_) { logger_->info("Saving settings"); - boost::json::value settingsJson = ConvertSettingsToJson(); - util::json::WriteJsonFile(settingsPath_, settingsJson); + boost::json::value settingsJson = Impl::ConvertSettingsToJson(); + util::json::WriteJsonFile(p->settingsPath_, settingsJson); } } -void Shutdown() +void SettingsManager::Shutdown() { bool dataChanged = false; @@ -109,7 +121,7 @@ void Shutdown() } } -static boost::json::value ConvertSettingsToJson() +boost::json::value SettingsManager::Impl::ConvertSettingsToJson() { boost::json::object settingsJson; @@ -122,7 +134,7 @@ static boost::json::value ConvertSettingsToJson() return settingsJson; } -static void GenerateDefaultSettings() +void SettingsManager::Impl::GenerateDefaultSettings() { logger_->info("Generating default settings"); @@ -133,7 +145,8 @@ static void GenerateDefaultSettings() settings::UiSettings::Instance().SetDefaults(); } -static bool LoadSettings(const boost::json::object& settingsJson) +bool SettingsManager::Impl::LoadSettings( + const boost::json::object& settingsJson) { logger_->info("Loading settings"); @@ -148,7 +161,7 @@ static bool LoadSettings(const boost::json::object& settingsJson) return jsonDirty; } -static void ValidateSettings() +void SettingsManager::Impl::ValidateSettings() { logger_->debug("Validating settings"); @@ -185,11 +198,16 @@ static void ValidateSettings() if (settingsChanged) { - SaveSettings(); + self_->SaveSettings(); } } -} // namespace SettingsManager +SettingsManager& SettingsManager::Instance() +{ + static SettingsManager instance_ {}; + return instance_; +} + } // namespace manager } // namespace qt } // namespace scwx diff --git a/scwx-qt/source/scwx/qt/manager/settings_manager.hpp b/scwx-qt/source/scwx/qt/manager/settings_manager.hpp index 5cc17b19..e2115e93 100644 --- a/scwx-qt/source/scwx/qt/manager/settings_manager.hpp +++ b/scwx-qt/source/scwx/qt/manager/settings_manager.hpp @@ -1,6 +1,9 @@ #pragma once #include +#include + +#include namespace scwx { @@ -8,15 +11,28 @@ namespace qt { namespace manager { -namespace SettingsManager + +class SettingsManager : public QObject { + Q_OBJECT + Q_DISABLE_COPY_MOVE(SettingsManager) -void Initialize(); -void ReadSettings(const std::string& settingsPath); -void SaveSettings(); -void Shutdown(); +public: + explicit SettingsManager(); + ~SettingsManager(); + + void Initialize(); + void ReadSettings(const std::string& settingsPath); + void SaveSettings(); + void Shutdown(); + + static SettingsManager& Instance(); + +private: + class Impl; + std::unique_ptr p; +}; -} // namespace SettingsManager } // namespace manager } // namespace qt } // namespace scwx diff --git a/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp b/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp index 44a36bf0..bfc17967 100644 --- a/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp +++ b/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp @@ -989,7 +989,7 @@ void SettingsDialogImpl::ApplyChanges() if (committed) { - manager::SettingsManager::SaveSettings(); + manager::SettingsManager::Instance().SaveSettings(); } } diff --git a/test/source/scwx/qt/manager/settings_manager.test.cpp b/test/source/scwx/qt/manager/settings_manager.test.cpp index a4d69614..54df04df 100644 --- a/test/source/scwx/qt/manager/settings_manager.test.cpp +++ b/test/source/scwx/qt/manager/settings_manager.test.cpp @@ -76,7 +76,7 @@ TEST_F(SettingsManagerTest, CreateJson) // Verify file doesn't exist prior to test start EXPECT_EQ(std::filesystem::exists(filename), false); - SettingsManager::ReadSettings(filename); + SettingsManager::Instance().ReadSettings(filename); EXPECT_EQ(std::filesystem::exists(filename), true); @@ -92,7 +92,7 @@ TEST_F(SettingsManagerTest, SettingsKeax) std::string filename(std::string(SCWX_TEST_DATA_DIR) + "/json/settings/settings-keax.json"); - SettingsManager::ReadSettings(filename); + SettingsManager::Instance().ReadSettings(filename); EXPECT_EQ( settings::GeneralSettings::Instance().default_radar_site().GetValue(), @@ -112,7 +112,7 @@ TEST_P(DefaultSettingsTest, DefaultSettings) std::filesystem::copy_file(sourceFile, filename); - SettingsManager::ReadSettings(filename); + SettingsManager::Instance().ReadSettings(filename); VerifyDefaults(); CompareFiles(filename, DEFAULT_SETTINGS_FILE); @@ -140,7 +140,7 @@ TEST_P(BadSettingsTest, BadSettings) std::filesystem::copy_file(sourceFile, filename); - SettingsManager::ReadSettings(filename); + SettingsManager::Instance().ReadSettings(filename); CompareFiles(filename, goodFile);