skins.hpp (1594B)
1 #pragma once 2 3 #include "rack.hpp" 4 #include <mutex> 5 #include <string> 6 #include <unordered_map> 7 #include <unordered_set> 8 #include <vector> 9 10 struct DefaultSkinChangeListener { 11 virtual void defaultSkinChanged(const std::string& skin) = 0; 12 }; 13 14 struct Skin { 15 std::string key; 16 std::string display; 17 18 Skin(const char* key, const char* display) : key(key), display(display) {} 19 }; 20 21 class Skins { 22 private: 23 typedef std::unordered_map<std::string, std::string> css_values_map; 24 typedef std::unordered_map<std::string, css_values_map> skin_css_values_map; 25 typedef std::unordered_set<DefaultSkinChangeListener*> default_skin_listeners_set; 26 std::vector<Skin> _available; 27 std::string _default; 28 skin_css_values_map _skinCssValues; 29 default_skin_listeners_set _defaultSkinListeners; 30 std::mutex _defaultSkinListenersLock; 31 bool _loaded = false; 32 std::mutex _instanceLock; 33 34 public: 35 Skins() {} 36 Skins(const Skins&) = delete; 37 void operator=(const Skins&) = delete; 38 39 static Skins& skins(); 40 inline const std::vector<Skin>& available() const { return _available; } 41 inline const std::string& defaultKey() const { return _default; } 42 bool validKey(const std::string& key) const; 43 const char* skinCssValue(const std::string& skinKey, const std::string& valueKey) const; 44 static NVGcolor cssColorToNVGColor(const char* color, const NVGcolor& ifError); 45 46 void setDefaultSkin(std::string skinKey); 47 void registerDefaultSkinChangeListener(DefaultSkinChangeListener* listener); 48 void deregisterDefaultSkinChangeListener(DefaultSkinChangeListener* listener); 49 50 private: 51 void loadSkins(); 52 void loadCssValues(); 53 };