// Colorized icons cache var iconColorCache = { names: [], values: [] }; // Class for a Sugar icon enyo.kind({ name: "Sugar.Icon", kind: enyo.Control, published: { icon: null, size: constant.iconSizeStandard, x: -1, y: -1, colorized: false, colorizedColor: null, disabled: false, disabledBackground: 'white', popupShow: null, popupHide: null, isNative: false, data: null }, classes: "web-activity", components: [ { name: "icon", classes: "web-activity-icon", onmouseover: "popupShowTimer", onmouseout: "popupHideTimer"}, { name: "disable", classes: "web-activity-disable", showing: false} ], // Constructor create: function() { this.inherited(arguments); this.iconChanged(); this.sizeChanged(); this.colorizedColorChanged(); this.colorizedChanged(); this.isNativeChanged(); this.disabledBackgroundChanged(); this.disabledChanged(); this.xChanged(); this.yChanged(); this.timer = null; this.emulateMouseOver = false; }, // Timer handler for popup menu popupShowTimer: function() { if (this.popupShow == null) { return; } if (this.timer != null) { window.clearInterval(this.timer); } this.timer = window.setInterval(enyo.bind(this, "showPopup"), constant.timerPopupDuration); }, showPopup: function(icon, e) { this.popupShow(this); window.clearInterval(this.timer); this.timer = null; }, popupHideTimer: function(icon, e) { if (this.popupHide == null) { return; } if (this.timer != null) { window.clearInterval(this.timer); } this.timer = window.setInterval(enyo.bind(this, "hidePopup"), constant.timerPopupDuration); }, hidePopup: function() { if (!this.popupHide(this)) { return; } window.clearInterval(this.timer); this.timer = null; }, // Render rendered: function() { this.inherited(arguments); var node = this.$.icon.hasNode(); if (node && enyo.platform.touch) { // HACK: On iOS and Chrome Android use touch events to simulate mouseover/mouseout var that = this; if (enyo.platform.ios || enyo.platform.androidChrome) { enyo.dispatcher.listen(node, "touchstart", function(e) { mouse.position = {x: e.touches[0].clientX, y: e.touches[0].clientY}; that.popupShowTimer(); }); enyo.dispatcher.listen(node, "touchend", function(e) { that.popupHideTimer(); }); } } // If colorized if (this.colorized && !this.icon.isNative) { // Get colorized color var colorToUse = this.colorizedColor; var name = this.icon.directory+"/"+this.icon.icon; var cachename; node.style.backgroundImage = "url('" + name + "')"; if (colorToUse == null) { // Try to find colorized version in cache colorToUse = preferences.getColor(); cachename = name+"_"+colorToUse.stroke+"_"+colorToUse.fill; for (var i = 0 ; i < iconColorCache.names.length ; i++) if (iconColorCache.names[i] == cachename) { node.style.backgroundImage = iconColorCache.values[i]; return; } } else { cachename = name+"_"+colorToUse.stroke+"_"+colorToUse.fill; } // Build it iconLib.colorize(node, colorToUse, function() { // Cache it iconColorCache.names.push(cachename); iconColorCache.values.push(node.style.backgroundImage); }); } }, // Test is cursor is inside the icon cursorIsInside: function() { return util.cursorIsInside(this); }, // Property changed xChanged: function() { if (this.x != -1) { this.applyStyle("margin-left", this.x+"px"); } }, yChanged: function() { if (this.y != -1) { this.applyStyle("margin-top", this.y+"px"); } }, sizeChanged: function() { this.$.icon.applyStyle("width", this.size+"px"); this.$.icon.applyStyle("height", this.size+"px"); this.$.icon.applyStyle("background-size", this.size+"px "+this.size+"px"); this.$.disable.applyStyle("width", this.size+"px"); this.$.disable.applyStyle("height", this.size+"px"); this.$.disable.applyStyle("background-size", this.size+"px "+this.size+"px"); }, iconChanged: function() { if (this.icon != null) { if (this.icon.isNative != null) { this.$.icon.applyStyle("background-image", "url('"+this.icon.icon+"');"); } else { this.$.icon.applyStyle("background-image", "url('" + this.icon.directory+"/"+this.icon.icon + "')"); } } else { this.$.icon.applyStyle("background-image", null); } }, colorizedColorChanged: function() { this.render(); }, colorizedChanged: function() { this.render(); }, isNativeChanged: function(){ this.render(); }, disabledBackgroundChanged: function() { this.$.disable.applyStyle("background-color", this.disabledBackground); }, disabledChanged: function() { this.$.disable.setShowing(this.disabled); }, // Colorize colorize: function(color) { var node = this.hasNode(); if (!node || !node.style.backgroundImage) { return; } iconLib.colorize(node, color, function() {}); } });