|
|
- /**
- onyx.MoreToolbar is a kind of <a href="#onyx.Toolbar">onyx.Toolbar</a> that can adapt to different screen sizes by moving overflowing controls and content into an <a href="#onyx.Menu">onyx.Menu</a>
-
- {kind: "onyx.MoreToolbar", components: [
- {content: "More Toolbar", unmoveable: true},
- {kind: "onyx.Button", content: "Alpha"},
- {kind: "onyx.Button", content: "Beta"},
- {kind: "onyx.Button", content: "Gamma", unmoveable: true},
- {kind: "onyx.Button", content: "Epsilon"}
- ]},
-
- A control can be forced to never move to the menu by setting the optional unmovable property to true (default is false).
-
- Optionally you can specify a class to be applied to the menu via the menuClass property. You can also specify a class for items that have been moved via the the movedClass property.
- */
-
- enyo.kind({
- name: "onyx.MoreToolbar",
- //* @public
- classes: "onyx-toolbar onyx-more-toolbar",
- //* style class to be applied to the menu
- menuClass: "",
- //* style class to be applied to individual controls moved from the toolbar to the menu
- movedClass: "",
- //* @protected
- layoutKind: "FittableColumnsLayout",
- noStretch: true,
- handlers: {
- onHide: "reflow"
- },
- tools: [
- {name: "client", fit: true, classes: "onyx-toolbar-inline"},
- {name: "nard", kind: "onyx.MenuDecorator", showing: false, onActivate: "activated", components: [
- {kind: "onyx.IconButton", classes: "onyx-more-button"},
- {name: "menu", kind: "onyx.Menu", classes: "onyx-more-menu", prepend: true}
- ]}
- ],
- initComponents: function() {
- if(this.menuClass && this.menuClass.length>0 && !this.$.menu.hasClass(this.menuClass)) {
- this.$.menu.addClass(this.menuClass);
- }
- this.createChrome(this.tools);
- this.inherited(arguments);
- },
- reflow: function() {
- this.inherited(arguments);
- if (this.isContentOverflowing()) {
- this.$.nard.show();
- if (this.popItem()) {
- this.reflow();
- }
- } else if (this.tryPushItem()) {
- this.reflow();
- } else if (!this.$.menu.children.length) {
- this.$.nard.hide();
- this.$.menu.hide();
- }
- },
- activated: function(inSender, inEvent) {
- this.addRemoveClass("active",inEvent.originator.active);
- },
- popItem: function() {
- var c = this.findCollapsibleItem();
- if (c) {
- //apply movedClass is needed
- if(this.movedClass && this.movedClass.length>0 && !c.hasClass(this.movedClass)) {
- c.addClass(this.movedClass);
- }
- this.$.menu.addChild(c);
- var p = this.$.menu.hasNode();
- if (p && c.hasNode()) {
- c.insertNodeInParent(p);
- }
- return true;
- }
- },
- pushItem: function() {
- var c$ = this.$.menu.children;
- var c = c$[0];
- if (c) {
- //remove any applied movedClass
- if(this.movedClass && this.movedClass.length>0 && c.hasClass(this.movedClass)) {
- c.removeClass(this.movedClass);
- }
- this.$.client.addChild(c);
- var p = this.$.client.hasNode();
- if (p && c.hasNode()) {
- var nextChild = undefined;
- var currIndex;
- for(var i=0; i<this.$.client.children.length; i++) {
- var curr = this.$.client.children[i];
- if(curr.toolbarIndex!=undefined && curr.toolbarIndex!=i) {
- nextChild = curr;
- currIndex = i;
- break;
- }
- }
- if(nextChild && nextChild.hasNode()) {
- c.insertNodeInParent(p, nextChild.node);
- var newChild = this.$.client.children.pop();
- this.$.client.children.splice(currIndex, 0, newChild);
- } else {
- c.appendNodeToParent(p);
- }
- }
- return true;
- }
- },
- tryPushItem: function() {
- if (this.pushItem()) {
- if (!this.isContentOverflowing()) {
- return true;
- } else {
- this.popItem();
- }
- }
- },
- isContentOverflowing: function() {
- if (this.$.client.hasNode()) {
- var c$ = this.$.client.children;
- var n = c$[c$.length-1].hasNode();
- if(n) {
- //Workaround: scrollWidth value not working in Firefox, so manually compute
- //return (this.$.client.node.scrollWidth > this.$.client.node.clientWidth);
- return ((n.offsetLeft + n.offsetWidth) > this.$.client.node.clientWidth);
- }
- }
- },
- findCollapsibleItem: function() {
- var c$ = this.$.client.children;
- for (var i=c$.length-1; c=c$[i]; i--) {
- if (!c.unmoveable) {
- return c;
- } else {
- if(c.toolbarIndex==undefined) {
- c.toolbarIndex = i;
- }
- }
- }
- }
- });
|