summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKonstantin Käfer <mail@kkaefer.com>2014-01-16 13:53:10 +0100
committerKonstantin Käfer <mail@kkaefer.com>2014-01-16 13:53:10 +0100
commitc01719bc04c759d66be32d534d03057366c7f1b1 (patch)
treed361458f6e1a8b4eda86a509f244dd52f243119b /src
parent8fd762b5f3c437beee60c7124e30f6994a6fcb3a (diff)
downloadqtlocation-mapboxgl-c01719bc04c759d66be32d534d03057366c7f1b1.tar.gz
make bundle on mac os x and persist settings
Diffstat (limited to 'src')
-rw-r--r--src/map/map.cpp62
-rw-r--r--src/map/transform.cpp22
2 files changed, 61 insertions, 23 deletions
diff --git a/src/map/map.cpp b/src/map/map.cpp
index 5f9e0b7eda..4c05b8f3dc 100644
--- a/src/map/map.cpp
+++ b/src/map/map.cpp
@@ -10,14 +10,12 @@
using namespace llmr;
-map::map()
- : transform(new class transform()),
+map::map(class settings *settings)
+ : settings(settings),
+ transform(new class transform()),
painter(new class painter(transform)),
min_zoom(0),
max_zoom(14) {
-
- // transform->setLonLat(13, 50);
- // transform->setZoom(3);
}
map::~map() {
@@ -28,45 +26,77 @@ void map::setup() {
painter->setup();
}
+void map::loadSettings() {
+ transform->setAngle(settings->angle);
+ transform->setScale(settings->scale);
+ transform->setLonLat(settings->longitude, settings->latitude);
+ update();
+}
+
void map::resize(uint32_t width, uint32_t height) {
transform->width = width;
transform->height = height;
- updateTiles();
- platform::restart(this);
+ update();
}
void map::moveBy(double dx, double dy) {
transform->moveBy(dx, dy);
- updateTiles();
- platform::restart(this);
+ update();
+
+ transform->getLonLat(settings->longitude, settings->latitude);
+ settings->save();
}
void map::scaleBy(double ds, double cx, double cy) {
transform->scaleBy(ds, cx, cy);
- updateTiles();
- platform::restart(this);
+ update();
+
+ transform->getLonLat(settings->longitude, settings->latitude);
+ settings->scale = transform->getScale();
+ settings->save();
}
void map::rotateBy(double cx, double cy, double sx, double sy, double ex, double ey) {
transform->rotateBy(cx, cy, sx, sy, ex, ey);
- updateTiles();
- platform::restart(this);
+ update();
+
+ settings->angle = transform->getAngle();
+ settings->save();
}
void map::resetNorth() {
transform->setAngle(0);
- updateTiles();
- platform::restart(this);
+ update();
+
+ settings->angle = transform->getAngle();
+ settings->save();
}
void map::resetPosition() {
transform->setAngle(0);
transform->setLonLat(0, 0);
transform->setZoom(0);
+ update();
+
+ transform->getLonLat(settings->longitude, settings->latitude);
+ settings->scale = transform->getScale();
+ settings->angle = transform->getAngle();
+ settings->save();
+}
+
+void map::toggleDebug() {
+ settings->debug = !settings->debug;
+ update();
+
+ settings->save();
+}
+
+void map::update() {
updateTiles();
platform::restart(this);
}
+
tile::ptr map::hasTile(const tile_id& id) {
for (tile::ptr& tile : tiles) {
if (tile->id == id) {
@@ -238,7 +268,7 @@ bool map::render() {
void map::tileLoaded(tile::ptr tile) {
// std::cerr << "loaded " << tile->toString() << std::endl;
- platform::restart(this);
+ update();
}
void map::tileFailed(tile::ptr tile) {
diff --git a/src/map/transform.cpp b/src/map/transform.cpp
index d7c189003b..3c028be149 100644
--- a/src/map/transform.cpp
+++ b/src/map/transform.cpp
@@ -36,21 +36,22 @@ void transform::moveBy(double dx, double dy) {
void transform::scaleBy(double ds, double cx, double cy) {
// clamp scale to min/max values
- const double new_scale = scale * ds;
+ double new_scale = scale * ds;
if (new_scale < min_scale) {
ds = min_scale / scale;
+ new_scale = min_scale;
} else if (new_scale > max_scale) {
ds = max_scale / scale;
+ new_scale = max_scale;
}
+ setScale(new_scale);
+
+ // Correct for non-center scaling location.
const double dx = (cx - width / 2) * (1.0 - ds);
const double dy = (cy - height / 2) * (1.0 - ds);
- const double fx = cos(angle) * dx + sin(angle) * dy;
- const double fy = cos(angle) * dy + sin(-angle) * dx;
-
- scale *= ds;
- x = (x * ds) + fx;
- y = (y * ds) + fy;
+ x += cos(angle) * dx + sin(angle) * dy;
+ y += cos(angle) * dy + sin(-angle) * dx;
}
@@ -154,6 +155,13 @@ int32_t transform::getZoom() const {
return floor(log(scale) / M_LN2);
}
+double transform::getScale() const {
+ return scale;
+}
+
+double transform::getAngle() const {
+ return angle;
+}
void transform::mapCornersToBox(uint32_t z, box& b) const {
const double ref_scale = pow(2, z);