- additional work to allow for changing hotkeys in the keyboard options menu, currently changes are not saved to file, only on screen.
This commit is contained in:
parent
73efa41cc9
commit
0f57fe6b92
|
@ -259,6 +259,129 @@ const string Config::getString(const string &key,const char *defaultValueIfNotFo
|
|||
return properties.first.getString(key,defaultValueIfNotFound);
|
||||
}
|
||||
|
||||
SDLKey Config::translateSpecialStringToSDLKey(char c) const {
|
||||
SDLKey result;
|
||||
if(c < 0) {
|
||||
switch(c) {
|
||||
case vkAdd:
|
||||
result = SDLK_PLUS;
|
||||
break;
|
||||
case vkSubtract:
|
||||
result = SDLK_MINUS;
|
||||
break;
|
||||
|
||||
case vkAlt:
|
||||
result = SDLK_RALT;
|
||||
break;
|
||||
|
||||
case vkControl:
|
||||
result = SDLK_RCTRL;
|
||||
break;
|
||||
|
||||
case vkShift:
|
||||
result = SDLK_RSHIFT;
|
||||
break;
|
||||
|
||||
case vkEscape:
|
||||
result = SDLK_ESCAPE;
|
||||
break;
|
||||
|
||||
case vkUp:
|
||||
result = SDLK_UP;
|
||||
break;
|
||||
|
||||
case vkLeft:
|
||||
result = SDLK_LEFT;
|
||||
break;
|
||||
|
||||
case vkRight:
|
||||
result = SDLK_RIGHT;
|
||||
break;
|
||||
|
||||
case vkDown:
|
||||
result = SDLK_DOWN;
|
||||
break;
|
||||
|
||||
case vkReturn:
|
||||
result = SDLK_RETURN;
|
||||
break;
|
||||
|
||||
case vkBack:
|
||||
result = SDLK_BACKSPACE;
|
||||
break;
|
||||
|
||||
case vkTab:
|
||||
result = SDLK_TAB;
|
||||
break;
|
||||
|
||||
case vkF1:
|
||||
result = SDLK_F1;
|
||||
break;
|
||||
|
||||
case vkF2:
|
||||
result = SDLK_F2;
|
||||
break;
|
||||
|
||||
case vkF3:
|
||||
result = SDLK_F3;
|
||||
break;
|
||||
|
||||
case vkF4:
|
||||
result = SDLK_F4;
|
||||
break;
|
||||
|
||||
case vkF5:
|
||||
result = SDLK_F5;
|
||||
break;
|
||||
|
||||
case vkF6:
|
||||
result = SDLK_F6;
|
||||
break;
|
||||
|
||||
case vkF7:
|
||||
result = SDLK_F7;
|
||||
break;
|
||||
|
||||
case vkF8:
|
||||
result = SDLK_F8;
|
||||
break;
|
||||
|
||||
case vkF9:
|
||||
result = SDLK_F9;
|
||||
break;
|
||||
|
||||
case vkF10:
|
||||
result = SDLK_F10;
|
||||
break;
|
||||
|
||||
case vkF11:
|
||||
result = SDLK_F11;
|
||||
break;
|
||||
|
||||
case vkF12:
|
||||
result = SDLK_F12;
|
||||
break;
|
||||
|
||||
case vkDelete:
|
||||
result = SDLK_DELETE;
|
||||
break;
|
||||
|
||||
case vkPrint:
|
||||
result = SDLK_PRINT;
|
||||
break;
|
||||
|
||||
case vkPause:
|
||||
result = SDLK_PAUSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else {
|
||||
result = static_cast<SDLKey>(c);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
char Config::translateStringToCharKey(const string &value) const {
|
||||
char result = 0;
|
||||
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#include "properties.h"
|
||||
#include <vector>
|
||||
#include "game_constants.h"
|
||||
#include <SDL.h>
|
||||
#include "leak_dumper.h"
|
||||
|
||||
namespace Glest{ namespace Game{
|
||||
|
@ -50,8 +51,6 @@ protected:
|
|||
Config();
|
||||
Config(std::pair<ConfigType,ConfigType> type, std::pair<string,string> file, std::pair<bool,bool> fileMustExist);
|
||||
|
||||
char translateStringToCharKey(const string &value) const;
|
||||
|
||||
static void CopyAll(Config *src,Config *dest);
|
||||
vector<pair<string,string> > getPropertiesFromContainer(const Properties &propertiesObj) const;
|
||||
|
||||
|
@ -84,6 +83,9 @@ public:
|
|||
vector<pair<string,string> > getMasterProperties() const;
|
||||
vector<pair<string,string> > getUserProperties() const;
|
||||
|
||||
char translateStringToCharKey(const string &value) const;
|
||||
SDLKey translateSpecialStringToSDLKey(char c) const;
|
||||
|
||||
string toString();
|
||||
};
|
||||
|
||||
|
|
|
@ -34,6 +34,9 @@ MenuStateKeysetup::MenuStateKeysetup(Program *program, MainMenu *mainMenu):
|
|||
SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
||||
containerName = "KeySetup";
|
||||
|
||||
hotkeyIndex = -1;
|
||||
hotkeyChar = 0;
|
||||
|
||||
Lang &lang= Lang::getInstance();
|
||||
int buttonRowPos=80;
|
||||
// header
|
||||
|
@ -78,13 +81,27 @@ MenuStateKeysetup::MenuStateKeysetup(Program *program, MainMenu *mainMenu):
|
|||
userProperties=configKeys.getUserProperties();
|
||||
|
||||
for(int i = 0; i < mergedProperties.size(); ++i) {
|
||||
|
||||
string keyName = mergedProperties[i].second;
|
||||
if(keyName.length() > 0) {
|
||||
SDLKey keysym = static_cast<SDLKey>(configKeys.translateStringToCharKey(keyName));
|
||||
// SDL skips capital letters
|
||||
if(keysym >= 65 && keysym <= 90) {
|
||||
keysym = (SDLKey)((int)keysym + 32);
|
||||
}
|
||||
keyName = SDL_GetKeyName(keysym);
|
||||
if(keyName == "unknown key") {
|
||||
keyName = mergedProperties[i].second;
|
||||
}
|
||||
}
|
||||
|
||||
GraphicButton *button=new GraphicButton();
|
||||
button->init(keyButtonsXBase, keyButtonsYBase, keyButtonsWidth,keyButtonsHeight);
|
||||
button->setText(mergedProperties[i].first);
|
||||
keyButtons.push_back(button);
|
||||
GraphicLabel *label=new GraphicLabel();
|
||||
label->init(keyButtonsXBase+keyButtonsWidth+10,keyButtonsYBase,labelWidth,20);
|
||||
label->setText(mergedProperties[i].second);
|
||||
label->setText(keyName);
|
||||
labels.push_back(label);
|
||||
}
|
||||
|
||||
|
@ -161,6 +178,8 @@ void MenuStateKeysetup::mouseClick(int x, int y, MouseButton mouseButton){
|
|||
for (int i = keyScrollBar.getVisibleStart(); i
|
||||
<= keyScrollBar.getVisibleEnd(); ++i) {
|
||||
if (keyButtons[i]->mouseClick(x, y)) {
|
||||
hotkeyIndex = i;
|
||||
hotkeyChar = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -239,14 +258,39 @@ void MenuStateKeysetup::showMessageBox(const string &text, const string &header,
|
|||
|
||||
|
||||
void MenuStateKeysetup::keyDown(char key) {
|
||||
//Config &configKeys = Config::getInstance(std::pair<ConfigType,ConfigType>(cfgMainKeys,cfgUserKeys));
|
||||
hotkeyChar = key;
|
||||
|
||||
if(SystemFlags::VERBOSE_MODE_ENABLED) printf ("In [%s::%s Line: %d] hotkeyChar [%d]\n",__FILE__,__FUNCTION__,__LINE__,hotkeyChar);
|
||||
}
|
||||
|
||||
void MenuStateKeysetup::keyPress(char c) {
|
||||
|
||||
}
|
||||
void MenuStateKeysetup::keyUp(char key) {
|
||||
|
||||
void MenuStateKeysetup::keyUp(char key) {
|
||||
//Config &configKeys = Config::getInstance(std::pair<ConfigType,ConfigType>(cfgMainKeys,cfgUserKeys));
|
||||
|
||||
if(hotkeyIndex >= 0 && hotkeyChar != 0) {
|
||||
string keyName = SDL_GetKeyName(static_cast<SDLKey>(hotkeyChar));
|
||||
|
||||
if(keyName == "unknown key") {
|
||||
Config &configKeys = Config::getInstance(std::pair<ConfigType,ConfigType>(cfgMainKeys,cfgUserKeys));
|
||||
SDLKey keysym = configKeys.translateSpecialStringToSDLKey(hotkeyChar);
|
||||
// SDL skips capital letters
|
||||
if(keysym >= 65 && keysym <= 90) {
|
||||
keysym = (SDLKey)((int)keysym + 32);
|
||||
}
|
||||
keyName = SDL_GetKeyName(keysym);
|
||||
}
|
||||
|
||||
if(SystemFlags::VERBOSE_MODE_ENABLED) printf ("In [%s::%s Line: %d] keyName [%s] char [%d]\n",__FILE__,__FUNCTION__,__LINE__,keyName.c_str(),hotkeyChar);
|
||||
|
||||
if(keyName != "unknown key") {
|
||||
GraphicLabel *label= labels[hotkeyIndex];
|
||||
label->setText(keyName);
|
||||
}
|
||||
hotkeyIndex = -1;
|
||||
hotkeyChar = 0;
|
||||
}
|
||||
}
|
||||
|
||||
}}//end namespace
|
||||
|
|
|
@ -49,6 +49,9 @@ private:
|
|||
vector<pair<string,string> > masterProperties;
|
||||
vector<pair<string,string> > userProperties;
|
||||
|
||||
int hotkeyIndex;
|
||||
char hotkeyChar;
|
||||
|
||||
public:
|
||||
MenuStateKeysetup(Program *program, MainMenu *mainMenu);
|
||||
~MenuStateKeysetup();
|
||||
|
|
|
@ -636,6 +636,9 @@ char Window::getNormalKey(SDL_keysym keysym,bool skipSpecialKeys) {
|
|||
SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] keysym.sym [%d] skipSpecialKeys = %d.\n",__FILE__,__FUNCTION__,__LINE__,keysym.sym,skipSpecialKeys);
|
||||
|
||||
SDLKey unicodeKey = static_cast<SDLKey>(getRawKey(keysym));
|
||||
if(unicodeKey == 0) {
|
||||
unicodeKey = keysym.sym;
|
||||
}
|
||||
|
||||
//string keyName = SDL_GetKeyName(keysym.sym);
|
||||
string keyName = SDL_GetKeyName(unicodeKey);
|
||||
|
@ -662,15 +665,6 @@ char Window::getNormalKey(SDL_keysym keysym,bool skipSpecialKeys) {
|
|||
return vkShift;
|
||||
}
|
||||
}
|
||||
if(keyName == "plus sign" || keyName == "plus") {
|
||||
return vkAdd;
|
||||
}
|
||||
if(keyName == "minus sign" || keyName == "minus") {
|
||||
return vkSubtract;
|
||||
}
|
||||
if(keyName == "escape") {
|
||||
return vkEscape;
|
||||
}
|
||||
if(keyName == "up arrow" || keyName == "up") {
|
||||
return vkUp;
|
||||
}
|
||||
|
@ -686,6 +680,15 @@ char Window::getNormalKey(SDL_keysym keysym,bool skipSpecialKeys) {
|
|||
if(keyName == "return" || keyName == "enter") {
|
||||
return vkReturn;
|
||||
}
|
||||
if(keyName == "plus sign" || keyName == "plus") {
|
||||
return vkAdd;
|
||||
}
|
||||
if(keyName == "minus sign" || keyName == "minus") {
|
||||
return vkSubtract;
|
||||
}
|
||||
if(keyName == "escape") {
|
||||
return vkEscape;
|
||||
}
|
||||
if(keyName == "tab") {
|
||||
return vkTab;
|
||||
}
|
||||
|
@ -701,40 +704,47 @@ char Window::getNormalKey(SDL_keysym keysym,bool skipSpecialKeys) {
|
|||
if(keyName == "pause") {
|
||||
return vkPause;
|
||||
}
|
||||
if(keyName == "F1") {
|
||||
if(keyName == "question mark" || keyName == "?") {
|
||||
return '?';
|
||||
}
|
||||
if(keyName == "space") {
|
||||
return ' ';
|
||||
}
|
||||
|
||||
if(keyName == "f1") {
|
||||
return vkF1;
|
||||
}
|
||||
if(keyName == "F2") {
|
||||
if(keyName == "f2") {
|
||||
return vkF2;
|
||||
}
|
||||
if(keyName == "F3") {
|
||||
if(keyName == "f3") {
|
||||
return vkF3;
|
||||
}
|
||||
if(keyName == "F4") {
|
||||
if(keyName == "f4") {
|
||||
return vkF4;
|
||||
}
|
||||
if(keyName == "F5") {
|
||||
if(keyName == "f5") {
|
||||
return vkF5;
|
||||
}
|
||||
if(keyName == "F6") {
|
||||
if(keyName == "f6") {
|
||||
return vkF6;
|
||||
}
|
||||
if(keyName == "F7") {
|
||||
if(keyName == "f7") {
|
||||
return vkF7;
|
||||
}
|
||||
if(keyName == "F8") {
|
||||
if(keyName == "f8") {
|
||||
return vkF8;
|
||||
}
|
||||
if(keyName == "F9") {
|
||||
if(keyName == "f9") {
|
||||
return vkF9;
|
||||
}
|
||||
if(keyName == "F10") {
|
||||
if(keyName == "f10") {
|
||||
return vkF10;
|
||||
}
|
||||
if(keyName == "F11") {
|
||||
if(keyName == "f11") {
|
||||
return vkF11;
|
||||
}
|
||||
if(keyName == "F12") {
|
||||
if(keyName == "f12") {
|
||||
return vkF12;
|
||||
}
|
||||
if(keyName == "0") {
|
||||
|
@ -767,9 +777,6 @@ char Window::getNormalKey(SDL_keysym keysym,bool skipSpecialKeys) {
|
|||
if(keyName == "9") {
|
||||
return '9';
|
||||
}
|
||||
if(keyName == "question mark" || keyName == "?") {
|
||||
return '?';
|
||||
}
|
||||
if(keyName == "a") {
|
||||
return 'A';
|
||||
}
|
||||
|
@ -849,6 +856,9 @@ char Window::getNormalKey(SDL_keysym keysym,bool skipSpecialKeys) {
|
|||
return 'Z';
|
||||
}
|
||||
|
||||
if(unicodeKey > 0 && unicodeKey <= 255) {
|
||||
return unicodeKey;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -920,7 +930,9 @@ char Window::getKey(SDL_keysym keysym,bool skipSpecialKeys) {
|
|||
}
|
||||
}
|
||||
|
||||
c = keysym.sym;
|
||||
if(keysym.sym <= 255) {
|
||||
c = keysym.sym;
|
||||
}
|
||||
}
|
||||
|
||||
SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %u] c = [%d]\n",__FILE__,__FUNCTION__,__LINE__,c);
|
||||
|
|
Loading…
Reference in New Issue