/* +--------------------------------------------------------------+ ____/ \____ /| - zlib/MIT/Unlicenced game framework licensed to freely use, | \ / / | copy, modify and sell without restriction | +--\ ^__^ /--+ | | | ~/ \~ | | - originally created at [http://nugget.fun] | | ~~~~~~~~~~~~ | +--------------------------------------------------------------+ | SPACE ~~~~~ | / | ~~~~~~~ BOX |/ +-------------*/ #ifndef SB_CONFIGURATION_H_ #define SB_CONFIGURATION_H_ #include #include #include #include "json/json.hpp" #include "filesystem.hpp" #include "Node.hpp" #include "Animation.hpp" #include "Log.hpp" #include "extension.hpp" class Configuration : public Node { private: nlohmann::json sys_config, user_config; fs::path config_path; int tab_width = 4; Animation auto_refresher = Animation(&Configuration::refresh, this); fs::file_time_type config_file_modification_time; void set_defaults(); void merge(); public: nlohmann::json config; Configuration(Node*, fs::path = "config.json"); void load(fs::path path); void load(); void auto_refresh(bool); void refresh(); void write(fs::path path); void write(); void update(); virtual std::string class_name() const { return "Configuration"; } }; /* Extend GLM so nlohmann::json can read and write glm::vec2 */ namespace glm { template void to_json(nlohmann::json& j, const vec<2, T, defaultp>& v) { j = nlohmann::json{v.x, v.y}; } template void from_json(const nlohmann::json& j, vec<2, T, defaultp>& v) { j.at(0).get_to(v.x); j.at(1).get_to(v.y); } } /* Extend std::filesystem so nlohmann::json can read and write std::filesystem::path */ #if defined(__MINGW32__) namespace std::experimental::filesystem #else namespace std::filesystem #endif { template void to_json(nlohmann::json& j, const path& p) { j = nlohmann::json{p}; } template void from_json(const nlohmann::json& j, path& p) { j.at(0).get_to(p); } } #endif