- 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);
|
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 Config::translateStringToCharKey(const string &value) const {
|
||||||
char result = 0;
|
char result = 0;
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#include "properties.h"
|
#include "properties.h"
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include "game_constants.h"
|
#include "game_constants.h"
|
||||||
|
#include <SDL.h>
|
||||||
#include "leak_dumper.h"
|
#include "leak_dumper.h"
|
||||||
|
|
||||||
namespace Glest{ namespace Game{
|
namespace Glest{ namespace Game{
|
||||||
|
@ -50,8 +51,6 @@ protected:
|
||||||
Config();
|
Config();
|
||||||
Config(std::pair<ConfigType,ConfigType> type, std::pair<string,string> file, std::pair<bool,bool> fileMustExist);
|
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);
|
static void CopyAll(Config *src,Config *dest);
|
||||||
vector<pair<string,string> > getPropertiesFromContainer(const Properties &propertiesObj) const;
|
vector<pair<string,string> > getPropertiesFromContainer(const Properties &propertiesObj) const;
|
||||||
|
|
||||||
|
@ -84,6 +83,9 @@ public:
|
||||||
vector<pair<string,string> > getMasterProperties() const;
|
vector<pair<string,string> > getMasterProperties() const;
|
||||||
vector<pair<string,string> > getUserProperties() const;
|
vector<pair<string,string> > getUserProperties() const;
|
||||||
|
|
||||||
|
char translateStringToCharKey(const string &value) const;
|
||||||
|
SDLKey translateSpecialStringToSDLKey(char c) const;
|
||||||
|
|
||||||
string toString();
|
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__);
|
SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
|
||||||
containerName = "KeySetup";
|
containerName = "KeySetup";
|
||||||
|
|
||||||
|
hotkeyIndex = -1;
|
||||||
|
hotkeyChar = 0;
|
||||||
|
|
||||||
Lang &lang= Lang::getInstance();
|
Lang &lang= Lang::getInstance();
|
||||||
int buttonRowPos=80;
|
int buttonRowPos=80;
|
||||||
// header
|
// header
|
||||||
|
@ -78,13 +81,27 @@ MenuStateKeysetup::MenuStateKeysetup(Program *program, MainMenu *mainMenu):
|
||||||
userProperties=configKeys.getUserProperties();
|
userProperties=configKeys.getUserProperties();
|
||||||
|
|
||||||
for(int i = 0; i < mergedProperties.size(); ++i) {
|
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();
|
GraphicButton *button=new GraphicButton();
|
||||||
button->init(keyButtonsXBase, keyButtonsYBase, keyButtonsWidth,keyButtonsHeight);
|
button->init(keyButtonsXBase, keyButtonsYBase, keyButtonsWidth,keyButtonsHeight);
|
||||||
button->setText(mergedProperties[i].first);
|
button->setText(mergedProperties[i].first);
|
||||||
keyButtons.push_back(button);
|
keyButtons.push_back(button);
|
||||||
GraphicLabel *label=new GraphicLabel();
|
GraphicLabel *label=new GraphicLabel();
|
||||||
label->init(keyButtonsXBase+keyButtonsWidth+10,keyButtonsYBase,labelWidth,20);
|
label->init(keyButtonsXBase+keyButtonsWidth+10,keyButtonsYBase,labelWidth,20);
|
||||||
label->setText(mergedProperties[i].second);
|
label->setText(keyName);
|
||||||
labels.push_back(label);
|
labels.push_back(label);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -161,6 +178,8 @@ void MenuStateKeysetup::mouseClick(int x, int y, MouseButton mouseButton){
|
||||||
for (int i = keyScrollBar.getVisibleStart(); i
|
for (int i = keyScrollBar.getVisibleStart(); i
|
||||||
<= keyScrollBar.getVisibleEnd(); ++i) {
|
<= keyScrollBar.getVisibleEnd(); ++i) {
|
||||||
if (keyButtons[i]->mouseClick(x, y)) {
|
if (keyButtons[i]->mouseClick(x, y)) {
|
||||||
|
hotkeyIndex = i;
|
||||||
|
hotkeyChar = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -239,14 +258,39 @@ void MenuStateKeysetup::showMessageBox(const string &text, const string &header,
|
||||||
|
|
||||||
|
|
||||||
void MenuStateKeysetup::keyDown(char key) {
|
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::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
|
}}//end namespace
|
||||||
|
|
|
@ -49,6 +49,9 @@ private:
|
||||||
vector<pair<string,string> > masterProperties;
|
vector<pair<string,string> > masterProperties;
|
||||||
vector<pair<string,string> > userProperties;
|
vector<pair<string,string> > userProperties;
|
||||||
|
|
||||||
|
int hotkeyIndex;
|
||||||
|
char hotkeyChar;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MenuStateKeysetup(Program *program, MainMenu *mainMenu);
|
MenuStateKeysetup(Program *program, MainMenu *mainMenu);
|
||||||
~MenuStateKeysetup();
|
~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);
|
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));
|
SDLKey unicodeKey = static_cast<SDLKey>(getRawKey(keysym));
|
||||||
|
if(unicodeKey == 0) {
|
||||||
|
unicodeKey = keysym.sym;
|
||||||
|
}
|
||||||
|
|
||||||
//string keyName = SDL_GetKeyName(keysym.sym);
|
//string keyName = SDL_GetKeyName(keysym.sym);
|
||||||
string keyName = SDL_GetKeyName(unicodeKey);
|
string keyName = SDL_GetKeyName(unicodeKey);
|
||||||
|
@ -662,15 +665,6 @@ char Window::getNormalKey(SDL_keysym keysym,bool skipSpecialKeys) {
|
||||||
return vkShift;
|
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") {
|
if(keyName == "up arrow" || keyName == "up") {
|
||||||
return vkUp;
|
return vkUp;
|
||||||
}
|
}
|
||||||
|
@ -686,6 +680,15 @@ char Window::getNormalKey(SDL_keysym keysym,bool skipSpecialKeys) {
|
||||||
if(keyName == "return" || keyName == "enter") {
|
if(keyName == "return" || keyName == "enter") {
|
||||||
return vkReturn;
|
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") {
|
if(keyName == "tab") {
|
||||||
return vkTab;
|
return vkTab;
|
||||||
}
|
}
|
||||||
|
@ -701,40 +704,47 @@ char Window::getNormalKey(SDL_keysym keysym,bool skipSpecialKeys) {
|
||||||
if(keyName == "pause") {
|
if(keyName == "pause") {
|
||||||
return vkPause;
|
return vkPause;
|
||||||
}
|
}
|
||||||
if(keyName == "F1") {
|
if(keyName == "question mark" || keyName == "?") {
|
||||||
|
return '?';
|
||||||
|
}
|
||||||
|
if(keyName == "space") {
|
||||||
|
return ' ';
|
||||||
|
}
|
||||||
|
|
||||||
|
if(keyName == "f1") {
|
||||||
return vkF1;
|
return vkF1;
|
||||||
}
|
}
|
||||||
if(keyName == "F2") {
|
if(keyName == "f2") {
|
||||||
return vkF2;
|
return vkF2;
|
||||||
}
|
}
|
||||||
if(keyName == "F3") {
|
if(keyName == "f3") {
|
||||||
return vkF3;
|
return vkF3;
|
||||||
}
|
}
|
||||||
if(keyName == "F4") {
|
if(keyName == "f4") {
|
||||||
return vkF4;
|
return vkF4;
|
||||||
}
|
}
|
||||||
if(keyName == "F5") {
|
if(keyName == "f5") {
|
||||||
return vkF5;
|
return vkF5;
|
||||||
}
|
}
|
||||||
if(keyName == "F6") {
|
if(keyName == "f6") {
|
||||||
return vkF6;
|
return vkF6;
|
||||||
}
|
}
|
||||||
if(keyName == "F7") {
|
if(keyName == "f7") {
|
||||||
return vkF7;
|
return vkF7;
|
||||||
}
|
}
|
||||||
if(keyName == "F8") {
|
if(keyName == "f8") {
|
||||||
return vkF8;
|
return vkF8;
|
||||||
}
|
}
|
||||||
if(keyName == "F9") {
|
if(keyName == "f9") {
|
||||||
return vkF9;
|
return vkF9;
|
||||||
}
|
}
|
||||||
if(keyName == "F10") {
|
if(keyName == "f10") {
|
||||||
return vkF10;
|
return vkF10;
|
||||||
}
|
}
|
||||||
if(keyName == "F11") {
|
if(keyName == "f11") {
|
||||||
return vkF11;
|
return vkF11;
|
||||||
}
|
}
|
||||||
if(keyName == "F12") {
|
if(keyName == "f12") {
|
||||||
return vkF12;
|
return vkF12;
|
||||||
}
|
}
|
||||||
if(keyName == "0") {
|
if(keyName == "0") {
|
||||||
|
@ -767,9 +777,6 @@ char Window::getNormalKey(SDL_keysym keysym,bool skipSpecialKeys) {
|
||||||
if(keyName == "9") {
|
if(keyName == "9") {
|
||||||
return '9';
|
return '9';
|
||||||
}
|
}
|
||||||
if(keyName == "question mark" || keyName == "?") {
|
|
||||||
return '?';
|
|
||||||
}
|
|
||||||
if(keyName == "a") {
|
if(keyName == "a") {
|
||||||
return 'A';
|
return 'A';
|
||||||
}
|
}
|
||||||
|
@ -849,6 +856,9 @@ char Window::getNormalKey(SDL_keysym keysym,bool skipSpecialKeys) {
|
||||||
return 'Z';
|
return 'Z';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(unicodeKey > 0 && unicodeKey <= 255) {
|
||||||
|
return unicodeKey;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -920,8 +930,10 @@ char Window::getKey(SDL_keysym keysym,bool skipSpecialKeys) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(keysym.sym <= 255) {
|
||||||
c = keysym.sym;
|
c = keysym.sym;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %u] c = [%d]\n",__FILE__,__FUNCTION__,__LINE__,c);
|
SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %u] c = [%d]\n",__FILE__,__FUNCTION__,__LINE__,c);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user