-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathBindContext.cpp
124 lines (106 loc) · 4.76 KB
/
BindContext.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include "BindContext.h"
#include <SDL2/SDL_keyboard.h>
#include <utility/Config.h>
#include "LogInput.h"
BindContext::BindContext( const pString& name )
: m_Name( name ) {
}
void BindContext::LoadFromConfig( Config& cfg, const pVector<pString> descriptions ) {
for ( auto& title : m_ActionTitleToAction ) {
pString keyName = cfg.GetString( m_Name + "primary." + title.first, SDL_GetScancodeName( title.second.DefaultScancode ),
descriptions.at( static_cast<int>( title.second.Action ) ) );
if ( keyName != "" ) {
SDL_Scancode scanCode = SDL_GetScancodeFromName( keyName.c_str() );
if ( scanCode == SDL_SCANCODE_UNKNOWN ) {
LogInput( "Failed to interpret " + keyName + " as a scancode", "KeyBindings", LogSeverity::WARNING_MSG );
} else {
m_KeyBindingCollection.AddMappingWithScancode( scanCode, title.second.Action );
}
}
}
for ( auto& title : m_ActionTitleToAction ) {
pString keyName = cfg.GetString( m_Name + "secondary." + title.first, "", descriptions.at( static_cast<int>( title.second.Action ) ) );
if ( keyName != "" ) {
SDL_Scancode scanCode = SDL_GetScancodeFromName( keyName.c_str() );
if ( scanCode == SDL_SCANCODE_UNKNOWN ) {
LogInput( "Failed to interpret " + keyName + " as a scancode", "KeyBindings", LogSeverity::WARNING_MSG );
} else {
m_KeyBindingCollection.AddMappingWithScancode( scanCode, title.second.Action );
}
}
}
for ( auto& title : m_ActionTitleToAction ) {
pString buttonName =
cfg.GetString( m_Name + "gamepad." + title.first, title.second.DefaultButton != SDL_CONTROLLER_BUTTON_INVALID ? SDL_GameControllerGetStringForButton(
title.second.DefaultButton ) : "",
descriptions.at( static_cast<int>( title.second.Action ) ) );
if ( buttonName != "" ) {
SDL_GameControllerButton button = SDL_GameControllerGetButtonFromString( buttonName.c_str() );
if ( button == SDL_CONTROLLER_BUTTON_INVALID ) {
LogInput( "Failed to interpret " + buttonName + " as a button", "KeyBindings", LogSeverity::WARNING_MSG );
} else {
m_GamepadBindingCollection.AddMappingWithButton( button, title.second.Action );
}
}
}
}
void BindContext::SaveToConfig( Config& cfg ) const {
for ( auto& keybinding : m_ActionTitleToAction ) {
SDL_Scancode primary = m_KeyBindingCollection.GetPrimaryScancodeFromAction( keybinding.second.Action );
cfg.SetString( m_Name + "primary." + keybinding.first, SDL_GetScancodeName( primary ) );
}
for ( auto& keybinding : m_ActionTitleToAction ) {
SDL_Scancode secondary = m_KeyBindingCollection.GetSecondaryScancodeFromAction( keybinding.second.Action );
cfg.SetString( m_Name + "secondary." + keybinding.first, SDL_GetScancodeName( secondary ) );
}
for ( auto& buttonBinding : m_ActionTitleToAction ) {
SDL_GameControllerButton button = m_GamepadBindingCollection.GetButtonFromAction( buttonBinding.second.Action );
cfg.SetString( m_Name + "gamepad." + buttonBinding.first, SDL_GameControllerGetStringForButton( button ) );
}
}
void BindContext::ClearBindings() {
m_KeyBindingCollection = KeyBindingCollection();
m_GamepadBindingCollection = GamepadBindingCollection();
}
void BindContext::ClearActions() {
ClearBindings();
m_ActionTitleToAction.clear();
}
void BindContext::AddAction( ActionIdentifier actionIdentifier, const pString& name, SDL_Scancode defaultScancode, SDL_GameControllerButton defaultButton ) {
m_ActionTitleToAction[name] = ActionTitleMapping {
actionIdentifier, defaultScancode, defaultButton
};
}
void BindContext::GetDefaultKeyBindings( KeyBindingCollection& collection ) const {
collection = KeyBindingCollection();
for ( auto& title : m_ActionTitleToAction ) {
collection.AddMappingWithScancode( title.second.DefaultScancode, title.second.Action );
}
}
void BindContext::GetDefaultGamepadBindings( GamepadBindingCollection& collection ) const {
collection = GamepadBindingCollection();
for ( auto& title : m_ActionTitleToAction ) {
collection.AddMappingWithButton( title.second.DefaultButton, title.second.Action );
}
}
const rMap<rString, BindContext::ActionTitleMapping>& BindContext::GetActionTitleToAction() const {
return m_ActionTitleToAction;
}
const KeyBindingCollection& BindContext::GetKeyBindCollection( ) const {
return m_KeyBindingCollection;
}
KeyBindingCollection& BindContext::GetEditableKeyBindCollection( ) {
return m_KeyBindingCollection;
}
void BindContext::SetKeyBindingCollection( const KeyBindingCollection& collection ) {
m_KeyBindingCollection = collection;
}
const GamepadBindingCollection& BindContext::GetGamepadBindCollection( ) const {
return m_GamepadBindingCollection;
}
GamepadBindingCollection& BindContext::GetEditableGamepadBindCollection( ) {
return m_GamepadBindingCollection;
}
void BindContext::SetGamepadBindingCollection( const GamepadBindingCollection& collection ) {
m_GamepadBindingCollection = collection;
}