Make view.animate() tolerate undefined views

This commit is contained in:
Tim Schaub
2017-08-15 13:28:50 -04:00
parent 8292e0e311
commit 940f97e2a7
2 changed files with 52 additions and 4 deletions

View File

@@ -255,16 +255,33 @@ ol.View.prototype.getUpdatedOptions_ = function(newOptions) {
* @api
*/
ol.View.prototype.animate = function(var_args) {
var start = Date.now();
var center = this.getCenter().slice();
var resolution = this.getResolution();
var rotation = this.getRotation();
var animationCount = arguments.length;
var callback;
if (animationCount > 1 && typeof arguments[animationCount - 1] === 'function') {
callback = arguments[animationCount - 1];
--animationCount;
}
if (!this.isDef()) {
// if view properties are not yet set, shortcut to the final state
var state = arguments[animationCount - 1];
if (state.center) {
this.setCenter(state.center);
}
if (state.zoom !== undefined) {
this.setZoom(state.zoom);
}
if (state.rotation !== undefined) {
this.setRotation(state.rotation);
}
if (callback) {
callback(true);
}
return;
}
var start = Date.now();
var center = this.getCenter().slice();
var resolution = this.getResolution();
var rotation = this.getRotation();
var series = [];
for (var i = 0; i < animationCount; ++i) {
var options = /** @type {olx.AnimationOptions} */ (arguments[i]);

View File

@@ -471,6 +471,24 @@ describe('ol.View', function() {
expect(view.getAnimating()).to.eql(false);
});
it('immediately completes if view is not defined before', function() {
var view = new ol.View();
var center = [1, 2];
var zoom = 3;
var rotation = 0.4;
view.animate({
zoom: zoom,
center: center,
rotation: rotation,
duration: 25
});
expect(view.getAnimating()).to.eql(false);
expect(view.getCenter()).to.eql(center);
expect(view.getZoom()).to.eql(zoom);
expect(view.getRotation()).to.eql(rotation);
});
it('prefers zoom over resolution', function(done) {
var view = new ol.View({
center: [0, 0],
@@ -585,6 +603,19 @@ describe('ol.View', function() {
});
});
it('calls a callback if view is not defined before', function(done) {
var view = new ol.View();
view.animate({
zoom: 10,
duration: 25
}, function(complete) {
expect(view.getZoom()).to.be(10);
expect(complete).to.be(true);
done();
});
});
it('can run multiple animations in series', function(done) {
var view = new ol.View({
center: [0, 0],