summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMinh Nguyễn <mxn@1ec5.org>2016-01-26 16:59:54 -0800
committerMinh Nguyễn <mxn@1ec5.org>2016-01-26 18:49:01 -0800
commit8a23bdcd0194ec86857ff4dd1201b98dfe49bb48 (patch)
tree4d54330e88f855d5c5be770f770182b77fd4a3b2
parent97fc2120c43ed53d3baa4a55f7fe1bb72e36427d (diff)
downloadqtlocation-mapboxgl-8a23bdcd0194ec86857ff4dd1201b98dfe49bb48.tar.gz
[core, ios, osx] Tilt around visual center point
The tilt gesture on both iOS and OS X now respects the content insets. On iOS, in user tracking mode, it additionally respects the user dot’s position if it’s aligned to the top or bottom of the view.
-rw-r--r--include/mbgl/map/map.hpp1
-rw-r--r--platform/android/src/jni.cpp5
-rw-r--r--platform/ios/src/MGLMapView.mm9
-rw-r--r--platform/osx/src/MGLMapView.mm2
-rw-r--r--src/mbgl/map/map.cpp6
-rw-r--r--src/mbgl/map/transform.cpp5
-rw-r--r--src/mbgl/map/transform.hpp8
7 files changed, 30 insertions, 6 deletions
diff --git a/include/mbgl/map/map.hpp b/include/mbgl/map/map.hpp
index 84af449fac..1112ac6c93 100644
--- a/include/mbgl/map/map.hpp
+++ b/include/mbgl/map/map.hpp
@@ -130,6 +130,7 @@ public:
// Pitch
void setPitch(double pitch, const Duration& = Duration::zero());
+ void setPitch(double pitch, const PrecisionPoint&, const Duration& = Duration::zero());
double getPitch() const;
// North Orientation
diff --git a/platform/android/src/jni.cpp b/platform/android/src/jni.cpp
index cc25ec4da0..cd013e4519 100644
--- a/platform/android/src/jni.cpp
+++ b/platform/android/src/jni.cpp
@@ -680,11 +680,12 @@ jdouble JNICALL nativeGetPitch(JNIEnv *env, jobject obj, jlong nativeMapViewPtr)
return nativeMapView->getMap().getPitch();
}
-void JNICALL nativeSetPitch(JNIEnv *env, jobject obj, jlong nativeMapViewPtr, jdouble pitch, jlong duration) {
+void JNICALL nativeSetPitch(JNIEnv *env, jobject obj, jlong nativeMapViewPtr, jdouble pitch, jlong milliseconds) {
mbgl::Log::Debug(mbgl::Event::JNI, "nativeGetPitch");
assert(nativeMapViewPtr != 0);
NativeMapView *nativeMapView = reinterpret_cast<NativeMapView *>(nativeMapViewPtr);
- nativeMapView->getMap().setPitch(pitch, mbgl::Milliseconds(duration));
+ mbgl::Duration duration((mbgl::Milliseconds(milliseconds)));
+ nativeMapView->getMap().setPitch(pitch, duration);
}
void JNICALL nativeScaleBy(JNIEnv *env, jobject obj, jlong nativeMapViewPtr, jdouble ds, jdouble cx,
diff --git a/platform/ios/src/MGLMapView.mm b/platform/ios/src/MGLMapView.mm
index d499dc7474..1952597a4c 100644
--- a/platform/ios/src/MGLMapView.mm
+++ b/platform/ios/src/MGLMapView.mm
@@ -1428,8 +1428,13 @@ mbgl::Duration MGLDurationInSeconds(NSTimeInterval duration)
CGFloat slowdown = 20.0;
CGFloat pitchNew = currentPitch - (gestureDistance / slowdown);
-
- _mbglMap->setPitch(pitchNew);
+
+ CGPoint centerPoint = self.contentCenter;
+ if (self.userTrackingMode != MGLUserTrackingModeNone)
+ {
+ centerPoint = self.userLocationAnnotationViewCenter;
+ }
+ _mbglMap->setPitch(pitchNew, centerPoint);
[self notifyMapChange:mbgl::MapChangeRegionIsChanging];
}
diff --git a/platform/osx/src/MGLMapView.mm b/platform/osx/src/MGLMapView.mm
index 3bea3f1139..fe95427e52 100644
--- a/platform/osx/src/MGLMapView.mm
+++ b/platform/osx/src/MGLMapView.mm
@@ -1207,7 +1207,7 @@ public:
[self didChangeValueForKey:@"direction"];
}
if (self.pitchEnabled) {
- _mbglMap->setPitch(_pitchAtBeginningOfGesture + delta.y / 5);
+ _mbglMap->setPitch(_pitchAtBeginningOfGesture + delta.y / 5, center);
}
}
} else if (self.scrollEnabled) {
diff --git a/src/mbgl/map/map.cpp b/src/mbgl/map/map.cpp
index 51106db88b..a45a9ffaff 100644
--- a/src/mbgl/map/map.cpp
+++ b/src/mbgl/map/map.cpp
@@ -357,7 +357,11 @@ void Map::resetNorth(const Duration& duration) {
#pragma mark - Pitch
void Map::setPitch(double pitch, const Duration& duration) {
- transform->setPitch(pitch * M_PI / 180, duration);
+ setPitch(pitch, {NAN, NAN}, duration);
+}
+
+void Map::setPitch(double pitch, const PrecisionPoint& anchor, const Duration& duration) {
+ transform->setPitch(pitch * M_PI / 180, anchor, duration);
update(Update::Repaint);
}
diff --git a/src/mbgl/map/transform.cpp b/src/mbgl/map/transform.cpp
index b4743c0719..208f9a089a 100644
--- a/src/mbgl/map/transform.cpp
+++ b/src/mbgl/map/transform.cpp
@@ -523,12 +523,17 @@ double Transform::getAngle() const {
#pragma mark - Pitch
void Transform::setPitch(double pitch, const Duration& duration) {
+ setPitch(pitch, {NAN, NAN}, duration);
+}
+
+void Transform::setPitch(double pitch, const PrecisionPoint& anchor, const Duration& duration) {
if (std::isnan(pitch)) {
return;
}
CameraOptions camera;
camera.pitch = pitch;
+ camera.anchor = anchor;
easeTo(camera, duration);
}
diff --git a/src/mbgl/map/transform.hpp b/src/mbgl/map/transform.hpp
index bef6c6c87e..8c9ea08885 100644
--- a/src/mbgl/map/transform.hpp
+++ b/src/mbgl/map/transform.hpp
@@ -102,7 +102,15 @@ public:
double getAngle() const;
// Pitch
+ /** Sets the pitch angle.
+ @param angle The new pitch angle, measured in radians toward the
+ horizon. */
void setPitch(double pitch, const Duration& = Duration::zero());
+ /** Sets the pitch angle, keeping the given point fixed within the view.
+ @param angle The new pitch angle, measured in radians toward the
+ horizon.
+ @param anchor A point relative to the top-left corner of the view. */
+ void setPitch(double pitch, const PrecisionPoint& anchor, const Duration& = Duration::zero());
double getPitch() const;
// North Orientation