clean up settings mechanism (fixes #9 & #62)

* init, load, persist, sync, clear
 * clean up frequent disk syncs which impacted iOS performance
 * insert disk sync into various iOS/OS X lifecycle events
 * implement clear
 * implement save on iOS
 * cleaner dictionary syntax
This commit is contained in:
Justin R. Miller
2014-02-13 12:21:35 -08:00
parent 62c79e05cd
commit 257ccd16bb
8 changed files with 88 additions and 109 deletions

View File

@@ -7,16 +7,17 @@ namespace llmr {
class Settings : private util::noncopyable {
public:
virtual void save() = 0;
virtual void load() = 0; // load into memory
virtual void persist() = 0; // persist in memory (then call sync() if platform-appropriate)
virtual void sync() = 0; // save to disk
virtual void clear() = 0; // clear from memory and disk
virtual ~Settings() {}
public:
// position
double longitude = 0;
double latitude = 0;
double scale = 0;
double angle = 0;
// debug
bool debug = false;
};

View File

@@ -14,8 +14,9 @@ namespace llmr
{
public:
Settings_iOS();
virtual void save();
virtual void load();
virtual void persist();
virtual void sync();
virtual void clear();
};
}

View File

@@ -12,57 +12,41 @@
using namespace llmr;
Settings_iOS::Settings_iOS() {
NSDictionary *appDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
// position
[NSNumber numberWithDouble:longitude], @"longitude",
[NSNumber numberWithDouble:latitude], @"latitude",
[NSNumber numberWithDouble:scale], @"scale",
[NSNumber numberWithDouble:angle], @"angle",
// debug
[NSNumber numberWithBool:debug], @"debug",
nil
];
[[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];
Settings_iOS::Settings_iOS()
{
[[NSUserDefaults standardUserDefaults] registerDefaults:@{ @"longitude" : @(longitude),
@"latitude" : @(latitude),
@"scale" : @(scale),
@"angle" : @(angle),
@"debug" : @(debug) }];
}
void Settings_iOS::load() {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
void Settings_iOS::load()
{
NSDictionary *settings = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
// position
longitude = [defaults doubleForKey:@"longitude"];
latitude = [defaults doubleForKey:@"latitude"];
scale = [defaults doubleForKey:@"scale"];
angle = [defaults doubleForKey:@"angle"];
// debug
debug = [defaults boolForKey:@"debug"];
longitude = [settings[@"longitude"] doubleValue];
latitude = [settings[@"latitude"] doubleValue];
scale = [settings[@"scale"] doubleValue];
angle = [settings[@"angle"] doubleValue];
debug = [settings[@"debug"] boolValue];
}
void Settings_iOS::save() {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSDictionary *appDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
// position
[NSNumber numberWithDouble:longitude], @"longitude",
[NSNumber numberWithDouble:latitude], @"latitude",
[NSNumber numberWithDouble:scale], @"scale",
[NSNumber numberWithDouble:angle], @"angle",
// debug
[NSNumber numberWithBool:debug], @"debug",
nil
];
// [defaults setPersistentDomain:appDefaults forName:[[NSBundle mainBundle] bundleIdentifier]];
// [defaults synchronize];
void Settings_iOS::persist()
{
[[NSUserDefaults standardUserDefaults] setValuesForKeysWithDictionary:@{ @"longitude" : @(longitude),
@"latitude" : @(latitude),
@"scale" : @(scale),
@"angle" : @(angle),
@"debug" : @(debug) }];
}
void Settings_iOS::clear() {
void Settings_iOS::sync()
{
[[NSUserDefaults standardUserDefaults] synchronize];
}
void Settings_iOS::clear()
{
[NSUserDefaults resetStandardUserDefaults];
}

View File

@@ -139,6 +139,11 @@ class MBXMapView
[displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
}
- (void)dealloc
{
mapView->settings.sync();
}
- (void)updateRender:(NSNotification *)notification
{
[self updateRender];
@@ -165,6 +170,8 @@ class MBXMapView
- (void)pauseRender
{
displayLink.paused = YES;
mapView->settings.sync();
}
- (void)render:(id)sender

View File

@@ -267,6 +267,7 @@ int main() {
mapView = new MapView();
mapView->init();
int ret = mapView->run();
mapView->settings.sync();
delete mapView;
return ret;
}

View File

@@ -8,8 +8,9 @@ namespace llmr {
class Settings_MacOSX : public Settings {
public:
Settings_MacOSX();
virtual void save();
virtual void load();
virtual void persist();
virtual void sync();
virtual void clear();
};

View File

@@ -2,60 +2,43 @@
#include "settings.hpp"
using namespace llmr;
Settings_MacOSX::Settings_MacOSX() {
NSDictionary *appDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
// position
[NSNumber numberWithDouble:longitude], @"longitude",
[NSNumber numberWithDouble:latitude], @"latitude",
[NSNumber numberWithDouble:scale], @"scale",
[NSNumber numberWithDouble:angle], @"angle",
// debug
[NSNumber numberWithBool:debug], @"debug",
nil
];
[[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];
Settings_MacOSX::Settings_MacOSX()
{
[[NSUserDefaults standardUserDefaults] registerDefaults:@{ @"longitude" : @(longitude),
@"latitude" : @(latitude),
@"scale" : @(scale),
@"angle" : @(angle),
@"debug" : @(debug) }];
}
void Settings_MacOSX::load() {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
void Settings_MacOSX::load()
{
NSDictionary *settings = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
// position
longitude = [defaults doubleForKey:@"longitude"];
latitude = [defaults doubleForKey:@"latitude"];
scale = [defaults doubleForKey:@"scale"];
angle = [defaults doubleForKey:@"angle"];
// debug
debug = [defaults boolForKey:@"debug"];
longitude = [settings[@"longitude"] doubleValue];
latitude = [settings[@"latitude"] doubleValue];
scale = [settings[@"scale"] doubleValue];
angle = [settings[@"angle"] doubleValue];
debug = [settings[@"debug"] boolValue];
}
void Settings_MacOSX::save() {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSDictionary *appDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
// position
[NSNumber numberWithDouble:longitude], @"longitude",
[NSNumber numberWithDouble:latitude], @"latitude",
[NSNumber numberWithDouble:scale], @"scale",
[NSNumber numberWithDouble:angle], @"angle",
// debug
[NSNumber numberWithBool:debug], @"debug",
nil
];
[defaults setPersistentDomain:appDefaults forName:[[NSBundle mainBundle] bundleIdentifier]];
[defaults synchronize];
void Settings_MacOSX::persist()
{
[[NSUserDefaults standardUserDefaults] setValuesForKeysWithDictionary:@{ @"longitude" : @(longitude),
@"latitude" : @(latitude),
@"scale" : @(scale),
@"angle" : @(angle),
@"debug" : @(debug) }];
}
void Settings_MacOSX::clear() {
void Settings_MacOSX::sync()
{
[[NSUserDefaults standardUserDefaults] synchronize];
}
void Settings_MacOSX::clear()
{
[NSUserDefaults resetStandardUserDefaults];
}

View File

@@ -22,6 +22,7 @@ Map::Map(Settings& settings)
}
Map::~Map() {
settings.sync();
}
void Map::setup() {
@@ -62,7 +63,7 @@ void Map::moveBy(double dx, double dy, double duration) {
update();
transform.getLonLat(settings.longitude, settings.latitude);
settings.save();
settings.persist();
}
void Map::scaleBy(double ds, double cx, double cy, double duration) {
@@ -72,7 +73,7 @@ void Map::scaleBy(double ds, double cx, double cy, double duration) {
transform.getLonLat(settings.longitude, settings.latitude);
settings.scale = transform.getScale();
settings.save();
settings.persist();
}
void Map::rotateBy(double cx, double cy, double sx, double sy, double ex, double ey, double duration) {
@@ -80,7 +81,7 @@ void Map::rotateBy(double cx, double cy, double sx, double sy, double ex, double
update();
settings.angle = transform.getAngle();
settings.save();
settings.persist();
}
void Map::setLonLat(double lon, double lat, double duration) {
@@ -88,7 +89,7 @@ void Map::setLonLat(double lon, double lat, double duration) {
update();
transform.getLonLat(settings.longitude, settings.latitude);
settings.save();
settings.persist();
}
void Map::getLonLat(double &lon, double &lat) const {
@@ -102,7 +103,7 @@ void Map::setLonLatZoom(double lon, double lat, double zoom, double duration) {
transform.getLonLat(settings.longitude, settings.latitude);
settings.scale = transform.getScale();
settings.save();
settings.persist();
}
void Map::getLonLatZoom(double &lon, double &lat, double &zoom) const {
@@ -116,7 +117,7 @@ void Map::setScale(double scale, double cx, double cy, double duration) {
transform.getLonLat(settings.longitude, settings.latitude);
settings.scale = transform.getScale();
settings.save();
settings.persist();
}
void Map::setZoom(double zoom, double duration) {
@@ -126,7 +127,7 @@ void Map::setZoom(double zoom, double duration) {
transform.getLonLat(settings.longitude, settings.latitude);
settings.scale = transform.getScale();
settings.save();
settings.persist();
}
double Map::getZoom() const {
@@ -152,7 +153,7 @@ void Map::setAngle(double angle, double x, double y, double duration) {
transform.getLonLat(settings.longitude, settings.latitude);
settings.angle = transform.getAngle();
settings.save();
settings.persist();
}
double Map::getScale() const {
@@ -168,7 +169,7 @@ void Map::resetNorth() {
update();
settings.angle = transform.getAngle();
settings.save();
settings.persist();
}
void Map::resetPosition() {
@@ -181,7 +182,7 @@ void Map::resetPosition() {
transform.getLonLat(settings.longitude, settings.latitude);
settings.scale = transform.getScale();
settings.angle = transform.getAngle();
settings.save();
settings.persist();
}
void Map::resetZoom() {
@@ -192,7 +193,7 @@ void Map::toggleDebug() {
settings.debug = !settings.debug;
update();
settings.save();
settings.persist();
}
void Map::cancelAnimations() {