Store settings in an ordered map to allow for runtime getting and setting of settings. Read the setting file on startup, then write on shut down.

This commit is contained in:
Geenz 2013-05-27 18:48:05 -04:00
parent 94a07b92a7
commit 5efda079c9
2 changed files with 102 additions and 129 deletions

View file

@ -778,57 +778,93 @@ void Application::wheelEvent(QWheelEvent* event) {
const char AVATAR_DATA_FILENAME[] = "avatar.ifd"; const char AVATAR_DATA_FILENAME[] = "avatar.ifd";
bool Application::openSettingsFile(const char *mode) void Application::readSettingsFile()
{ {
_settingsFile = fopen(AVATAR_DATA_FILENAME, mode); FILE* settingsFile = fopen(AVATAR_DATA_FILENAME, "rt");
if (_settingsFile) if (settingsFile)
{ {
return true; char line[LINE_MAX];
} else {
return false; while (fgets(line, LINE_MAX, settingsFile) != NULL)
{
if (strcmp(line, " \n") > 0)
{
char *token = NULL;
char *settingLine = NULL;
char *toFree = NULL;
settingLine = strdup(line);
if (settingLine != NULL)
{
toFree = settingLine;
int i = 0;
char key[128];
char value[128];
while ((token = strsep(&settingLine, "=")) != NULL)
{
switch (i) {
case 0:
strcpy(key, token);
_settingsTable[key] = "";
break;
case 1:
strcpy(value, token);
_settingsTable[key] = token;
break;
default:
break;
}
i++;
}
free(toFree);
}
}
}
} }
fclose(settingsFile);
} }
void Application::closeSettingsFile() void Application::saveSettingsFile()
{ {
if (_settingsFile) FILE* settingsFile = fopen(AVATAR_DATA_FILENAME, "wt");
if (settingsFile)
{ {
fclose(_settingsFile); for (std::map<std::string, std::string>::iterator i = _settingsTable.begin(); i != _settingsTable.end(); i++)
_settingsFile = NULL; {
fprintf(settingsFile, "\n%s=%s", i->first.data(), i->second.data());
}
} }
fclose(settingsFile);
} }
bool Application::getSettingBool(const char *settingName, bool &boolSetting, bool defaultSetting) bool Application::getSettingBool(const char *settingName, bool &boolSetting, bool defaultSetting)
{ {
if (_settingsFile) if (_settingsTable[settingName] != "")
{ {
int readPosition; int readBool;
sscanf(_settingsTable[settingName].data(), "%d", &readBool);
char setting[128]; if (readBool == 1)
char vals[] = "%d";
sprintf(setting, "\n%s=%s", settingName, vals);
int res = fscanf(_settingsFile, setting, &readPosition);
if (res != EOF)
{ {
if (readPosition == 1) boolSetting = true;
{ } else if (readBool == 0) {
boolSetting = true; boolSetting = false;
} else if (readPosition == 0) {
boolSetting = false;
}
} else {
boolSetting = defaultSetting;
return false;
} }
} else { } else {
boolSetting = defaultSetting; boolSetting = defaultSetting;
printLog("Call to getSetting function without _settingsFile being open! Forgot to call openSettingsFile perhaps?\n");
return false; return false;
} }
@ -837,32 +873,19 @@ bool Application::getSettingBool(const char *settingName, bool &boolSetting, boo
bool Application::getSettingFloat(const char *settingName, float &floatSetting, float defaultSetting) bool Application::getSettingFloat(const char *settingName, float &floatSetting, float defaultSetting)
{ {
if (_settingsFile) if (_settingsTable[settingName] != "")
{ {
float readPosition; float readFloat;
sscanf(_settingsTable[settingName].data(), "%f", &readFloat);
char setting[128]; if (!isnan(readFloat)) {
char vals[] = "%f"; floatSetting = readFloat;
sprintf(setting, "\n%s=%s", settingName, vals);
int res = fscanf(_settingsFile, setting, &readPosition);
if (res != EOF)
{
if (!isnan(readPosition)) {
floatSetting = readPosition;
} else {
floatSetting = defaultSetting;
}
} else { } else {
floatSetting = defaultSetting; floatSetting = defaultSetting;
return false; return false;
} }
} else { } else {
floatSetting = defaultSetting; floatSetting = defaultSetting;
printLog("Call to getSetting function without _settingsFile! Forgot to call openSettingsFile perhaps?\n");
return false; return false;
} }
@ -871,32 +894,19 @@ bool Application::getSettingFloat(const char *settingName, float &floatSetting,
bool Application::getSettingVec3(const char *settingName, glm::vec3 &vecSetting, glm::vec3 defaultSetting) bool Application::getSettingVec3(const char *settingName, glm::vec3 &vecSetting, glm::vec3 defaultSetting)
{ {
if (_settingsFile) if (_settingsTable[settingName] != "")
{ {
glm::vec3 readPosition; glm::vec3 readVec;
sscanf(_settingsTable[settingName].data(), "%f,%f,%f", &readVec.x, &readVec.y, &readVec.z);
char setting[128]; if (!isnan(readVec.x) && !isnan(readVec.y) && !isnan(readVec.z)) {
char vals[] = "%f,%f,%f"; vecSetting = readVec;
sprintf(setting, "\n%s=%s", settingName, vals);
int res = fscanf(_settingsFile, setting, &readPosition.x, &readPosition.y, &readPosition.z);
if (res != EOF)
{
if (!isnan(readPosition.x) && !isnan(readPosition.y) && !isnan(readPosition.z)) {
vecSetting = readPosition;
} else {
vecSetting = defaultSetting;
}
} else { } else {
vecSetting = defaultSetting; vecSetting = defaultSetting;
return false; return false;
} }
} else { } else {
vecSetting = defaultSetting; vecSetting = defaultSetting;
printLog("Call to getSetting function without _settingsFile! Forgot to call openSettingsFile perhaps?\n");
return false; return false;
} }
@ -905,44 +915,23 @@ bool Application::getSettingVec3(const char *settingName, glm::vec3 &vecSetting,
void Application::setSettingBool(const char *settingName, bool boolSetting) void Application::setSettingBool(const char *settingName, bool boolSetting)
{ {
if (_settingsFile) char setting[128];
{ sprintf(setting, "%d", boolSetting);
char setting[128]; _settingsTable[settingName] = setting;
char vals[] = "%d";
sprintf(setting, "\n%s=%s", settingName, vals);
printLog(setting, boolSetting);
fprintf(_settingsFile, setting, boolSetting);
} else {
printLog("Call to setSetting function without _settingsFile! Forgot to call openSettingsFile perhaps?\n");
}
} }
void Application::setSettingFloat(const char *settingName, float floatSetting) void Application::setSettingFloat(const char *settingName, float floatSetting)
{ {
if (_settingsFile) char setting[128];
{ sprintf(setting, "%f", floatSetting);
char setting[128]; _settingsTable[settingName] = setting;
char vals[] = "%f";
sprintf(setting, "\n%s=%s", settingName, vals);
printLog(setting, floatSetting);
fprintf(_settingsFile, setting, floatSetting);
} else {
printLog("Call to setSetting function without _settingsFile! Forgot to call openSettingsFile perhaps?\n");
}
} }
void Application::setSettingVec3(const char *settingName, glm::vec3 vecSetting) void Application::setSettingVec3(const char *settingName, glm::vec3 vecSetting)
{ {
if (_settingsFile) char setting[128];
{ sprintf(setting, "%f,%f,%f", vecSetting.x, vecSetting.y, vecSetting.z);
char setting[128]; _settingsTable[settingName] = setting;
char vals[] = "%f,%f,%f";
sprintf(setting, "\n%s=%s", settingName, vals);
printLog(setting, vecSetting.x, vecSetting.y, vecSetting.z);
fprintf(_settingsFile, setting, vecSetting.x, vecSetting.y, vecSetting.z);
} else {
printLog("Call to setSetting function without _settingsFile! Forgot to call openSettingsFile perhaps?\n");
}
} }
// Every second, check the frame rates and other stuff // Every second, check the frame rates and other stuff
@ -2330,7 +2319,6 @@ void Application::saveSettings()
{ {
// Handle any persistent settings saving here when we get a call to terminate. // Handle any persistent settings saving here when we get a call to terminate.
// This should probably be moved to a map stored in memory at some point to cache settings. // This should probably be moved to a map stored in memory at some point to cache settings.
openSettingsFile("wt");
_myAvatar.writeAvatarDataToFile(); _myAvatar.writeAvatarDataToFile();
setSettingBool("_gyroLook", _gyroLook->isChecked()); setSettingBool("_gyroLook", _gyroLook->isChecked());
@ -2363,20 +2351,12 @@ void Application::saveSettings()
setSettingBool("_viewFrustumFromOffset", _viewFrustumFromOffset->isChecked()); setSettingBool("_viewFrustumFromOffset", _viewFrustumFromOffset->isChecked());
setSettingBool("wantsViewDeltaSending", _myAvatar.getWantDelta()); saveSettingsFile();
setSettingBool("wantsResIn", _myAvatar.getWantResIn());
setSettingBool("wantsMonochrome", _myAvatar.getWantColor());
setSettingBool("renderPipelineWarnings", _voxels.getRenderPipelineWarnings());
closeSettingsFile();
} }
void Application::readSettings() void Application::readSettings()
{ {
openSettingsFile("rt"); readSettingsFile();
_myAvatar.readAvatarDataFromFile(); _myAvatar.readAvatarDataFromFile();
bool settingState; bool settingState;
@ -2425,18 +2405,5 @@ void Application::readSettings()
getSettingBool("_viewFrustumFromOffset", settingState, _viewFrustumFromOffset->isChecked()); getSettingBool("_viewFrustumFromOffset", settingState, _viewFrustumFromOffset->isChecked());
_viewFrustumFromOffset->setChecked(settingState); _viewFrustumFromOffset->setChecked(settingState);
getSettingBool("wantsResIn", settingState, false);
setWantsResIn(settingState);
getSettingBool("wantsMonochrome", settingState, false);
setWantsMonochrome(settingState);
getSettingBool("renderPipelineWarnings", settingState, false);
setRenderWarnings(settingState);
getSettingBool("wantsViewDeltaSending", settingState, false);
setWantsDelta(settingState);
closeSettingsFile();
} }

View file

@ -11,6 +11,7 @@
#include <pthread.h> #include <pthread.h>
#include <time.h> #include <time.h>
#include <map>
#include <QApplication> #include <QApplication>
@ -183,11 +184,12 @@ private:
static void attachNewHeadToAgent(Agent *newAgent); static void attachNewHeadToAgent(Agent *newAgent);
static void* networkReceive(void* args); static void* networkReceive(void* args);
bool openSettingsFile(const char* mode); // These two functions are technically not necessary, but they help keep things in one place.
void closeSettingsFile(); void readSettings(); //! This function is largely to help consolidate getting settings in one place.
void saveSettings(); //! This function is to consolidate any settings setting in one place.
void saveSettings(); void readSettingsFile(); //! This function reads data from the settings file, splitting data into key value pairs using '=' as a delimiter.
void readSettings(); void saveSettingsFile(); //! This function writes all changes in the settings table to the settings file, serializing all settings added through the setSetting functions.
QMainWindow* _window; QMainWindow* _window;
QGLWidget* _glWidget; QGLWidget* _glWidget;
@ -214,7 +216,7 @@ private:
QAction* _destructiveAddVoxel; // when doing voxel editing do we want them to be destructive QAction* _destructiveAddVoxel; // when doing voxel editing do we want them to be destructive
QAction* _frustumOn; // Whether or not to display the debug view frustum QAction* _frustumOn; // Whether or not to display the debug view frustum
QAction* _viewFrustumFromOffset; // Whether or not to offset the view of the frustum QAction* _viewFrustumFromOffset; // Whether or not to offset the view of the frustum
QAction* _cameraFrustum; // which frustum to look at QAction* _cameraFrustum; // which frustum to look at
QAction* _frustumRenderModeAction; QAction* _frustumRenderModeAction;
SerialInterface _serialPort; SerialInterface _serialPort;
@ -306,7 +308,11 @@ private:
int _bytesPerSecond; int _bytesPerSecond;
int _bytesCount; int _bytesCount;
FILE* _settingsFile; /*!
* Store settings in a map, storing keys and values as strings.
* Interpret values as needed on demand. through the appropriate getters and setters.
*/
std::map<std::string, std::string> _settingsTable;
}; };
#endif /* defined(__interface__Application__) */ #endif /* defined(__interface__Application__) */