#pragma once #include "compat/misc.h" #include #include #include #include #include namespace profile { const int Mod_Ctrl = 0x1 << 30; const int Mod_Alt = 0x1 << 29; const int Mod_Shift = 0x1 << 28; struct Keybind { virtual void call(bool pressed) = 0; virtual ~Keybind() {}; }; struct BindDescriptor { int id; std::string name; Keybind* bind; std::vector defaults; std::vector current; }; struct BindGroup { std::string name; std::vector descriptors; umap descriptorIDs; umap binds; void addDescriptor(BindDescriptor desc); void addBind(const std::string& name, Keybind* bind); void addBind(unsigned id, Keybind* bind); void setBind(int key, const std::string& name); void setBind(int key, unsigned id); void clearBind(int key); void setDefaultBinds(); unsigned getDefaultCount(unsigned id); int getDefaultKey(unsigned id, unsigned index); unsigned getBindCount(unsigned id); int getBindKey(unsigned id, unsigned index); void setDefaultBinds(unsigned id); void clearBinds(unsigned id); BindDescriptor* getDescriptor(const std::string& name); Keybind* getBind(int key); int getBindID(int key); void save(); void clear(); ~BindGroup(); }; class Keybinds { public: BindGroup global; std::vector groups; umap groupNames; Keybinds(); void clear(); BindGroup* getGroup(const std::string& name); void loadDescriptors(const std::string& filename); void setDefaultBinds(); void loadBinds(const std::string& filename); void saveBinds(const std::string& filename); }; int getModifiedKey(int key, bool ctrlKey, bool altKey, bool shiftKey); //Physical key name std::string getKeyName(int key); int getKey(std::string name); //Logical key name std::string getKeyDisplayName(int key); int getKeyFromDisplayName(std::string name); };