diff --git a/externs/olx.js b/externs/olx.js index ec1ec03c5a..a47e678e71 100644 --- a/externs/olx.js +++ b/externs/olx.js @@ -7849,7 +7849,8 @@ olx.view; * maxZoom: (number|undefined), * minResolution: (number|undefined), * duration: (number|undefined), - * easing: (undefined|function(number):number) + * easing: (undefined|function(number):number), + * callback: (undefined|function(boolean)) * }} */ olx.view.FitOptions; @@ -7927,6 +7928,16 @@ olx.view.FitOptions.prototype.duration; olx.view.FitOptions.prototype.easing; +/** + * Optional function called when the view is in it's final position. The callback will be + * called with `true` if the animation series completed on its own or `false` + * if it was cancelled. + * @type {undefined|function(boolean)} + * @api + */ +olx.view.FitOptions.prototype.callback; + + /* typedefs for object literals exposed by the library */ diff --git a/src/ol/view.js b/src/ol/view.js index 1a5b19377d..be634d15d7 100644 --- a/src/ol/view.js +++ b/src/ol/view.js @@ -882,6 +882,7 @@ ol.View.prototype.fit = function(geometryOrExtent, opt_options) { var centerX = centerRotX * cosAngle - centerRotY * sinAngle; var centerY = centerRotY * cosAngle + centerRotX * sinAngle; var center = [centerX, centerY]; + var callback = options.callback ? options.callback : ol.nullFunction; if (options.duration !== undefined) { this.animate({ @@ -889,10 +890,11 @@ ol.View.prototype.fit = function(geometryOrExtent, opt_options) { center: center, duration: options.duration, easing: options.easing - }); + }, callback); } else { this.setResolution(resolution); this.setCenter(center); + setTimeout(callback.bind(undefined, true), 0); } }; diff --git a/test/spec/ol/view.test.js b/test/spec/ol/view.test.js index 255bc0a6d5..23282a5966 100644 --- a/test/spec/ol/view.test.js +++ b/test/spec/ol/view.test.js @@ -1179,6 +1179,24 @@ describe('ol.View', function() { }, 50); }); + it('calls a callback when duration is not defined', function(done) { + view.fit(new ol.geom.LineString([[6000, 46000], [6000, 47100], [7000, 46000]]), { + callback: function(complete) { + expect(complete).to.be(true); + done(); + } + }); + }); + it('calls a callback when animation completes', function(done) { + view.fit(new ol.geom.LineString([[6000, 46000], [6000, 47100], [7000, 46000]]), { + duration: 25, + callback: function(complete) { + expect(complete).to.be(true); + done(); + } + }); + }); + }); describe('centerOn', function() {