loleaflet/build/deps.js | 6 + loleaflet/src/dom/PosAnimation.Timer.js | 67 ++++++++++++++++++++ loleaflet/src/dom/PosAnimation.js | 103 +++++++++++++++++++------------- 3 files changed, 137 insertions(+), 39 deletions(-)
New commits: commit e37107b2c0c93aa37182f1e9f693e4fa27b107cb Author: Henry Castro <hcas...@collabora.com> Date: Wed Apr 12 17:17:50 2017 -0400 loleaflet: update PosAnimation.js file Change-Id: I38a2643e67d1d341b486c987eb73dc5e5608a7cb Reviewed-on: https://gerrit.libreoffice.org/36511 Reviewed-by: Jan Holesovsky <ke...@collabora.com> Tested-by: Jan Holesovsky <ke...@collabora.com> diff --git a/loleaflet/build/deps.js b/loleaflet/build/deps.js index 6cce0922..34575612 100644 --- a/loleaflet/build/deps.js +++ b/loleaflet/build/deps.js @@ -415,6 +415,12 @@ var deps = { desc: 'Core panning animation support.' }, + AnimationTimer: { + src: ['dom/PosAnimation.Timer.js'], + deps: ['AnimationPan'], + desc: 'Timer-based pan animation fallback for browsers that don\'t support CSS3 transitions.' + }, + AnimationZoom: { src: [ 'map/anim/Map.ZoomAnimation.js', diff --git a/loleaflet/src/dom/PosAnimation.Timer.js b/loleaflet/src/dom/PosAnimation.Timer.js new file mode 100644 index 00000000..52faf981 --- /dev/null +++ b/loleaflet/src/dom/PosAnimation.Timer.js @@ -0,0 +1,67 @@ +/* + * L.PosAnimation fallback implementation that powers Leaflet pan animations + * in browsers that don't support CSS3 Transitions. + */ + +L.PosAnimation = L.DomUtil.TRANSITION ? L.PosAnimation : L.PosAnimation.extend({ + + run: function (el, newPos, duration, easeLinearity) { // (HTMLElement, Point[, Number, Number]) + this.stop(); + + this._el = el; + this._inProgress = true; + this._duration = duration || 0.25; + this._easeOutPower = 1 / Math.max(easeLinearity || 0.5, 0.2); + + this._startPos = L.DomUtil.getPosition(el); + this._offset = newPos.subtract(this._startPos); + this._startTime = +new Date(); + + this.fire('start'); + + this._animate(); + }, + + stop: function () { + if (!this._inProgress) { return; } + + this._step(); + this._complete(); + }, + + _animate: function () { + // animation loop + this._animId = L.Util.requestAnimFrame(this._animate, this); + this._step(); + }, + + _step: function () { + var elapsed = (+new Date()) - this._startTime, + duration = this._duration * 1000; + + if (elapsed < duration) { + this._runFrame(this._easeOut(elapsed / duration)); + } else { + this._runFrame(1); + this._complete(); + } + }, + + _runFrame: function (progress) { + var pos = this._startPos.add(this._offset.multiplyBy(progress)); + L.DomUtil.setPosition(this._el, pos); + + this.fire('step'); + }, + + _complete: function () { + L.Util.cancelAnimFrame(this._animId); + + this._inProgress = false; + this.fire('end'); + }, + + _easeOut: function (t) { + return 1 - Math.pow(1 - t, this._easeOutPower); + } +}); diff --git a/loleaflet/src/dom/PosAnimation.js b/loleaflet/src/dom/PosAnimation.js index 1c8b7c07..5a2ef634 100644 --- a/loleaflet/src/dom/PosAnimation.js +++ b/loleaflet/src/dom/PosAnimation.js @@ -1,71 +1,96 @@ /* - * L.PosAnimation powers Leaflet pan animations internally. + * L.PosAnimation is used by Leaflet internally for pan animations. */ -L.PosAnimation = L.Evented.extend({ +L.PosAnimation = L.Class.extend({ + includes: L.Mixin.Events, run: function (el, newPos, duration, easeLinearity) { // (HTMLElement, Point[, Number, Number]) this.stop(); this._el = el; this._inProgress = true; - this._duration = duration || 0.25; - // workaround for Leaflet issue #3320 - this._duration = 0; - this._easeOutPower = 1 / Math.max(easeLinearity || 0.5, 0.2); - - this._startPos = L.DomUtil.getPosition(el); - this._offset = newPos.subtract(this._startPos); - this._startTime = +new Date(); + this._newPos = newPos; this.fire('start'); - this._animate(); + el.style[L.DomUtil.TRANSITION] = 'all ' + (duration || 0.25) + + 's cubic-bezier(0,0,' + (easeLinearity || 0.5) + ',1)'; + + L.DomEvent.on(el, L.DomUtil.TRANSITION_END, this._onTransitionEnd, this); + L.DomUtil.setPosition(el, newPos); + + // toggle reflow, Chrome flickers for some reason if you don't do this + L.Util.falseFn(el.offsetWidth); + + // there's no native way to track value updates of transitioned properties, so we imitate this + this._stepTimer = setInterval(L.bind(this._onStep, this), 50); }, stop: function () { if (!this._inProgress) { return; } - this._step(true); - this._complete(); - }, + // if we just removed the transition property, the element would jump to its final position, + // so we need to make it stay at the current position - _animate: function () { - // animation loop - this._animId = L.Util.requestAnimFrame(this._animate, this); - this._step(); + L.DomUtil.setPosition(this._el, this._getPos()); + this._onTransitionEnd(); + L.Util.falseFn(this._el.offsetWidth); // force reflow in case we are about to start a new animation }, - _step: function (round) { - var elapsed = (+new Date()) - this._startTime, - duration = this._duration * 1000; - - if (elapsed < duration) { - this._runFrame(this._easeOut(elapsed / duration), round); - } else { - this._runFrame(1); - this._complete(); + _onStep: function () { + var stepPos = this._getPos(); + if (!stepPos) { + this._onTransitionEnd(); + return; } + /*eslint-disable camelcase*/ + // make L.DomUtil.getPosition return intermediate position value during animation + this._el._leaflet_pos = stepPos; + /*eslint-enable camelcase*/ + + this.fire('step'); }, - _runFrame: function (progress, round) { - var pos = this._startPos.add(this._offset.multiplyBy(progress)); - if (round) { - pos._round(); + // you can't easily get intermediate values of properties animated with CSS3 Transitions, + // we need to parse computed style (in case of transform it returns matrix string) + + _transformRe: /([-+]?(?:\d*\.)?\d+)\D*, ([-+]?(?:\d*\.)?\d+)\D*\)/, + + _getPos: function () { + var left, top, matches, + el = this._el, + style = window.getComputedStyle(el); + + if (L.Browser.any3d) { + matches = style[L.DomUtil.TRANSFORM].match(this._transformRe); + if (!matches) { return; } + left = parseFloat(matches[1]); + top = parseFloat(matches[2]); + } else { + left = parseFloat(style.left); + top = parseFloat(style.top); } - L.DomUtil.setPosition(this._el, pos); - this.fire('step'); + return new L.Point(left, top, true); }, - _complete: function () { - L.Util.cancelAnimFrame(this._animId); + _onTransitionEnd: function () { + L.DomEvent.off(this._el, L.DomUtil.TRANSITION_END, this._onTransitionEnd, this); + if (!this._inProgress) { return; } this._inProgress = false; - this.fire('end'); - }, - _easeOut: function (t) { - return 1 - Math.pow(1 - t, this._easeOutPower); + this._el.style[L.DomUtil.TRANSITION] = ''; + + /*eslint-disable camelcase*/ + // make sure L.DomUtil.getPosition returns the final position value after animation + this._el._leaflet_pos = this._newPos; + /*eslint-enable camelcase*/ + + clearInterval(this._stepTimer); + + this.fire('step').fire('end'); } + }); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits