diff options
Diffstat (limited to 'html/lib/onyx/source/Drawer.js')
-rw-r--r-- | html/lib/onyx/source/Drawer.js | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/html/lib/onyx/source/Drawer.js b/html/lib/onyx/source/Drawer.js new file mode 100644 index 0000000..3db5afd --- /dev/null +++ b/html/lib/onyx/source/Drawer.js @@ -0,0 +1,75 @@ +/** + 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(); + } + } +});
\ No newline at end of file |