123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- /*
- * CConfigHandler.h, part of VCMI engine
- *
- * Authors: listed in file AUTHORS in main folder
- *
- * License: GNU General Public License v2.0 or later
- * Full text of license available in license.txt file, in main folder
- *
- */
- #pragma once
- #include "../lib/JsonNode.h"
- class Settings;
- class SettingsListener;
- /// Main storage of game settings
- class DLL_LINKAGE SettingsStorage
- {
- //Helper struct to access specific node either via chain of operator[] or with one operator() (vector)
- template<typename Accessor>
- struct DLL_LINKAGE NodeAccessor
- {
- SettingsStorage & parent;
- std::vector<std::string> path;
- NodeAccessor(SettingsStorage & _parent, std::vector<std::string> _path);
- NodeAccessor<Accessor> operator [] (std::string nextNode) const;
- NodeAccessor<Accessor> operator () (std::vector<std::string> _path) const;
- operator Accessor() const;
- };
- std::set<SettingsListener*> listeners;
- JsonNode config;
- bool autoSaveConfig;
- JsonNode & getNode(std::vector<std::string> path);
- // Calls all required listeners
- void invalidateNode(const std::vector<std::string> &changedPath);
- Settings get(std::vector<std::string> path);
- public:
- // Initialize config structure
- SettingsStorage();
- void init(bool autoSave=false);
-
- // Get write access to config node at path
- const NodeAccessor<Settings> write;
- // Get access to listener at path
- const NodeAccessor<SettingsListener> listen;
- //Read access, see JsonNode::operator[]
- const JsonNode & operator [](std::string value) const;
- const JsonNode & toJsonNode() const;
- friend class SettingsListener;
- friend class Settings;
- };
- /// Class for listening changes in specific part of configuration (e.g. change of music volume)
- class DLL_LINKAGE SettingsListener
- {
- SettingsStorage &parent;
- // Path to this node
- std::vector<std::string> path;
- // Callback
- std::function<void(const JsonNode&)> callback;
- SettingsListener(SettingsStorage &_parent, const std::vector<std::string> &_path);
- // Executes callback if changedpath begins with path
- void nodeInvalidated(const std::vector<std::string> & changedPath);
- public:
- SettingsListener(const SettingsListener &sl);
- ~SettingsListener();
- // assign callback function
- void operator()(std::function<void(const JsonNode&)> _callback);
- friend class SettingsStorage;
- };
- /// System options, provides write access to config tree with auto-saving on change
- class DLL_LINKAGE Settings
- {
- SettingsStorage &parent;
- //path to this node
- std::vector<std::string> path;
- JsonNode &node;
- JsonNode copy;
-
- //Get access to node pointed by path
- Settings(SettingsStorage &_parent, const std::vector<std::string> &_path);
- public:
- //Saves config if it was modified
- ~Settings();
- //Returns node selected during construction
- JsonNode* operator ->();
- const JsonNode* operator ->() const;
- //Helper, replaces JsonNode::operator[]
- JsonNode& operator [](std::string value);
- const JsonNode& operator [](std::string value) const;
- friend class SettingsStorage;
- };
- namespace config
- {
- struct DLL_LINKAGE ButtonInfo
- {
- std::string defName;
- std::vector<std::string> additionalDefs;
- int x, y; //position on the screen
- bool playerColoured; //if true button will be colored to main player's color (works properly only for appropriate 8bpp graphics)
- };
- /// Struct which holds data about position of several GUI elements at the adventure map screen
- struct DLL_LINKAGE AdventureMapConfig
- {
- //minimap properties
- int minimapX, minimapY, minimapW, minimapH;
- //statusbar
- int statusbarX, statusbarY; //pos
- std::string statusbarG; //graphic name
- //resdatabar
- int resdatabarX, resdatabarY, resDist, resDateDist, resOffsetX, resOffsetY; //pos
- std::string resdatabarG; //graphic name
- //infobox
- int infoboxX, infoboxY;
- //advmap
- int advmapX, advmapY, advmapW, advmapH;
- bool smoothMove;
- bool puzzleSepia;
- bool screenFading;
- bool objectFading;
- //general properties
- std::string mainGraphic;
- std::string worldViewGraphic;
- //buttons
- ButtonInfo kingOverview, underground, questlog, sleepWake, moveHero, spellbook, advOptions,
- sysOptions, nextHero, endTurn;
- //hero list
- int hlistX, hlistY, hlistSize;
- std::string hlistMB, hlistMN, hlistAU, hlistAD;
- //town list
- int tlistX, tlistY, tlistSize;
- std::string tlistAU, tlistAD;
- //gems
- int gemX[4], gemY[4];
- std::vector<std::string> gemG;
- //in-game console
- int inputLineLength, outputLineLength;
- //kingdom overview
- int overviewPics, overviewSize; //pic count in def and count of visible slots
- std::string overviewBg; //background name
- };
- struct DLL_LINKAGE GUIOptions
- {
- AdventureMapConfig ac;
- };
- /// Handles adventure map screen settings
- class DLL_LINKAGE CConfigHandler
- {
- GUIOptions *current; // pointer to current gui options
- public:
- typedef std::map<std::pair<int,int>, GUIOptions > GuiOptionsMap;
- GuiOptionsMap guiOptions;
- void init();
- CConfigHandler();
- ~CConfigHandler();
- GUIOptions *go() { return current; };
- void SetResolution(int x, int y)
- {
- std::pair<int,int> index(x, y);
- if (guiOptions.count(index) == 0)
- current = nullptr;
- else
- current = &guiOptions.at(index);
- }
- };
- }
- extern DLL_LINKAGE SettingsStorage settings;
- extern DLL_LINKAGE config::CConfigHandler conf;
|