/**************************************************************************** * * * Project64 - A Nintendo 64 emulator. * * http://www.pj64-emu.com/ * * Copyright (C) 2012 Project64. All rights reserved. * * * * License: * * GNU/GPLv2 http://www.gnu.org/licenses/gpl-2.0.html * * * ****************************************************************************/ #pragma once struct VIRTUAL_KEY { LPCSTR Name; int Key; LPCSTR KeyName; }; class CMenuShortCutKey { public: enum ACCESS_MODE { NONE = 0, GAME_NOT_RUNNING = 1, GAME_RUNNING_WINDOW = 2, NOT_IN_FULLSCREEN = 3, GAME_RUNNING_FULLSCREEN = 4, GAME_RUNNING = 6, ANYTIME = 7, }; private: static VIRTUAL_KEY m_VirtualKeyList[]; stdstr m_ShortCutName; WORD m_key; bool m_bCtrl; bool m_bAlt; bool m_bShift; ACCESS_MODE m_AccessMode; bool m_bUserAdded; bool m_bInactive; public: CMenuShortCutKey(void); CMenuShortCutKey(WORD key, bool bCtrl, bool bAlt, bool bShift, ACCESS_MODE AccessMode, bool bUserAdded, bool bInactive); bool Same(WORD key, bool bCtrl, bool bAlt, bool bShift, ACCESS_MODE AccessMode) const; static VIRTUAL_KEY * VirtualKeyList(int &Size); inline stdstr Name(void) const { return m_ShortCutName; } inline WORD Key(void) const { return m_key; } inline bool Ctrl(void) const { return m_bCtrl; } inline bool Alt(void) const { return m_bAlt; } inline bool Shift(void) const { return m_bShift; } inline bool UserAdded(void) const { return m_bUserAdded; } inline bool Inactive(void) const { return m_bInactive; } inline ACCESS_MODE AccessMode(void) const { return m_AccessMode; } inline void SetInactive(bool Inactive) { m_bInactive = Inactive; } }; class CShortCutItem { public: typedef std::list SHORTCUT_KEY_LIST; private: typedef CMenuShortCutKey::ACCESS_MODE ACCESS_MODE; ACCESS_MODE m_Access; LanguageStringID m_Section; LanguageStringID m_Title; SHORTCUT_KEY_LIST m_AccelList; public: CShortCutItem(LanguageStringID Section, LanguageStringID Title, ACCESS_MODE Access); void Reset(LanguageStringID Section, LanguageStringID Title, ACCESS_MODE Access); void AddShortCut(WORD key, bool bCtrl, bool bAlt, bool bShift, ACCESS_MODE AccessMode, bool bUserAdded = false, bool bInactive = false); void RemoveItem(CMenuShortCutKey * ShortCut); inline const SHORTCUT_KEY_LIST & GetAccelItems(void) const { return m_AccelList; } inline LanguageStringID Section(void) const { return m_Section; } inline LanguageStringID Title(void) const { return m_Title; } inline ACCESS_MODE AccessMode(void) const { return m_Access; } }; typedef std::map MSC_MAP; class CShortCuts { typedef CShortCutItem::SHORTCUT_KEY_LIST SHORTCUT_KEY_LIST; typedef CMenuShortCutKey::ACCESS_MODE ACCESS_MODE; typedef LanguageStringID LangStr; MSC_MAP m_ShortCuts; CriticalSection m_CS; void AddShortCut(WORD ID, LangStr Section, LangStr LangID, CMenuShortCutKey::ACCESS_MODE AccessMode); public: CShortCuts(void); ~CShortCuts(void); std::wstring ShortCutString(int MenuID, ACCESS_MODE AccessLevel); LangStr GetMenuItemName(WORD key, bool bCtrl, bool bAlt, bool bShift, ACCESS_MODE Access); HACCEL GetAcceleratorTable(void); MSC_MAP & GetShortCuts(void) { return m_ShortCuts; } void Load(bool InitialValues = false); void Save(void); };