diff --git a/source/glest_game/global/config.cpp b/source/glest_game/global/config.cpp index 72153970..18bfc3d3 100644 --- a/source/glest_game/global/config.cpp +++ b/source/glest_game/global/config.cpp @@ -78,6 +78,8 @@ Config::Config() { cfgType.second = cfgUserGame; fileName.first = ""; fileName.second = ""; + fileNameParameter.first = ""; + fileNameParameter.second = ""; fileLoaded.first = false; fileLoaded.second = false; } @@ -88,6 +90,8 @@ Config::Config(std::pair type, std::pair f cfgType = type; fileName = file; + fileNameParameter = file; + if(getGameReadWritePath(GameConstants::path_ini_CacheLookupKey) != "") { fileName.first = getGameReadWritePath(GameConstants::path_ini_CacheLookupKey) + fileName.first; 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->cfgType = src->cfgType; dest->fileName = src->fileName; + dest->fileNameParameter = src->fileNameParameter; dest->fileLoaded = src->fileLoaded; } void Config::reload() { if(SystemFlags::VERBOSE_MODE_ENABLED) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); - std::pair type = std::make_pair(cfgMainGame,cfgUserGame); - Config newconfig(type, std::make_pair(glest_ini_filename,glestuser_ini_filename), std::make_pair(true,false)); + std::pair type = std::make_pair(cfgType.first,cfgType.second); + 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__); @@ -565,6 +570,24 @@ vector > Config::getUserProperties() const { return getPropertiesFromContainer(properties.second); } +void Config::setUserProperties(const vector > &valueList) { + Properties &propertiesObj = properties.second; + + for(int idx = 0; idx < valueList.size(); ++ idx) { + const pair &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(){ return properties.first.toString(); } diff --git a/source/glest_game/global/config.h b/source/glest_game/global/config.h index 9742d673..350b529e 100644 --- a/source/glest_game/global/config.h +++ b/source/glest_game/global/config.h @@ -39,6 +39,7 @@ class Config { private: std::pair properties; std::pair cfgType; + std::pair fileNameParameter; std::pair fileName; std::pair fileLoaded; @@ -82,6 +83,9 @@ public: vector > getMergedProperties() const; vector > getMasterProperties() const; vector > getUserProperties() const; + void setUserProperties(const vector > &valueList); + + string getFileName(bool userFilename) const; char translateStringToCharKey(const string &value) const; SDLKey translateSpecialStringToSDLKey(char c) const; diff --git a/source/glest_game/graphics/renderer.cpp b/source/glest_game/graphics/renderer.cpp index a43f3485..1e6311fa 100644 --- a/source/glest_game/graphics/renderer.cpp +++ b/source/glest_game/graphics/renderer.cpp @@ -1289,7 +1289,7 @@ void Renderer::renderLabel(const GraphicLabel *label,const Vec4f *color) { glPopAttrib(); } -void Renderer::renderButton(const GraphicButton *button) { +void Renderer::renderButton(const GraphicButton *button, const Vec4f *fontColorOverride) { if(button->getVisible() == false) { return; } @@ -1314,14 +1314,14 @@ void Renderer::renderButton(const GraphicButton *button) { //button Vec4f fontColor; - //if(game!=NULL){ - // fontColor=game->getGui()->getDisplay()->getColor(); - // fontColor.w = GraphicComponent::getFade(); - //} - //else { + + if(fontColorOverride != NULL) { + fontColor= *fontColorOverride; + } + else { // white shadowed is default ( in the menu for example ) fontColor=Vec4f(1.f, 1.f, 1.f, GraphicComponent::getFade()); - //} + } //Vec4f color= Vec4f(1.f, 1.f, 1.f, GraphicComponent::getFade()); Vec4f color= fontColor; diff --git a/source/glest_game/graphics/renderer.h b/source/glest_game/graphics/renderer.h index 91a26200..c6a7bc07 100644 --- a/source/glest_game/graphics/renderer.h +++ b/source/glest_game/graphics/renderer.h @@ -357,7 +357,7 @@ public: void renderLabel(const GraphicLabel *label); void renderLabel(const GraphicLabel *label,const Vec3f *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 renderLine(const GraphicLine *line); void renderScrollBar(const GraphicScrollBar *sb); diff --git a/source/glest_game/menu/menu_state_keysetup.cpp b/source/glest_game/menu/menu_state_keysetup.cpp index 27c3da80..444d785e 100644 --- a/source/glest_game/menu/menu_state_keysetup.cpp +++ b/source/glest_game/menu/menu_state_keysetup.cpp @@ -63,9 +63,13 @@ MenuStateKeysetup::MenuStateKeysetup(Program *program, MainMenu *mainMenu): buttonOk.init(200, buttonRowPos, 100); buttonOk.setText(lang.get("Ok")); + buttonDefaults.registerGraphicComponent(containerName,"buttonDefaults"); + buttonDefaults.init(310, buttonRowPos, 100); + buttonDefaults.setText(lang.get("Defaults")); + buttonReturn.registerGraphicComponent(containerName,"buttonReturn"); - buttonReturn.init(310, buttonRowPos, 100); - buttonReturn.setText(lang.get("Return")); + buttonReturn.init(420, buttonRowPos, 100); + buttonReturn.setText(lang.get("Abort")); keyButtonsLineHeight=25; keyButtonsHeight=20; @@ -78,7 +82,8 @@ MenuStateKeysetup::MenuStateKeysetup(Program *program, MainMenu *mainMenu): Config &configKeys = Config::getInstance(std::pair(cfgMainKeys,cfgUserKeys)); mergedProperties=configKeys.getMergedProperties(); masterProperties=configKeys.getMasterProperties(); - userProperties=configKeys.getUserProperties(); + //userProperties=configKeys.getUserProperties(); + userProperties.clear(); 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)); 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(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)){ 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__); + + if(userProperties.size() > 0) { + Config &configKeys = Config::getInstance(std::pair(cfgMainKeys,cfgUserKeys)); + configKeys.setUserProperties(userProperties); + configKeys.save(); + configKeys.reload(); + } + mainMenu->setState(new MenuStateOptions(program, mainMenu)); SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); } @@ -213,12 +242,18 @@ void MenuStateKeysetup::render(){ else { renderer.renderButton(&buttonReturn); + renderer.renderButton(&buttonDefaults); renderer.renderButton(&buttonOk); renderer.renderLabel(&labelTitle); if(keyScrollBar.getElementCount()!=0 ) { 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]); } } @@ -269,25 +304,46 @@ void MenuStateKeysetup::keyPress(char c) { void MenuStateKeysetup::keyUp(char key) { //Config &configKeys = Config::getInstance(std::pair(cfgMainKeys,cfgUserKeys)); - if(hotkeyIndex >= 0 && hotkeyChar != 0) { - string keyName = SDL_GetKeyName(static_cast(hotkeyChar)); + if(hotkeyIndex >= 0) { + if(hotkeyChar != 0) { + string keyName = SDL_GetKeyName(static_cast(hotkeyChar)); - if(keyName == "unknown key") { - Config &configKeys = Config::getInstance(std::pair(cfgMainKeys,cfgUserKeys)); - SDLKey keysym = configKeys.translateSpecialStringToSDLKey(hotkeyChar); - // SDL skips capital letters - if(keysym >= 65 && keysym <= 90) { - keysym = (SDLKey)((int)keysym + 32); + key = hotkeyChar; + if(keyName == "unknown key") { + Config &configKeys = Config::getInstance(std::pair(cfgMainKeys,cfgUserKeys)); + SDLKey keysym = configKeys.translateSpecialStringToSDLKey(hotkeyChar); + // SDL skips capital letters + 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") { - GraphicLabel *label= labels[hotkeyIndex]; - label->setText(keyName); - } + if(keyName != "unknown key") { + GraphicLabel *label= labels[hotkeyIndex]; + label->setText(keyName); + + pair &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 newNameValuePair = nameValuePair; + newNameValuePair.second = key; + userProperties.push_back(newNameValuePair); + } + } + } hotkeyIndex = -1; hotkeyChar = 0; } diff --git a/source/glest_game/menu/menu_state_keysetup.h b/source/glest_game/menu/menu_state_keysetup.h index fb506274..6d106215 100644 --- a/source/glest_game/menu/menu_state_keysetup.h +++ b/source/glest_game/menu/menu_state_keysetup.h @@ -29,6 +29,7 @@ class MenuStateKeysetup: public MenuState { private: GraphicButton buttonOk; + GraphicButton buttonDefaults; GraphicButton buttonReturn; GraphicLabel labelTitle;