diff --git a/docs/timeline/index.html b/docs/timeline/index.html index 90552d55..c5ed6640 100644 --- a/docs/timeline/index.html +++ b/docs/timeline/index.html @@ -1308,12 +1308,13 @@ document.getElementById('myTimeline').onclick = function (event) { - moveTo(time [, options]) + moveTo(time [, options, callback]) none Move the window such that given time is centered on screen. Parameter time can be a Date, Number, or String. Available options: + A callback function can be passed as an optional parameter. This function will be called at the end of moveTo function. @@ -1422,12 +1423,13 @@ document.getElementById('myTimeline').onclick = function (event) { - setWindow(start, end [, options]) + setWindow(start, end [, options, callback]) none Set the current visible window. The parameters start and end can be a Date, Number, or String. If the parameter value of start or end is null, the parameter will be left unchanged. Available options: + A callback function can be passed as an optional parameter. This function will be called at the end of setWindow function. @@ -1439,21 +1441,23 @@ document.getElementById('myTimeline').onclick = function (event) { - zoomIn(percentage [, options]) + zoomIn(percentage [, options, callback]) none Zoom in the current visible window. The parameter percentage can be a Number and must be between 0 and 1. If the parameter value of percentage is null, the window will be left unchanged. Available options: + A callback function can be passed as an optional parameter. This function will be called at the end of zoomIn function. - zoomOut(percentage [, options]) + zoomOut(percentage [, options, callback]) none Zoom out the current visible window. The parameter percentage can be a Number and must be between 0 and 1. If the parameter value of percentage is null, the window will be left unchanged. Available options: + A callback function can be passed as an optional parameter. This function will be called at the end of zoomOut function. diff --git a/lib/timeline/Core.js b/lib/timeline/Core.js index 8fbf0e97..4a6533f7 100644 --- a/lib/timeline/Core.js +++ b/lib/timeline/Core.js @@ -613,8 +613,9 @@ Core.prototype.getVisibleItems = function() { * provided to specify duration and easing function. * Default duration is 500 ms, and default easing * function is 'easeInOutQuad'. + * @param {Function} a callback funtion to be executed at the end of this function */ -Core.prototype.fit = function(options) { +Core.prototype.fit = function(options, callback) { var range = this.getDataRange(); // skip range set if there is no min and max date @@ -627,7 +628,7 @@ Core.prototype.fit = function(options) { var min = new Date(range.min.valueOf() - interval * 0.01); var max = new Date(range.max.valueOf() + interval * 0.01); var animation = (options && options.animation !== undefined) ? options.animation : true; - this.range.setRange(min, max, animation); + this.range.setRange(min, max, { animation: animation }, callback); }; /** @@ -660,17 +661,28 @@ Core.prototype.getDataRange = function() { * provided to specify duration and easing function. * Default duration is 500 ms, and default easing * function is 'easeInOutQuad'. + * @param {Function} a callback funtion to be executed at the end of this function */ -Core.prototype.setWindow = function(start, end, options) { +Core.prototype.setWindow = function(start, end, options, callback) { + if (typeof arguments[2] == "function") { + callback = arguments[2] + options = {}; + } var animation; if (arguments.length == 1) { var range = arguments[0]; animation = (range.animation !== undefined) ? range.animation : true; - this.range.setRange(range.start, range.end, animation); + this.range.setRange(range.start, range.end, { animation: animation }); + } + else if (arguments.length == 2 && typeof arguments[1] == "function") { + var range = arguments[0]; + callback = arguments[1]; + animation = (range.animation !== undefined) ? range.animation : true; + this.range.setRange(range.start, range.end, { animation: animation }, callback); } else { animation = (options && options.animation !== undefined) ? options.animation : true; - this.range.setRange(start, end, animation); + this.range.setRange(start, end, { animation: animation }, callback); } }; @@ -684,8 +696,13 @@ Core.prototype.setWindow = function(start, end, options) { * provided to specify duration and easing function. * Default duration is 500 ms, and default easing * function is 'easeInOutQuad'. + * @param {Function} a callback funtion to be executed at the end of this function */ -Core.prototype.moveTo = function(time, options) { +Core.prototype.moveTo = function(time, options, callback) { + if (typeof arguments[1] == "function") { + callback = arguments[1] + options = {}; + } var interval = this.range.end - this.range.start; var t = util.convert(time, 'Date').valueOf(); @@ -693,7 +710,7 @@ Core.prototype.moveTo = function(time, options) { var end = t + interval / 2; var animation = (options && options.animation !== undefined) ? options.animation : true; - this.range.setRange(start, end, animation); + this.range.setRange(start, end, { animation: animation }, callback); }; /** @@ -718,9 +735,14 @@ Core.prototype.getWindow = function() { * provided to specify duration and easing function. * Default duration is 500 ms, and default easing * function is 'easeInOutQuad'. + * @param {Function} a callback funtion to be executed at the end of this function */ -Core.prototype.zoomIn = function(percentage, options) { +Core.prototype.zoomIn = function(percentage, options, callback) { if (!percentage || percentage < 0 || percentage > 1) return + if (typeof arguments[1] == "function") { + callback = arguments[1] + options = {}; + } var range = this.getWindow(); var start = range.start.valueOf(); var end = range.end.valueOf(); @@ -730,7 +752,7 @@ Core.prototype.zoomIn = function(percentage, options) { var newStart = start + distance; var newEnd = end - distance; - this.setWindow(newStart, newEnd, options); + this.setWindow(newStart, newEnd, options, callback); }; /** @@ -743,9 +765,14 @@ Core.prototype.zoomIn = function(percentage, options) { * provided to specify duration and easing function. * Default duration is 500 ms, and default easing * function is 'easeInOutQuad'. + * @param {Function} a callback funtion to be executed at the end of this function */ -Core.prototype.zoomOut = function(percentage, options) { +Core.prototype.zoomOut = function(percentage, options, callback) { if (!percentage || percentage < 0 || percentage > 1) return + if (typeof arguments[1] == "function") { + callback = arguments[1] + options = {}; + } var range = this.getWindow(); var start = range.start.valueOf(); var end = range.end.valueOf(); @@ -753,7 +780,7 @@ Core.prototype.zoomOut = function(percentage, options) { var newStart = start - interval * percentage / 2; var newEnd = end + interval * percentage / 2; - this.setWindow(newStart, newEnd, options); + this.setWindow(newStart, newEnd, options, callback); }; /** diff --git a/lib/timeline/Range.js b/lib/timeline/Range.js index ced39db8..a00435ad 100644 --- a/lib/timeline/Range.js +++ b/lib/timeline/Range.js @@ -138,7 +138,10 @@ Range.prototype.startRolling = function() { var end = t + interval / 2; var animation = (me.options && me.options.animation !== undefined) ? me.options.animation : true; - me.setRange(start, end, false); + var options = { + animation: false + }; + me.setRange(start, end, options); // determine interval to refresh var scale = me.conversion(me.body.domProps.center.width).scale; @@ -169,29 +172,36 @@ Range.prototype.stopRolling = function() { * Set a new start and end range * @param {Date | Number | String} [start] * @param {Date | Number | String} [end] - * @param {boolean | {duration: number, easingFunction: string}} [animation=false] - * If true (default), the range is animated + * @param {Object} options Available options: + * {Boolean | {duration: number, easingFunction: string}} [animation=false] + * If true, the range is animated * smoothly to the new window. An object can be * provided to specify duration and easing function. * Default duration is 500 ms, and default easing * function is 'easeInOutQuad'. - * @param {Boolean} [byUser=false] + * {Boolean} [byUser=false] + * {Event} event Mouse event + * {Function} a callback funtion to be executed at the end of this function * */ -Range.prototype.setRange = function(start, end, animation, byUser, event) { - if (byUser !== true) { - byUser = false; + +Range.prototype.setRange = function(start, end, options, callback) { + if (!options) { + options = {}; + } + if (options.byUser !== true) { + options.byUser = false; } var finalStart = start != undefined ? util.convert(start, 'Date').valueOf() : null; var finalEnd = end != undefined ? util.convert(end, 'Date').valueOf() : null; this._cancelAnimation(); - if (animation) { // true or an Object + if (options.animation) { // true or an Object var me = this; var initStart = this.start; var initEnd = this.end; - var duration = (typeof animation === 'object' && 'duration' in animation) ? animation.duration : 500; - var easingName = (typeof animation === 'object' && 'easingFunction' in animation) ? animation.easingFunction : 'easeInOutQuad'; + var duration = (typeof options.animation === 'object' && 'duration' in options.animation) ? options.animation.duration : 500; + var easingName = (typeof options.animation === 'object' && 'easingFunction' in options.animation) ? options.animation.easingFunction : 'easeInOutQuad'; var easingFunction = util.easingFunctions[easingName]; if (!easingFunction) { throw new Error('Unknown easing function ' + JSON.stringify(easingName) + '. ' + @@ -217,8 +227,8 @@ Range.prototype.setRange = function(start, end, animation, byUser, event) { var params = { start: new Date(me.start), end: new Date(me.end), - byUser:byUser, - event: event + byUser: options.byUser, + event: options.event } if (changed) { @@ -228,6 +238,7 @@ Range.prototype.setRange = function(start, end, animation, byUser, event) { if (done) { if (anyChanged) { me.body.emitter.emit('rangechanged', params); + if (callback) { return callback() } } } else { @@ -247,11 +258,12 @@ Range.prototype.setRange = function(start, end, animation, byUser, event) { var params = { start: new Date(this.start), end: new Date(this.end), - byUser:byUser, - event: event + byUser: options.byUser, + event: options.event }; this.body.emitter.emit('rangechange', params); this.body.emitter.emit('rangechanged', params); + if (callback) { return callback() } } } }; @@ -600,7 +612,12 @@ Range.prototype._onMouseWheel = function(event) { var newStart = this.start - diff; var newEnd = this.end - diff; - this.setRange(newStart, newEnd, false, true, event); + var options = { + animation: false, + byUser: true, + event: event + } + this.setRange(newStart, newEnd, options); } return; } @@ -698,7 +715,12 @@ Range.prototype._onPinch = function (event) { newEnd = safeEnd; } - this.setRange(newStart, newEnd, false, true, event); + var options = { + animation: false, + byUser: true, + event: event + } + this.setRange(newStart, newEnd, options); this.startToFront = false; // revert to default this.endToFront = true; // revert to default @@ -802,7 +824,12 @@ Range.prototype.zoom = function(scale, center, delta, event) { newEnd = safeEnd; } - this.setRange(newStart, newEnd, false, true, event); + var options = { + animation: false, + byUser: true, + event: event + } + this.setRange(newStart, newEnd, options); this.startToFront = false; // revert to default this.endToFront = true; // revert to default @@ -843,7 +870,12 @@ Range.prototype.moveTo = function(moveTo) { var newStart = this.start - diff; var newEnd = this.end - diff; - this.setRange(newStart, newEnd, false, true, null); + var options = { + animation: false, + byUser: true, + event: null + } + this.setRange(newStart, newEnd, options); }; module.exports = Range; diff --git a/lib/timeline/Timeline.js b/lib/timeline/Timeline.js index 6cc4b068..02d633a4 100644 --- a/lib/timeline/Timeline.js +++ b/lib/timeline/Timeline.js @@ -382,7 +382,7 @@ Timeline.prototype.focus = function(id, options) { var interval = Math.max((this.range.end - this.range.start), (end - start) * 1.1); var animation = (options && options.animation !== undefined) ? options.animation : true; - this.range.setRange(middle - interval / 2, middle + interval / 2, animation); + this.range.setRange(middle - interval / 2, middle + interval / 2, { animation: animation }); } }; @@ -409,7 +409,7 @@ Timeline.prototype.fit = function (options) { else { // exactly fit the items (plus a small margin) range = this.getItemRange(); - this.range.setRange(range.min, range.max, animation); + this.range.setRange(range.min, range.max, { animation: animation }); } };