|
|
-
- // 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() {});
- }
- });
|