Last active
December 31, 2015 05:29
-
-
Save gigafied/7941053 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(function () { | |
Ember.View.reopen({ | |
isPrepped : false, | |
isAnimating : false, | |
cancelAnimation : false, | |
currentAnimationClass : "", | |
_inCallbacks : [], | |
_outCallbacks : [], | |
_prepCallbacks : [], | |
classNameBindings: ['isAnimating:ember-animate',"currentAnimationClass"], | |
animations : { | |
animateIn : { | |
className : null, | |
properties : { | |
}, | |
duration : 0, | |
easing : null, | |
delay : 0 | |
}, | |
animateOut : { | |
className : null, | |
properties : {}, | |
duration : 0, | |
easing : null, | |
delay : 0 | |
} | |
}, | |
init : function () { | |
this._inCallbacks = []; | |
this._outCallbacks = []; | |
this._prepCallbacks = []; | |
this._super(); | |
}, | |
_runCallbacks : function (callbacks, cb) { | |
callbacks = callbacks || []; | |
while (callbacks.length) { | |
cb = callbacks.shift(); | |
if (typeof cb === "function") { | |
cb(); | |
} | |
} | |
}, | |
_runAnimation : function (animation, done) { | |
var i, | |
self = this; | |
if (typeof animation === "string") { | |
return this._runAnimation(this.animations[animation], done); | |
} | |
if (Ember.isArray(animation)) { | |
if (isNaN(animation[1])) { | |
animation = animation.concat(); | |
function next () { | |
var a = animation.shift(); | |
return self._runAnimation(a, animation.length ? next : done); | |
} | |
return next(); | |
} | |
else { | |
animation = { | |
className : animation[0], | |
duration : animation[1], | |
easing : null | |
} | |
} | |
} | |
if (this.get("cancelAnimation")) { | |
if (typeof done === "function") { | |
done(); | |
} | |
return; | |
} | |
Ember.assert('Invalidate animation', animation && typeof animation === "object"); | |
if (animation.className) { | |
this.set("currentAnimationClass", animation.className); | |
} | |
this.$().css(this._getAnimationCSSObject(animation, true)); | |
Ember.run.later(this, function () { | |
this.$().css(this._getAnimationCSSObject(animation)); | |
}); | |
if (typeof done === "function") { | |
if (animation.duration) { | |
Ember.run.later(this, function () { | |
this.$().css(this._getAnimationCSSObject({duration : "", easing : "", delay : ""})); | |
this.set("currentAnimationClass", ""); | |
done(); | |
}, animation.duration + (animation.delay || 0)); | |
} | |
else { | |
done(); | |
} | |
} | |
}, | |
_vendorPrefix : function () { | |
var p, | |
r = /^(Moz|Webkit|Khtml|O|ms|Icab)(?=[A-Z])/, | |
s = document.getElementsByTagName('script')[0], | |
set = Ember.$.proxy(function (p) { | |
p = ["", p.toLowerCase(), ""].join("-"); | |
this._vendorPrefix = function () { | |
return p; | |
} | |
return p; | |
}, this); | |
for(var prop in s.style) { | |
if(r.test(prop)) { | |
return set(prop.match(r)[0]); | |
} | |
} | |
if('WebkitOpacity' in s.style) { | |
return set('Webkit'); | |
} | |
if('KhtmlOpacity' in s.style) { | |
return set('Khtml'); | |
} | |
return set(""); | |
}, | |
_getAnimationCSSObject : function (obj, transitionOnly) { | |
var o = {}, | |
p, | |
props = [], | |
prefix = this._vendorPrefix(), | |
propertyMap; | |
propertyMap = { | |
"duration" : "transition-duration", | |
"delay" : "transition-delay", | |
"easing" : "transition-timing-function" | |
}; | |
if (!obj) { | |
return {}; | |
} | |
for (p in (obj.properties || {})) { | |
props.push(p); | |
if (!transitionOnly) { | |
o[p] = obj.properties[p]; | |
} | |
} | |
if (!props.length) { | |
props.push("all"); | |
} | |
if (obj.easing !== null && obj.easing !== "none") { | |
o[prefix + "transition-property"] = props.join(","); | |
for (p in propertyMap) { | |
if (obj[p]) { | |
o[prefix + propertyMap[p]] = obj[p] + (p === "duration" || p === "delay" ? "ms" : ""); | |
} | |
} | |
} | |
return o; | |
}, | |
_prep : function () { | |
this.set("isPrepped", false); | |
this.prep(Ember.$.proxy(this._prepComplete, this)); | |
}, | |
_prepComplete : function () { | |
this.set("isPrepped", true); | |
this.prepComplete(); | |
this._runCallbacks(this._prepCallbacks); | |
this._animateIn(); | |
}, | |
_animateIn : function (cb) { | |
this._inCallbacks.push(cb); | |
this.set("isAnimating", true); | |
this.animateIn(Ember.$.proxy(this._animateInComplete, this)); | |
}, | |
_animateInComplete : function () { | |
this.set("isAnimating", false); | |
this.animateInComplete(); | |
this._runCallbacks(this._inCallbacks); | |
}, | |
_animateOut : function (cb) { | |
if (this.get("isAnimating")) { | |
this._inCallbacks.push(Ember.$.proxy(function () { | |
this._animateOut(cb); | |
}, this)); | |
this.set("cancelAnimation", true); | |
return; | |
} | |
this.set("cancelAnimation", false); | |
this._outCallbacks.push(cb); | |
this.set("isAnimating", true); | |
this.animateOut(Ember.$.proxy(this._animateOutComplete, this)); | |
}, | |
_animateOutComplete : function () { | |
this.set("isAnimating", false); | |
this.animateOutComplete(); | |
this._runCallbacks(this._outCallbacks); | |
}, | |
didInsertElement : function () { | |
Ember.run.schedule('afterRender', this, this._prep); | |
}, | |
prep : function (done) { | |
done(); | |
}, | |
prepComplete : function () { | |
}, | |
animateIn : function (done) { | |
this._runAnimation("animateIn", done); | |
}, | |
animateInComplete : function () { | |
}, | |
animateOut : function (done) { | |
this._runAnimation("animateOut", done); | |
}, | |
animateOutComplete : function () { | |
}, | |
destroy : function (done) { | |
var _super = Ember.$.proxy(this._super, this); | |
this._animateOut(function () { | |
_super(); | |
if (done && typeof done === "function") { | |
done(); | |
} | |
}); | |
} | |
}); | |
Ember.ContainerView.reopen({ | |
_activeView : null, | |
_isAnimatingOut : false, | |
init : function () { | |
this._super(); | |
var currentView = this.get("currentView"); | |
if (currentView) { | |
this.set("_activeView", currentView); | |
} | |
}, | |
_currentViewWillChange : Ember.beforeObserver('currentView', function () { | |
}), | |
_pushNewView : function () { | |
var newView = this.get("newView"); | |
if (newView) { | |
this.pushObject(newView); | |
} | |
this.set("_activeView", newView); | |
this.set("_isAnimatingOut", false); | |
}, | |
_currentViewDidChange : Ember.observer('currentView', function () { | |
var activeView = this.get("_activeView"); | |
this.set("newView", this.get("currentView")); | |
if (activeView) { | |
if (!this.get("_isAnimatingOut")) { | |
this.set("_isAnimatingOut", true); | |
activeView.destroy(Ember.$.proxy(this._pushNewView, this)); | |
} | |
return; | |
} | |
this._pushNewView(); | |
}) | |
}); | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment