diff --git a/include/llmr/map/settings.hpp b/include/llmr/map/settings.hpp index 3e5395b80..31f7ed5bd 100644 --- a/include/llmr/map/settings.hpp +++ b/include/llmr/map/settings.hpp @@ -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; }; diff --git a/ios/MBXSettings.h b/ios/MBXSettings.h index fa0e55c72..a0b928ac7 100644 --- a/ios/MBXSettings.h +++ b/ios/MBXSettings.h @@ -14,8 +14,9 @@ namespace llmr { public: Settings_iOS(); - virtual void save(); virtual void load(); + virtual void persist(); + virtual void sync(); virtual void clear(); }; } \ No newline at end of file diff --git a/ios/MBXSettings.mm b/ios/MBXSettings.mm index a19db0dab..57f1d0ac1 100644 --- a/ios/MBXSettings.mm +++ b/ios/MBXSettings.mm @@ -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]; } \ No newline at end of file diff --git a/ios/MBXViewController.mm b/ios/MBXViewController.mm index e980f3758..c5d6effa1 100644 --- a/ios/MBXViewController.mm +++ b/ios/MBXViewController.mm @@ -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 diff --git a/macosx/main.mm b/macosx/main.mm index 7e1dbd117..c9d3045c3 100644 --- a/macosx/main.mm +++ b/macosx/main.mm @@ -267,6 +267,7 @@ int main() { mapView = new MapView(); mapView->init(); int ret = mapView->run(); + mapView->settings.sync(); delete mapView; return ret; } diff --git a/macosx/settings.hpp b/macosx/settings.hpp index 7f5866c50..e507c6bd1 100644 --- a/macosx/settings.hpp +++ b/macosx/settings.hpp @@ -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(); }; diff --git a/macosx/settings.mm b/macosx/settings.mm index d788b706e..59091241e 100644 --- a/macosx/settings.mm +++ b/macosx/settings.mm @@ -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]; +} \ No newline at end of file diff --git a/src/map/map.cpp b/src/map/map.cpp index f86d4eb32..e837ecffb 100644 --- a/src/map/map.cpp +++ b/src/map/map.cpp @@ -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() {