Client now provides methods for reading and saving preferences - less powerful than raw access to Cajun, (no mixed type arrays, for example) but allows other save formats to be used, such as property lists on OS X

This commit is contained in:
Simon Robertshaw 2012-06-22 01:04:55 +01:00
parent 550f6e28e0
commit 3c91e526bb
4 changed files with 248 additions and 45 deletions

View File

@ -20,6 +20,8 @@
#include "interface/ControlFactory.h"
#include "interface/Point.h"
#include "interface/Label.h"
#include "simulation/SaveRenderer.h"
#include "client/Client.h"
#include "game/GameController.h"
#include "game/GameView.h"
@ -237,6 +239,7 @@ int main(int argc, char * argv[])
ui::Engine::Ref().CloseWindow();
delete gameController;
delete ui::Engine::Ref().g;
Client::Ref().Shutdown();
return 0;
}

View File

@ -6,6 +6,7 @@
#include <iomanip>
#include <time.h>
#include <stdio.h>
#include <deque>
#ifdef WIN32
#include <direct.h>
@ -194,7 +195,7 @@ void Client::AddListener(ClientListener * listener)
listeners.push_back(listener);
}
Client::~Client()
void Client::Shutdown()
{
ClearThumbnailRequests();
http_done();
@ -226,6 +227,10 @@ Client::~Client()
}
}
Client::~Client()
{
}
void Client::SetAuthUser(User user)
{
@ -1277,3 +1282,208 @@ std::vector<string> * Client::AddTag(int saveID, string tag)
free(data);
return tags;
}
vector<std::string> Client::explodePropertyString(std::string property)
{
vector<string> stringArray;
string current = "";
for (string::iterator iter = property.begin(); iter != property.end(); ++iter) {
if (*iter == '.') {
if (current.length() > 0) {
stringArray.push_back(current);
current = "";
}
} else {
current += *iter;
}
}
if(current.length() > 0)
stringArray.push_back(current);
return stringArray;
}
std::string Client::GetPrefString(std::string property, std::string defaultValue)
{
try
{
json::String value = GetPref(property);
return value.Value();
}
catch (json::Exception & e)
{
}
return defaultValue;
}
double Client::GetPrefNumber(std::string property, double defaultValue)
{
try
{
json::Number value = GetPref(property);
return value.Value();
}
catch (json::Exception & e)
{
}
return defaultValue;
}
vector<string> Client::GetPrefStringArray(std::string property)
{
try
{
json::Array value = GetPref(property);
vector<string> strArray;
for(json::Array::iterator iter = value.Begin(); iter != value.End(); ++iter)
{
json::String cValue = *iter;
strArray.push_back(cValue.Value());
}
return strArray;
}
catch (json::Exception & e)
{
}
return vector<string>();
}
vector<double> Client::GetPrefNumberArray(std::string property)
{
try
{
json::Array value = GetPref(property);
vector<double> strArray;
for(json::Array::iterator iter = value.Begin(); iter != value.End(); ++iter)
{
json::Number cValue = *iter;
strArray.push_back(cValue.Value());
}
return strArray;
}
catch (json::Exception & e)
{
}
return vector<double>();
}
vector<bool> Client::GetPrefBoolArray(std::string property)
{
try
{
json::Array value = GetPref(property);
vector<bool> strArray;
for(json::Array::iterator iter = value.Begin(); iter != value.End(); ++iter)
{
json::Boolean cValue = *iter;
strArray.push_back(cValue.Value());
}
return strArray;
}
catch (json::Exception & e)
{
}
return vector<bool>();
}
bool Client::GetPrefBool(std::string property, bool defaultValue)
{
try
{
json::Boolean value = GetPref(property);
return value.Value();
}
catch (json::Exception & e)
{
}
return defaultValue;
}
void Client::SetPref(std::string property, std::string value)
{
json::UnknownElement stringValue = json::String(value);
SetPref(property, stringValue);
}
void Client::SetPref(std::string property, double value)
{
json::UnknownElement numberValue = json::Number(value);
SetPref(property, numberValue);
}
void Client::SetPref(std::string property, vector<string> value)
{
json::Array newArray;
for(vector<string>::iterator iter = value.begin(); iter != value.end(); ++iter)
{
newArray.Insert(json::String(*iter));
}
json::UnknownElement newArrayValue = newArray;
SetPref(property, newArrayValue);
}
void Client::SetPref(std::string property, vector<double> value)
{
json::Array newArray;
for(vector<double>::iterator iter = value.begin(); iter != value.end(); ++iter)
{
newArray.Insert(json::Number(*iter));
}
json::UnknownElement newArrayValue = newArray;
SetPref(property, newArrayValue);
}
void Client::SetPref(std::string property, vector<bool> value)
{
json::Array newArray;
for(vector<bool>::iterator iter = value.begin(); iter != value.end(); ++iter)
{
newArray.Insert(json::Boolean(*iter));
}
json::UnknownElement newArrayValue = newArray;
SetPref(property, newArrayValue);
}
void Client::SetPref(std::string property, bool value)
{
json::UnknownElement boolValue = json::Boolean(value);
SetPref(property, boolValue);
}
json::UnknownElement Client::GetPref(std::string property)
{
vector<string> pTokens = Client::explodePropertyString(property);
const json::UnknownElement & configDocumentCopy = configDocument;
json::UnknownElement currentRef = configDocumentCopy;
for(vector<string>::iterator iter = pTokens.begin(); iter != pTokens.end(); ++iter)
{
currentRef = currentRef[*iter];
}
return currentRef;
}
void Client::setPrefR(std::deque<string> tokens, json::UnknownElement & element, json::UnknownElement & value)
{
if(tokens.size())
{
std::string token = tokens.front();
tokens.pop_front();
setPrefR(tokens, element[token], value);
}
else
element = value;
}
void Client::SetPref(std::string property, json::UnknownElement & value)
{
vector<string> pTokens = Client::explodePropertyString(property);
deque<string> dTokens(pTokens.begin(), pTokens.end());
string token = dTokens.front();
dTokens.pop_front();
setPrefR(dTokens, configDocument[token], value);
}

