- 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;
fileName.first = "";
fileName.second = "";
fileNameParameter.first = "";
fileNameParameter.second = "";
fileLoaded.first = false;
fileLoaded.second = false;
}
@ -88,6 +90,8 @@ Config::Config(std::pair<ConfigType,ConfigType> type, std::pair<string,string> 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<ConfigType,ConfigType> 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<ConfigType,ConfigType> 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<pair<string,string> > Config::getUserProperties() const {
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(){
return properties.first.toString();
}

View File

@ -39,6 +39,7 @@ class Config {
private:
std::pair<Properties,Properties> properties;
std::pair<ConfigType,ConfigType> cfgType;
std::pair<string,string> fileNameParameter;
std::pair<string,string> fileName;
std::pair<bool,bool> fileLoaded;
@ -82,6 +83,9 @@ public:
vector<pair<string,string> > getMergedProperties() const;
vector<pair<string,string> > getMasterProperties() 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;
SDLKey translateSpecialStringToSDLKey(char c) const;

View File

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

View File

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

View File

@ -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<ConfigType,ConfigType>(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<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)){
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<ConfigType,ConfigType>(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<ConfigType,ConfigType>(cfgMainKeys,cfgUserKeys));
if(hotkeyIndex >= 0 && hotkeyChar != 0) {
string keyName = SDL_GetKeyName(static_cast<SDLKey>(hotkeyChar));
if(hotkeyIndex >= 0) {
if(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);
key = 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);
}
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<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;
hotkeyChar = 0;
}

View File

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