Play-/Source/ui_unix/InputBindingManager.h

165 lines
4.4 KiB
C
Raw Normal View History

2017-05-28 14:17:03 +01:00
#pragma once
#include "Config.h"
#include "ControllerInfo.h"
2018-05-23 03:11:24 +03:00
#include <array>
2017-05-28 14:17:03 +01:00
#include <memory>
#include <functional>
#include <qnamespace.h>
class CInputBindingManager
{
public:
enum BINDINGTYPE
{
BINDING_UNBOUND = 0,
BINDING_SIMPLE = 1,
BINDING_SIMULATEDAXIS = 2,
BINDING_POVHAT = 3,
};
struct BINDINGINFO
{
BINDINGINFO() = default;
2018-04-30 21:01:23 +01:00
BINDINGINFO(std::array<uint32, 6> device, uint32 id, uint32 type = 0)
: device(device)
, id(id)
, type(type)
{
}
std::array<uint32, 6> device;
uint32 id = 0;
uint32 type = 0;
2017-05-28 14:17:03 +01:00
};
class CBinding
{
public:
2018-04-30 21:01:23 +01:00
virtual ~CBinding()
{
}
2017-05-28 14:17:03 +01:00
2018-04-30 21:01:23 +01:00
virtual void ProcessEvent(std::array<uint32, 6>, uint32, uint32) = 0;
2017-05-28 14:17:03 +01:00
2018-04-30 21:01:23 +01:00
virtual BINDINGTYPE GetBindingType() const = 0;
virtual const char* GetBindingTypeName() const = 0;
virtual uint32 GetValue() const = 0;
virtual void SetValue(uint32) = 0;
virtual std::string GetDescription() const = 0;
2017-05-28 14:17:03 +01:00
2018-04-30 21:01:23 +01:00
virtual void Save(Framework::CConfig&, const char*) const = 0;
virtual void Load(Framework::CConfig&, const char*) = 0;
2017-05-28 14:17:03 +01:00
};
class CSimpleBinding : public CBinding
{
public:
CSimpleBinding(std::array<uint32, 6>, uint32, uint32 t = 0);
CSimpleBinding(Qt::Key);
CSimpleBinding();
~CSimpleBinding() override;
2017-05-28 14:17:03 +01:00
2018-04-30 21:01:23 +01:00
void ProcessEvent(std::array<uint32, 6>, uint32, uint32) override;
static void RegisterPreferences(Framework::CConfig&, const char*);
2017-05-28 14:17:03 +01:00
2018-04-30 21:01:23 +01:00
BINDINGTYPE GetBindingType() const override;
const char* GetBindingTypeName() const override;
uint32 GetValue() const override;
void SetValue(uint32) override;
std::string GetDescription() const override;
2017-05-28 14:17:03 +01:00
2018-04-30 21:01:23 +01:00
void Save(Framework::CConfig&, const char*) const override;
void Load(Framework::CConfig&, const char*) override;
2017-05-28 14:17:03 +01:00
private:
2018-04-30 21:01:23 +01:00
uint32 m_keyCode;
uint32 m_state;
std::array<uint32, 6> m_device;
uint32 m_type;
2017-05-28 14:17:03 +01:00
};
class CPovHatBinding : public CBinding
{
public:
CPovHatBinding(const BINDINGINFO&, uint32 = -1);
CPovHatBinding();
2018-04-30 21:01:23 +01:00
virtual ~CPovHatBinding();
2017-05-28 14:17:03 +01:00
2018-04-30 21:01:23 +01:00
static void RegisterPreferences(Framework::CConfig&, const char*);
2017-05-28 14:17:03 +01:00
2018-04-30 21:01:23 +01:00
BINDINGTYPE GetBindingType() const override;
const char* GetBindingTypeName() const override;
void ProcessEvent(std::array<uint32, 6>, uint32, uint32) override;
2017-05-28 14:17:03 +01:00
2018-04-30 21:01:23 +01:00
uint32 GetValue() const override;
void SetValue(uint32) override;
std::string GetDescription() const override;
2017-05-28 14:17:03 +01:00
2018-04-30 21:01:23 +01:00
void Save(Framework::CConfig&, const char*) const override;
void Load(Framework::CConfig&, const char*) override;
2017-05-28 14:17:03 +01:00
private:
2018-04-30 21:01:23 +01:00
static int32 GetShortestDistanceBetweenAngles(int32, int32);
2017-05-28 14:17:03 +01:00
2018-04-30 21:01:23 +01:00
BINDINGINFO m_binding;
uint32 m_refValue = 0;
uint32 m_value = 0;
2017-05-28 14:17:03 +01:00
};
class CSimulatedAxisBinding : public CBinding
{
public:
CSimulatedAxisBinding(const BINDINGINFO&, const BINDINGINFO&);
CSimulatedAxisBinding(int, int);
CSimulatedAxisBinding();
~CSimulatedAxisBinding();
2017-05-28 14:17:03 +01:00
2018-04-30 21:01:23 +01:00
void ProcessEvent(std::array<uint32, 6>, uint32, uint32) override;
static void RegisterPreferences(Framework::CConfig&, const char*);
2017-05-28 14:17:03 +01:00
2018-04-30 21:01:23 +01:00
BINDINGTYPE GetBindingType() const override;
const char* GetBindingTypeName() const override;
uint32 GetValue() const override;
2018-07-31 13:00:55 -04:00
void SetValue(uint32) override;
2018-04-30 21:01:23 +01:00
std::string GetDescription() const override;
2017-05-28 14:17:03 +01:00
2018-04-30 21:01:23 +01:00
void Save(Framework::CConfig&, const char*) const override;
void Load(Framework::CConfig&, const char*) override;
2017-05-28 14:17:03 +01:00
private:
2018-04-30 21:01:23 +01:00
static void RegisterKeyBindingPreferences(Framework::CConfig&, const char*);
void SaveKeyBinding(Framework::CConfig&, const char*, const BINDINGINFO&) const;
void LoadKeyBinding(Framework::CConfig&, const char*, BINDINGINFO&);
2017-05-28 14:17:03 +01:00
2018-04-30 21:01:23 +01:00
uint32 m_key1State;
uint32 m_key2State;
2017-05-28 14:17:03 +01:00
2018-04-30 21:01:23 +01:00
BINDINGINFO m_key1Binding;
BINDINGINFO m_key2Binding;
2017-05-28 14:17:03 +01:00
};
2018-04-30 21:01:23 +01:00
CInputBindingManager(Framework::CConfig&);
virtual ~CInputBindingManager();
2017-05-28 14:17:03 +01:00
2018-04-30 21:01:23 +01:00
uint32 GetBindingValue(PS2::CControllerInfo::BUTTON) const;
void ResetBindingValues();
2017-05-28 14:17:03 +01:00
2018-04-30 21:01:23 +01:00
const CBinding* GetBinding(PS2::CControllerInfo::BUTTON) const;
void SetSimpleBinding(PS2::CControllerInfo::BUTTON, const BINDINGINFO&);
void SetPovHatBinding(PS2::CControllerInfo::BUTTON, const BINDINGINFO&, uint32);
void SetSimulatedAxisBinding(PS2::CControllerInfo::BUTTON, const BINDINGINFO&, const BINDINGINFO&);
2017-05-28 14:17:03 +01:00
2018-04-30 21:01:23 +01:00
void Load();
void Save();
void AutoConfigureKeyboard();
void OnInputEventReceived(std::array<uint32, 6>, uint32, uint32);
2017-05-28 14:17:03 +01:00
private:
2018-04-30 21:01:23 +01:00
typedef std::shared_ptr<CBinding> BindingPtr;
2017-05-28 14:17:03 +01:00
2018-04-30 21:01:23 +01:00
BindingPtr m_bindings[PS2::CControllerInfo::MAX_BUTTONS];
static uint32 m_buttonDefaultValue[PS2::CControllerInfo::MAX_BUTTONS];
2017-05-28 14:17:03 +01:00
2018-04-30 21:01:23 +01:00
Framework::CConfig& m_config;
2017-05-28 14:17:03 +01:00
};