View File

@ -51,13 +51,13 @@ private:
int activeThumbRequestCompleteTimes[IMGCONNS];
std::string activeThumbRequestIDs[IMGCONNS];
void updateStamps();
static vector<std::string> explodePropertyString(std::string property);
void notifyUpdateAvailable();
public:
vector<ClientListener*> listeners;
//Config file handle
json::Object configDocument;
public:
vector<ClientListener*> listeners;
Client();
~Client();
@ -94,6 +94,25 @@ public:
return lastError;
}
void Tick();
void Shutdown();
std::string GetPrefString(std::string property, std::string defaultValue);
double GetPrefNumber(std::string property, double defaultValue);
vector<string> GetPrefStringArray(std::string property);
vector<double> GetPrefNumberArray(std::string property);
vector<bool> GetPrefBoolArray(std::string property);
bool GetPrefBool(std::string property, bool defaultValue);
void SetPref(std::string property, std::string value);
void SetPref(std::string property, double value);
void SetPref(std::string property, vector<string> value);
void SetPref(std::string property, vector<double> value);
void SetPref(std::string property, vector<bool> value);
void SetPref(std::string property, bool value);
json::UnknownElement GetPref(std::string property);
void setPrefR(std::deque<string> tokens, json::UnknownElement & element, json::UnknownElement & value);
void SetPref(std::string property, json::UnknownElement & value);
};
#endif // CLIENT_H

View File

@ -30,33 +30,19 @@ GameModel::GameModel():
//Load config into renderer
try
{
json::Number tempNumber = Client::Ref().configDocument["Renderer"]["ColourMode"];
if(tempNumber.Value())
ren->SetColourMode(tempNumber.Value());
ren->SetColourMode(Client::Ref().GetPrefNumber("Renderer.ColourMode", 0));
json::Array tempArray = Client::Ref().configDocument["Renderer"]["DisplayModes"];
if(tempArray.Size())
vector<double> tempArray = Client::Ref().GetPrefNumberArray("Renderer.DisplayModes");
if(tempArray.size())
{
std::vector<unsigned int> displayModes;
json::Array::const_iterator itDisplayModes(tempArray.Begin()), itDisplayModesEnd(tempArray.End());
for (; itDisplayModes != itDisplayModesEnd; ++itDisplayModes)
{
json::Number tempNumberI = *itDisplayModes;
displayModes.push_back(tempNumberI.Value());
}
std::vector<unsigned int> displayModes(tempArray.begin(), tempArray.end());
ren->SetDisplayMode(displayModes);
}
tempArray = Client::Ref().configDocument["Renderer"]["RenderModes"];
if(tempArray.Size())
tempArray = Client::Ref().GetPrefNumberArray("Renderer.RenderModes");
if(tempArray.size())
{
std::vector<unsigned int> renderModes;
json::Array::const_iterator itRenderModes(tempArray.Begin()), itRenderModesEnd(tempArray.End());
for (; itRenderModes != itRenderModesEnd; ++itRenderModes)
{
json::Number tempNumberI = *itRenderModes;
renderModes.push_back(tempNumberI.Value());
}
std::vector<unsigned int> renderModes(tempArray.begin(), tempArray.end());
ren->SetRenderMode(renderModes);
}
}
@ -145,28 +131,13 @@ GameModel::GameModel():
GameModel::~GameModel()
{
//Save to config:
try
{
Client::Ref().configDocument["Renderer"]["ColourMode"] = json::Number(ren->GetColourMode());
Client::Ref().SetPref("Renderer.ColourMode", (double)ren->GetColourMode());
Client::Ref().configDocument["Renderer"]["DisplayModes"] = json::Array();
std::vector<unsigned int> displayModes = ren->GetDisplayMode();
for (int i = 0; i < displayModes.size(); i++)
{
Client::Ref().configDocument["Renderer"]["DisplayModes"][i] = json::Number(displayModes[i]);
}
std::vector<unsigned int> displayModes = ren->GetDisplayMode();
Client::Ref().SetPref("Renderer.DisplayModes", std::vector<double>(displayModes.begin(), displayModes.end()));
Client::Ref().configDocument["Renderer"]["RenderModes"] = json::Array();
std::vector<unsigned int> renderModes = ren->GetRenderMode();
for (int i = 0; i < renderModes.size(); i++)
{
Client::Ref().configDocument["Renderer"]["RenderModes"][i] = json::Number(renderModes[i]);
}
}
catch(json::Exception & e)
{
}
std::vector<unsigned int> renderModes = ren->GetRenderMode();
Client::Ref().SetPref("Renderer.RenderModes", std::vector<double>(renderModes.begin(), renderModes.end()));
for(int i = 0; i < menuList.size(); i++)
{