Files
2022-10-26 12:25:11 +08:00

140 lines
4.1 KiB
C++

#ifndef __HOT_KEY_MANAGER_H__
#define __HOT_KEY_MANAGER_H__
//=============================================================================================================================
/// 단축키 처리 클래스
/**
@author Kim Min Wook < taiyo@webzen.co.kr >
@since 2004. 1. 14
@remarks
- 단축키, HotKey처리를 담당
- eOPE_TYPE을 추가해 다른 형태의 execute방법 구현
- Unregister 추가 - 재영
*/
//=============================================================================================================================
#pragma once
#include <Singleton.h>
#include "HotKeyDefine.h"
class SolarDialog;
class KeyCommand;
class HotKeyManager : public util::Singleton<HotKeyManager>
{
typedef STLX_MAP<HOT_KEY_FUNCTION_INDEX, KeyCommand*> KEY_COMMAND_MAP;
public:
HotKeyManager();
~HotKeyManager();
void Initialize(); // 기본초기화/디폴트키세팅/
void Process();
void ProcessHotkeyFunction(HOT_KEY_FUNCTION_INDEX hot_key_function_index);
// ++ 키세팅 변경 관련 함수
KEY_BIND_PAIR* GetKeyBindPair(HOT_KEY_FUNCTION_INDEX hot_key_function_index);
static bool CheckInputBindKey(KEY_BIND_PAIR& key_bind_pair, int key_state, BOOL force_input = FALSE);
// ++ 키세팅 저장/복구 관련 함수
void StartUserSettingMode();
void EndUserSettingMode(WORD input_key_code);
WORD CheckUserKeyInput();
KEY_BIND_INFO& current_using_key_bind_info() { return current_using_key_bind_info_;}
KEY_BIND_INFO& account_key_bind_info() { return account_key_bind_info_; }
KEY_BIND_INFO& defalut_key_bind_info() { return defalut_key_bind_info_;}
KEY_BIND_INFO& temp_key_bind_info() { return temp_key_bind_info_;}
// ++ 서버저장을 위한 함수
bool CompareHotKeyInfo(KEY_BIND_INFO& left_Info, KEY_BIND_INFO& right_Info);
bool MakeToStream(GameOption& game_option);
bool MakeToHotKeyInfo(GameOption& game_option, KEY_BIND_INFO& apply_info);
void SaveHotKeyInfoToServer(bool is_check_character);
void LoadHotKeyInfoFromServer();
void LoadHotKeyInfoFromServerByCharacter();
void RecvHotKeyInfo(GameOption& game_option);
void RecLoadNak(GameOption::Type option_type);
#ifdef _NA_008168_20150330_IMPROVED_REGISTRATION_OF_NEW_SHORTCUTS
void InValidDefaultShortCutCheck(KEY_BIND_INFO& dest_key_bind, GameOption::Type option_type); // 새로 추가된 키가 있는지 검사
#endif // _NA_008168_20150330_IMPROVED_REGISTRATION_OF_NEW_SHORTCUTS
bool is_character_setting() const { return is_character_setting_; }
void set_is_character_setting(bool val) { is_character_setting_ = val; }
bool is_user_setting_mode() const { return is_user_setting_mode_; }
private:
void BuildDefalutKeyBindInfo();
void BuildKeyCommands();
KeyCommand* GetKeyCommand(HOT_KEY_FUNCTION_INDEX hot_key_function_index);
KEY_COMMAND_MAP& key_command_container() { return key_command_container_; }
void set_is_user_setting_mode(bool val) { is_user_setting_mode_ = val; }
private:
KEY_BIND_INFO defalut_key_bind_info_;
KEY_BIND_INFO account_key_bind_info_;
KEY_BIND_INFO current_using_key_bind_info_;
KEY_BIND_INFO temp_key_bind_info_;
KEY_COMMAND_MAP key_command_container_;
bool is_character_setting_;
bool is_user_setting_mode_;
};
#else
enum eOPE_TYPE
{
OPE_SHOW, // SHOW <-> HIDE
OPE_QUICK, // 단축창 단축키
OPE_NOACTION,
};
struct HOT_CODE
{
BOOL bUsedSys;
int iSysKey;
int iCmdKey;
eOPE_TYPE iOpeType;
};
class HotKeyManager : public util::Singleton<HotKeyManager>
{
public:
enum eHOTKEYCODE
{
eHOTKEY_SYSTEMDLG,
eHOTKEY_INVENTORYDLG,
eHOTKEY_SKILLDLG,
eHOTKEY_QUICKDLG,
eHOTKEY_RADARDLG,
eHOTKEY_CHARACTERSKILLDLG,
eHOTKEY_FRIENDDLG,
// 사용하지 않는 키
eHOTKEY_DLG_MAX,
eHOTKEY_MAX,
};
public:
HotKeyManager();
~HotKeyManager();
VOID Initialize();
VOID RegisterHotKey( eHOTKEYCODE code, SolarDialog * pDlg );
VOID UnregisteredHotKey(eHOTKEYCODE code);
VOID Process();
VOID ExcuteHotKey( eHOTKEYCODE code, eOPE_TYPE opeType );
private:
SolarDialog* m_pDlg[eHOTKEY_DLG_MAX];
static HOT_CODE m_HotCode[eHOTKEY_MAX];
};
#endif // __HOT_KEY_MANAGER_H__