- configurable keys can be edited in keyboard menu now

This commit is contained in:
Mark Vejvoda 2011-03-04 22:54:04 +00:00
parent 0f57fe6b92
commit 935895c89f
6 changed files with 113 additions and 29 deletions

View File

@ -78,6 +78,8 @@ Config::Config() {
cfgType.second = cfgUserGame; cfgType.second = cfgUserGame;
fileName.first = ""; fileName.first = "";
fileName.second = ""; fileName.second = "";
fileNameParameter.first = "";
fileNameParameter.second = "";
fileLoaded.first = false; fileLoaded.first = false;
fileLoaded.second = false; fileLoaded.second = false;
} }
@ -88,6 +90,8 @@ Config::Config(std::pair<ConfigType,ConfigType> type, std::pair<string,string> f
cfgType = type; cfgType = type;
fileName = file; fileName = file;
fileNameParameter = file;
if(getGameReadWritePath(GameConstants::path_ini_CacheLookupKey) != "") { if(getGameReadWritePath(GameConstants::path_ini_CacheLookupKey) != "") {
fileName.first = getGameReadWritePath(GameConstants::path_ini_CacheLookupKey) + fileName.first; fileName.first = getGameReadWritePath(GameConstants::path_ini_CacheLookupKey) + fileName.first;
fileName.second = getGameReadWritePath(GameConstants::path_ini_CacheLookupKey) + fileName.second; fileName.second = getGameReadWritePath(GameConstants::path_ini_CacheLookupKey) + fileName.second;
@ -156,14 +160,15 @@ void Config::CopyAll(Config *src, Config *dest) {
dest->properties = src->properties; dest->properties = src->properties;
dest->cfgType = src->cfgType; dest->cfgType = src->cfgType;
dest->fileName = src->fileName; dest->fileName = src->fileName;
dest->fileNameParameter = src->fileNameParameter;
dest->fileLoaded = src->fileLoaded; dest->fileLoaded = src->fileLoaded;
} }
void Config::reload() { void Config::reload() {
if(SystemFlags::VERBOSE_MODE_ENABLED) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); if(SystemFlags::VERBOSE_MODE_ENABLED) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
std::pair<ConfigType,ConfigType> type = std::make_pair(cfgMainGame,cfgUserGame); std::pair<ConfigType,ConfigType> type = std::make_pair(cfgType.first,cfgType.second);
Config newconfig(type, std::make_pair(glest_ini_filename,glestuser_ini_filename), std::make_pair(true,false)); Config newconfig(type, std::make_pair(fileNameParameter.first,fileNameParameter.second), std::make_pair(true,false));
if(SystemFlags::VERBOSE_MODE_ENABLED) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); if(SystemFlags::VERBOSE_MODE_ENABLED) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
@ -565,6 +570,24 @@ vector<pair<string,string> > Config::getUserProperties() const {
return getPropertiesFromContainer(properties.second); return getPropertiesFromContainer(properties.second);
} }
void Config::setUserProperties(const vector<pair<string,string> > &valueList) {
Properties &propertiesObj = properties.second;
for(int idx = 0; idx < valueList.size(); ++ idx) {
const pair<string,string> &nameValuePair = valueList[idx];
propertiesObj.setString(nameValuePair.first,nameValuePair.second);
}
}
string Config::getFileName(bool userFilename) const {
string result = fileName.second;
if(userFilename == false) {
result = fileName.first;
}
return result;
}
string Config::toString(){ string Config::toString(){
return properties.first.toString(); return properties.first.toString();
} }

View File

@ -39,6 +39,7 @@ class Config {
private: private:
std::pair<Properties,Properties> properties; std::pair<Properties,Properties> properties;
std::pair<ConfigType,ConfigType> cfgType; std::pair<ConfigType,ConfigType> cfgType;
std::pair<string,string> fileNameParameter;
std::pair<string,string> fileName; std::pair<string,string> fileName;
std::pair<bool,bool> fileLoaded; std::pair<bool,bool> fileLoaded;
@ -82,6 +83,9 @@ public:
vector<pair<string,string> > getMergedProperties() const; vector<pair<string,string> > getMergedProperties() const;
vector<pair<string,string> > getMasterProperties() const; vector<pair<string,string> > getMasterProperties() const;
vector<pair<string,string> > getUserProperties() const; vector<pair<string,string> > getUserProperties() const;
void setUserProperties(const vector<pair<string,string> > &valueList);
string getFileName(bool userFilename) const;
char translateStringToCharKey(const string &value) const; char translateStringToCharKey(const string &value) const;
SDLKey translateSpecialStringToSDLKey(char c) const; SDLKey translateSpecialStringToSDLKey(char c) const;

View File

@ -1289,7 +1289,7 @@ void Renderer::renderLabel(const GraphicLabel *label,const Vec4f *color) {
glPopAttrib(); glPopAttrib();
} }
void Renderer::renderButton(const GraphicButton *button) { void Renderer::renderButton(const GraphicButton *button, const Vec4f *fontColorOverride) {
if(button->getVisible() == false) { if(button->getVisible() == false) {
return; return;
} }
@ -1314,14 +1314,14 @@ void Renderer::renderButton(const GraphicButton *button) {
//button //button
Vec4f fontColor; Vec4f fontColor;
//if(game!=NULL){
// fontColor=game->getGui()->getDisplay()->getColor(); if(fontColorOverride != NULL) {
// fontColor.w = GraphicComponent::getFade(); fontColor= *fontColorOverride;
//} }
//else { else {
// white shadowed is default ( in the menu for example ) // white shadowed is default ( in the menu for example )
fontColor=Vec4f(1.f, 1.f, 1.f, GraphicComponent::getFade()); fontColor=Vec4f(1.f, 1.f, 1.f, GraphicComponent::getFade());
//} }
//Vec4f color= Vec4f(1.f, 1.f, 1.f, GraphicComponent::getFade()); //Vec4f color= Vec4f(1.f, 1.f, 1.f, GraphicComponent::getFade());
Vec4f color= fontColor; Vec4f color= fontColor;

View File

@ -357,7 +357,7 @@ public:
void renderLabel(const GraphicLabel *label); void renderLabel(const GraphicLabel *label);
void renderLabel(const GraphicLabel *label,const Vec3f *color); void renderLabel(const GraphicLabel *label,const Vec3f *color);
void renderLabel(const GraphicLabel *label,const Vec4f *color); void renderLabel(const GraphicLabel *label,const Vec4f *color);
void renderButton(const GraphicButton *button); void renderButton(const GraphicButton *button,const Vec4f *fontColorOverride=NULL);
void renderCheckBox(const GraphicCheckBox *box); void renderCheckBox(const GraphicCheckBox *box);
void renderLine(const GraphicLine *line); void renderLine(const GraphicLine *line);
void renderScrollBar(const GraphicScrollBar *sb); void renderScrollBar(const GraphicScrollBar *sb);

View File

@ -63,9 +63,13 @@ MenuStateKeysetup::MenuStateKeysetup(Program *program, MainMenu *mainMenu):
buttonOk.init(200, buttonRowPos, 100); buttonOk.init(200, buttonRowPos, 100);
buttonOk.setText(lang.get("Ok")); buttonOk.setText(lang.get("Ok"));
buttonDefaults.registerGraphicComponent(containerName,"buttonDefaults");
buttonDefaults.init(310, buttonRowPos, 100);
buttonDefaults.setText(lang.get("Defaults"));
buttonReturn.registerGraphicComponent(containerName,"buttonReturn"); buttonReturn.registerGraphicComponent(containerName,"buttonReturn");
buttonReturn.init(310, buttonRowPos, 100); buttonReturn.init(420, buttonRowPos, 100);
buttonReturn.setText(lang.get("Return")); buttonReturn.setText(lang.get("Abort"));
keyButtonsLineHeight=25; keyButtonsLineHeight=25;
keyButtonsHeight=20; keyButtonsHeight=20;
@ -78,7 +82,8 @@ MenuStateKeysetup::MenuStateKeysetup(Program *program, MainMenu *mainMenu):
Config &configKeys = Config::getInstance(std::pair<ConfigType,ConfigType>(cfgMainKeys,cfgUserKeys)); Config &configKeys = Config::getInstance(std::pair<ConfigType,ConfigType>(cfgMainKeys,cfgUserKeys));
mergedProperties=configKeys.getMergedProperties(); mergedProperties=configKeys.getMergedProperties();
masterProperties=configKeys.getMasterProperties(); masterProperties=configKeys.getMasterProperties();
userProperties=configKeys.getUserProperties(); //userProperties=configKeys.getUserProperties();
userProperties.clear();
for(int i = 0; i < mergedProperties.size(); ++i) { for(int i = 0; i < mergedProperties.size(); ++i) {
@ -166,10 +171,34 @@ void MenuStateKeysetup::mouseClick(int x, int y, MouseButton mouseButton){
mainMenu->setState(new MenuStateOptions(program, mainMenu)); mainMenu->setState(new MenuStateOptions(program, 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__);
} }
else if(buttonDefaults.mouseClick(x, y)){
SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
soundRenderer.playFx(coreData.getClickSoundB());
SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
Config &configKeys = Config::getInstance(std::pair<ConfigType,ConfigType>(cfgMainKeys,cfgUserKeys));
string userKeysFile = configKeys.getFileName(true);
int result = unlink(userKeysFile.c_str());
SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d] delete file [%s] returned %d\n",__FILE__,__FUNCTION__,__LINE__,userKeysFile.c_str(),result);
configKeys.reload();
mainMenu->setState(new MenuStateOptions(program, mainMenu));
SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
}
else if(buttonOk.mouseClick(x, y)){ else if(buttonOk.mouseClick(x, y)){
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__);
soundRenderer.playFx(coreData.getClickSoundB()); soundRenderer.playFx(coreData.getClickSoundB());
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__);
if(userProperties.size() > 0) {
Config &configKeys = Config::getInstance(std::pair<ConfigType,ConfigType>(cfgMainKeys,cfgUserKeys));
configKeys.setUserProperties(userProperties);
configKeys.save();
configKeys.reload();
}
mainMenu->setState(new MenuStateOptions(program, mainMenu)); mainMenu->setState(new MenuStateOptions(program, 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__);
} }
@ -213,12 +242,18 @@ void MenuStateKeysetup::render(){
else else
{ {
renderer.renderButton(&buttonReturn); renderer.renderButton(&buttonReturn);
renderer.renderButton(&buttonDefaults);
renderer.renderButton(&buttonOk); renderer.renderButton(&buttonOk);
renderer.renderLabel(&labelTitle); renderer.renderLabel(&labelTitle);
if(keyScrollBar.getElementCount()!=0 ) { if(keyScrollBar.getElementCount()!=0 ) {
for(int i = keyScrollBar.getVisibleStart(); i <= keyScrollBar.getVisibleEnd(); ++i) { for(int i = keyScrollBar.getVisibleStart(); i <= keyScrollBar.getVisibleEnd(); ++i) {
renderer.renderButton(keyButtons[i]); if(hotkeyIndex == i) {
renderer.renderButton(keyButtons[i],&YELLOW);
}
else {
renderer.renderButton(keyButtons[i]);
}
renderer.renderLabel(labels[i]); renderer.renderLabel(labels[i]);
} }
} }
@ -269,25 +304,46 @@ 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)); //Config &configKeys = Config::getInstance(std::pair<ConfigType,ConfigType>(cfgMainKeys,cfgUserKeys));
if(hotkeyIndex >= 0 && hotkeyChar != 0) { if(hotkeyIndex >= 0) {
string keyName = SDL_GetKeyName(static_cast<SDLKey>(hotkeyChar)); if(hotkeyChar != 0) {
string keyName = SDL_GetKeyName(static_cast<SDLKey>(hotkeyChar));
if(keyName == "unknown key") { key = hotkeyChar;
Config &configKeys = Config::getInstance(std::pair<ConfigType,ConfigType>(cfgMainKeys,cfgUserKeys)); if(keyName == "unknown key") {
SDLKey keysym = configKeys.translateSpecialStringToSDLKey(hotkeyChar); Config &configKeys = Config::getInstance(std::pair<ConfigType,ConfigType>(cfgMainKeys,cfgUserKeys));
// SDL skips capital letters SDLKey keysym = configKeys.translateSpecialStringToSDLKey(hotkeyChar);
if(keysym >= 65 && keysym <= 90) { // SDL skips capital letters
keysym = (SDLKey)((int)keysym + 32); if(keysym >= 65 && keysym <= 90) {
keysym = (SDLKey)((int)keysym + 32);
}
key = keysym;
keyName = SDL_GetKeyName(keysym);
} }
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(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") { if(keyName != "unknown key") {
GraphicLabel *label= labels[hotkeyIndex]; GraphicLabel *label= labels[hotkeyIndex];
label->setText(keyName); label->setText(keyName);
}
pair<string,string> &nameValuePair = mergedProperties[hotkeyIndex];
bool isNewUserKeyEntry = true;
for(int i = 0; i < userProperties.size(); ++i) {
string hotKeyName = userProperties[i].first;
if(nameValuePair.first == hotKeyName) {
userProperties[i].second = "";
userProperties[i].second.push_back(key);
isNewUserKeyEntry = false;
break;
}
}
if(isNewUserKeyEntry == true) {
pair<string,string> newNameValuePair = nameValuePair;
newNameValuePair.second = key;
userProperties.push_back(newNameValuePair);
}
}
}
hotkeyIndex = -1; hotkeyIndex = -1;
hotkeyChar = 0; hotkeyChar = 0;
} }

View File

@ -29,6 +29,7 @@ class MenuStateKeysetup: public MenuState {
private: private:
GraphicButton buttonOk; GraphicButton buttonOk;
GraphicButton buttonDefaults;
GraphicButton buttonReturn; GraphicButton buttonReturn;
GraphicLabel labelTitle; GraphicLabel labelTitle;