|
|
-
- var _displayedPalette = null;
-
- // Class for a Sugar palette
- enyo.kind({
- name: "Sugar.Palette",
- kind: enyo.Control,
- published: {
- icon: null,
- text: null,
- contents: null,
- contentsClasses: "",
- header: null
- },
- classes: "palette-sugarizer palette-down",
- components: [
- { name: "icon", kind: "Sugar.Icon", classes: "palette-icon", size: 20, x: 6, y: 6 },
- { name: "text", classes: "palette-text" }
- ],
-
- // Constructor
- create: function() {
- this.inherited(arguments);
- this.iconChanged();
- this.textChanged();
- },
-
- rendered: function() {
- this.inherited(arguments);
- },
-
- // Property changed
- iconChanged: function() {
- this.$.icon.setIcon(this.icon);
- },
-
- textChanged: function() {
- this.$.text.setContent(this.text);
- },
-
- displayPopup: function(view) {
- if (_displayedPalette) {
- _displayedPalette.switchPalette(view);
- _displayedPalette = null;
- }
- if (this.contents == null) {
- return;
- }
- var id = this.hasNode().id+"_content";
- this.palette = view.createComponent({
- name: id,
- classes: "palette-content "+this.contentsClasses
- });
- if (this.header) {
- this.palette.createComponent({content: this.header, classes: "palette-header"}, {owner: this.palette});
- this.palette.createComponent({classes: "palette-hr"}, {owner: this.palette});
- }
- this.paletteEvents = [];
- for (var i = 0 ; i < this.contents.length ; i++) {
- var newObject = this.palette.createComponent(this.contents[i], {owner: this.palette});
- var tapMethod = this.contents[i].ontap;
- if (tapMethod) {
- this.palette[tapMethod] = enyo.bind(this, "bindedFunction");
- this.paletteEvents.push({"event": "tap", "object": newObject, "name": tapMethod})
- }
- }
- this.palette.render();
- _updatePosition(this);
- _displayedPalette = this;
- },
-
- setItems: function(items) {
- this.contents = items;
- },
-
- bindedFunction: function(o, e) {
- for (var i = 0 ; i < this.paletteEvents.length ; i++) {
- if (this.paletteEvents[i].event == e.type && this.paletteEvents[i].object == o) {
- enyo.call(this.parent, this.paletteEvents[i].name, [o, e]);
- }
- }
- },
-
- hidePopup: function(view) {
- var that = this;
- var toDestroy = null;
- enyo.forEach(view.getControls(), function(item) {
- if (item.getAttribute("id") == that.palette.getAttribute("id")) {
- toDestroy = item;
- }
- });
- if (toDestroy) {
- toDestroy.destroy();
- }
- _displayedPalette = null;
- },
-
- switchPalette: function(view) {
- var isOpen = this.isOpen();
- this.addRemoveClass("palette-down", isOpen);
- this.addRemoveClass("palette-up", !isOpen);
- if (!isOpen) {
- this.displayPopup(view);
- } else {
- this.hidePopup(view);
- }
- },
-
- isOpen: function() {
- return this.hasClass("palette-up");
- }
- });
-
-
- // Internal functions adapted from sugar-web/palette.js
-
- function _getOffset(elem, paletteElem) {
- // Ugly hack to consider the palette margin.
- var style = elem.currentStyle || window.getComputedStyle(elem, '');
-
- // Remove 'px' from the strings.
- var x = -2 * style.marginLeft.slice(0, -2);
- var y = -1 * style.marginTop.slice(0, -2);
-
- var rect = elem.getBoundingClientRect();
- x = rect.left;
- y += rect.top;
-
- // Shift to the right if overflow screen
- var delta = x + paletteElem.offsetWidth - document.getElementById("canvas").offsetWidth;
- if (delta > 0) {
- x -= delta;
- }
-
- return {
- top: y,
- left: x,
- width: rect.width,
- height: rect.height
- };
- }
-
- function _updatePosition(that) {
- var invokerOffset = _getOffset(that.hasNode(), that.palette.hasNode());
- var paletteX = invokerOffset.left;
- var paletteY = invokerOffset.top;
-
- var paletteElem = document.getElementById(that.palette.getAttribute("id"));
- paletteElem.style.left = paletteX + "px";
- paletteElem.style.top = paletteY + "px";
- }
|