/**
|
|
A control that appears or disappears based on its _open_ property.
|
|
It appears or disappears with a sliding animation whose direction is
|
|
determined by the _orient_ property.
|
|
*/
|
|
enyo.kind({
|
|
name: "onyx.Drawer",
|
|
published: {
|
|
//* The visibility state of the drawer's associated control
|
|
open: true,
|
|
//* "v" for vertical animation; "h" for horizontal animation
|
|
orient: "v"
|
|
},
|
|
style: "overflow: hidden; position: relative;",
|
|
tools: [
|
|
{kind: "Animator", onStep: "animatorStep", onEnd: "animatorEnd"},
|
|
{name: "client", style: "position: relative;", classes: "enyo-border-box"}
|
|
],
|
|
create: function() {
|
|
this.inherited(arguments);
|
|
this.openChanged();
|
|
},
|
|
initComponents: function() {
|
|
this.createChrome(this.tools);
|
|
this.inherited(arguments);
|
|
},
|
|
openChanged: function() {
|
|
this.$.client.show();
|
|
if (this.hasNode()) {
|
|
if (this.$.animator.isAnimating()) {
|
|
this.$.animator.reverse();
|
|
} else {
|
|
var v = this.orient == "v";
|
|
var d = v ? "height" : "width";
|
|
var p = v ? "top" : "left";
|
|
// unfixing the height/width is needed to properly
|
|
// measure the scrollHeight/Width DOM property, but
|
|
// can cause a momentary flash of content on some browsers
|
|
this.applyStyle(d, null);
|
|
var s = this.hasNode()[v ? "scrollHeight" : "scrollWidth"];
|
|
this.$.animator.play({
|
|
startValue: this.open ? 0 : s,
|
|
endValue: this.open ? s : 0,
|
|
dimension: d,
|
|
position: p
|
|
});
|
|
}
|
|
} else {
|
|
this.$.client.setShowing(this.open);
|
|
}
|
|
},
|
|
animatorStep: function(inSender) {
|
|
if (this.hasNode()) {
|
|
var d = inSender.dimension;
|
|
this.node.style[d] = this.domStyles[d] = inSender.value + "px";
|
|
}
|
|
var cn = this.$.client.hasNode();
|
|
if (cn) {
|
|
var p = inSender.position;
|
|
var o = (this.open ? inSender.endValue : inSender.startValue);
|
|
cn.style[p] = this.$.client.domStyles[p] = (inSender.value - o) + "px";
|
|
}
|
|
if (this.container) {
|
|
this.container.resized();
|
|
}
|
|
},
|
|
animatorEnd: function() {
|
|
if (!this.open) {
|
|
this.$.client.hide();
|
|
}
|
|
if (this.container) {
|
|
this.container.resized();
|
|
}
|
|
}
|
|
});
|