#pragma once #include "globalincs/pstypes.h" #include "libs/jansson.h" #include namespace options { // Forward declaration class OptionBase; class OptionsManager { OptionsManager(); SCP_unordered_map> _config_overrides; SCP_unordered_map> _changed_values; SCP_unordered_map _optionsMapping; SCP_vector> _options; bool _optionsSorted = false; public: static OptionsManager* instance(); ~OptionsManager(); std::unique_ptr getValueFromConfig(const SCP_string& key) const; void setConfigValue(const SCP_string& key, std::unique_ptr&& value); void setOverride(const SCP_string& key, const SCP_string& json); const OptionBase* addOption(std::unique_ptr&& option); void removeOption(const OptionBase* option); const SCP_vector>& getOptions(); bool persistOptionChanges(const options::OptionBase* option); /** * @brief Persists changes to the disk * * This writes all the outstanding changes to the config file and returns a vector of all the options that indicated * that they could not change the value. If the return value is empty then all changes were applied but if it is not * empty then a restart is required for all the options to take effect. * * @return A vector of options that did not support changing the value */ SCP_vector persistChanges(); void discardChanges(); void loadInitialValues(); }; }