- 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:
Mark Vejvoda 2011-03-04 20:26:47 +00:00
parent 73efa41cc9
commit 0f57fe6b92
5 changed files with 215 additions and 31 deletions

View File

@ -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;

View File

@ -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();
};

View File

@ -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

View File

@ -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();

View File

@ -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);