X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fsettings.h;h=0c9a155db4f0ac258259166a13f8a3311490db65;hb=6ccb5835ff55d85156be91473c598eca9d6cb9a6;hp=542fae2a40bbddc51acd7d5111c73daeefa44400;hpb=360660947b8137fba78981932de6b503b9889e62;p=dragonfireclient.git diff --git a/src/settings.h b/src/settings.h index 542fae2a4..0c9a155db 100644 --- a/src/settings.h +++ b/src/settings.h @@ -17,21 +17,33 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef SETTINGS_HEADER -#define SETTINGS_HEADER +#pragma once #include "irrlichttypes_bloated.h" #include "util/string.h" -#include "jthread/jmutex.h" #include -#include #include #include +#include class Settings; +struct NoiseParams; -/** function type to register a changed callback */ -typedef void (*setting_changed_callback)(const std::string); +// Global objects +extern Settings *g_settings; +extern std::string g_settings_path; + +// Type for a settings changed callback function +typedef void (*SettingsChangedCallback)(const std::string &name, void *data); + +typedef std::vector< + std::pair< + SettingsChangedCallback, + void * + > +> SettingsCallbackList; + +typedef std::unordered_map SettingsCallbackMap; enum ValueType { VALUETYPE_STRING, @@ -54,49 +66,39 @@ struct ValueSpec { type = a_type; help = a_help; } + ValueType type; const char *help; }; -/** function type to register a changed callback */ - struct SettingsEntry { - SettingsEntry() - { - group = NULL; - } + SettingsEntry() = default; - SettingsEntry(const std::string &value_) - { - value = value_; - group = NULL; - } + SettingsEntry(const std::string &value_) : + value(value_) + {} - SettingsEntry(Settings *group_) - { - group = group_; - } - - SettingsEntry(const std::string &value_, Settings *group_) - { - value = value_; - group = group_; - } + SettingsEntry(Settings *group_) : + group(group_), + is_group(true) + {} - std::string value; - Settings *group; + std::string value = ""; + Settings *group = nullptr; + bool is_group = false; }; +typedef std::unordered_map SettingEntries; class Settings { public: - Settings() {} + Settings() = default; + ~Settings(); Settings & operator += (const Settings &other); Settings & operator = (const Settings &other); - /*********************** * Reading and writing * ***********************/ @@ -116,21 +118,25 @@ class Settings { bool updateConfigObject(std::istream &is, std::ostream &os, const std::string &end, u32 tab_depth=0); - static std::string getMultiline(std::istream &is); - static std::string sanitizeString(const std::string &value); - static void printValue(std::ostream &os, const std::string &name, - const SettingsEntry &entry, bool is_value_multiline, u32 tab_depth=0); + static bool checkNameValid(const std::string &name); + static bool checkValueValid(const std::string &value); + static std::string getMultiline(std::istream &is, size_t *num_lines=NULL); + static void printEntry(std::ostream &os, const std::string &name, + const SettingsEntry &entry, u32 tab_depth=0); /*********** * Getters * ***********/ const SettingsEntry &getEntry(const std::string &name) const; + const SettingsEntry &getEntryDefault(const std::string &name) const; Settings *getGroup(const std::string &name) const; - std::string get(const std::string &name) const; + const std::string &get(const std::string &name) const; + const std::string &getDefault(const std::string &name) const; bool getBool(const std::string &name) const; u16 getU16(const std::string &name) const; s16 getS16(const std::string &name) const; + u32 getU32(const std::string &name) const; s32 getS32(const std::string &name) const; u64 getU64(const std::string &name) const; float getFloat(const std::string &name) const; @@ -142,6 +148,9 @@ class Settings { // the behavior is undefined. bool getStruct(const std::string &name, const std::string &format, void *out, size_t olen) const; + bool getNoiseParams(const std::string &name, NoiseParams &np) const; + bool getNoiseParamsFromValue(const std::string &name, NoiseParams &np) const; + bool getNoiseParamsFromGroup(const std::string &name, NoiseParams &np) const; // return all keys used std::vector getNames() const; @@ -153,8 +162,10 @@ class Settings { ***************************************/ bool getEntryNoEx(const std::string &name, SettingsEntry &val) const; + bool getEntryDefaultNoEx(const std::string &name, SettingsEntry &val) const; bool getGroupNoEx(const std::string &name, Settings *&val) const; bool getNoEx(const std::string &name, std::string &val) const; + bool getDefaultNoEx(const std::string &name, std::string &val) const; bool getFlag(const std::string &name) const; bool getU16NoEx(const std::string &name, u16 &val) const; bool getS16NoEx(const std::string &name, s16 &val) const; @@ -163,10 +174,12 @@ class Settings { bool getFloatNoEx(const std::string &name, float &val) const; bool getV2FNoEx(const std::string &name, v2f &val) const; bool getV3FNoEx(const std::string &name, v3f &val) const; - // N.B. getFlagStrNoEx() does not set val, but merely modifies it. Thus, - // val must be initialized before using getFlagStrNoEx(). The intention of - // this is to simplify modifying a flags field from a default value. - bool getFlagStrNoEx(const std::string &name, u32 &val, FlagDesc *flagdesc) const; + + // Like other getters, but handling each flag individualy: + // 1) Read default flags (or 0) + // 2) Override using user-defined flags + bool getFlagStrNoEx(const std::string &name, u32 &val, + const FlagDesc *flagdesc) const; /*********** @@ -175,19 +188,24 @@ class Settings { // N.B. Groups not allocated with new must be set to NULL in the settings // tree before object destruction. - void set(const std::string &name, const std::string &value); - void setGroup(const std::string &name, Settings *group); - void setDefault(const std::string &name, const std::string &value); - void setGroupDefault(const std::string &name, Settings *group); - void setBool(const std::string &name, bool value); - void setS16(const std::string &name, s16 value); - void setS32(const std::string &name, s32 value); - void setU64(const std::string &name, u64 value); - void setFloat(const std::string &name, float value); - void setV2F(const std::string &name, v2f value); - void setV3F(const std::string &name, v3f value); - void setFlagStr(const std::string &name, u32 flags, - const FlagDesc *flagdesc, u32 flagmask); + bool setEntry(const std::string &name, const void *entry, + bool set_group, bool set_default); + bool set(const std::string &name, const std::string &value); + bool setDefault(const std::string &name, const std::string &value); + bool setGroup(const std::string &name, Settings *group); + bool setGroupDefault(const std::string &name, Settings *group); + bool setBool(const std::string &name, bool value); + bool setS16(const std::string &name, s16 value); + bool setU16(const std::string &name, u16 value); + bool setS32(const std::string &name, s32 value); + bool setU64(const std::string &name, u64 value); + bool setFloat(const std::string &name, float value); + bool setV2F(const std::string &name, v2f value); + bool setV3F(const std::string &name, v3f value); + bool setFlagStr(const std::string &name, u32 flags, + const FlagDesc *flagdesc = nullptr, u32 flagmask = U32_MAX); + bool setNoiseParams(const std::string &name, const NoiseParams &np, + bool set_default=false); // N.B. if setStruct() is used to write a non-POD aggregate type, // the behavior is undefined. bool setStruct(const std::string &name, const std::string &format, void *value); @@ -195,23 +213,40 @@ class Settings { // remove a setting bool remove(const std::string &name); void clear(); + void clearDefaults(); void updateValue(const Settings &other, const std::string &name); void update(const Settings &other); - void registerChangedCallback(std::string name, setting_changed_callback cbf); -private: + /************** + * Miscellany * + **************/ + void setDefault(const std::string &name, const FlagDesc *flagdesc, u32 flags); + // Takes the provided setting values and uses them as new defaults + void overrideDefaults(Settings *other); + const FlagDesc *getFlagDescFallback(const std::string &name) const; + + void registerChangedCallback(const std::string &name, + SettingsChangedCallback cbf, void *userdata = NULL); + void deregisterChangedCallback(const std::string &name, + SettingsChangedCallback cbf, void *userdata = NULL); + +private: void updateNoLock(const Settings &other); void clearNoLock(); + void clearDefaultsNoLock(); - void doCallbacks(std::string name); + void doCallbacks(const std::string &name) const; - std::map m_settings; - std::map m_defaults; - std::map > m_callbacks; - // All methods that access m_settings/m_defaults directly should lock this. - mutable JMutex m_mutex; -}; + SettingEntries m_settings; + SettingEntries m_defaults; + std::unordered_map m_flags; + + SettingsCallbackMap m_callbacks; -#endif + mutable std::mutex m_callback_mutex; + // All methods that access m_settings/m_defaults directly should lock this. + mutable std::mutex m_mutex; + +};