#ifndef _INPUTCONFIG_H_ #define _INPUTCONFIG_H_ #include "directinput/Manager.h" #include "tcharx.h" #include "Types.h" #include "Singleton.h" #include "../AppConfig.h" #include "../ControllerInfo.h" #include #include class CInputConfig : public CDependantSingleton { public: friend class CDependantSingleton; typedef std::tr1::function InputEventHandler; enum BINDINGTYPE { BINDING_UNBOUND = 0, BINDING_SIMPLE = 1, BINDING_SIMULATEDAXIS = 2, }; struct BINDINGINFO { BINDINGINFO(const GUID& device, uint32 id) : device(device), id(id) { } GUID device; uint32 id; }; class CBinding { public: virtual ~CBinding() {}; virtual BINDINGTYPE GetBindingType() const = 0; virtual void ProcessEvent(const GUID&, uint32, uint32, PS2::CControllerInfo::BUTTON, const InputEventHandler&) = 0; virtual void Save(Framework::CConfig&, const char*) const = 0; virtual void Load(Framework::CConfig&, const char*) = 0; virtual std::tstring GetDescription(DirectInput::CManager*) const = 0; }; class CSimpleBinding : public CBinding, private BINDINGINFO { public: CSimpleBinding(const GUID& = GUID(), uint32 = 0); virtual ~CSimpleBinding(); static void RegisterPreferences(Framework::CConfig&, const char*); virtual BINDINGTYPE GetBindingType() const; virtual void ProcessEvent(const GUID&, uint32, uint32, PS2::CControllerInfo::BUTTON, const InputEventHandler&); virtual void Save(Framework::CConfig&, const char*) const; virtual void Load(Framework::CConfig&, const char*); virtual std::tstring GetDescription(DirectInput::CManager*) const; }; class CSimulatedAxisBinding : public CBinding { public: static void RegisterPreferences(Framework::CConfig&, const char*); private: BINDINGINFO key1Binding; BINDINGINFO key2Binding; }; const CBinding* GetBinding(PS2::CControllerInfo::BUTTON) const; void SetSimpleBinding(PS2::CControllerInfo::BUTTON, const BINDINGINFO&); // void SetSimulatedAxisBinding(Ps2::CControllerInfo::BUTTON, void Load(); void Save(); void TranslateInputEvent(const GUID&, uint32, uint32, const InputEventHandler&); std::tstring GetBindingDescription(DirectInput::CManager*, PS2::CControllerInfo::BUTTON) const; private: typedef std::tr1::shared_ptr BindingPtr; CInputConfig(CAppConfig&); virtual ~CInputConfig(); static void RegisterBindingPreference(Framework::CConfig&, const char*); BindingPtr m_bindings[PS2::CControllerInfo::MAX_BUTTONS]; static const char* m_buttonName[PS2::CControllerInfo::MAX_BUTTONS]; }; #endif