macoslinuxwindowsinboxwhatsappicloudtweetdeckhipchattelegramhangoutsslackgmailskypefacebook-workplaceoutlookemailmicrosoft-teamsdiscordmessengercustom-services
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
176 lines
5.2 KiB
176 lines
5.2 KiB
/** |
|
* @class Ext.sparkline.TriState |
|
* |
|
* Plots bars based upon "win"/"draw" or "lose" status of the input {@link #values} array. Positive values mean |
|
* a win, zero a draw, and negative a lose. |
|
* |
|
* See {@link Ext.sparkline.Base the base class} for a simple example. |
|
*/ |
|
Ext.define('Ext.sparkline.TriState', { |
|
extend: 'Ext.sparkline.BarBase', |
|
requires: [ |
|
'Ext.sparkline.RangeMap' |
|
], |
|
|
|
alias: 'widget.sparklinetristate', |
|
|
|
config: { |
|
|
|
/** |
|
* @cfg {Number} [barWidth=4] The pixel width of each bar. |
|
*/ |
|
barWidth: 4, |
|
|
|
/** |
|
* @cfg {Number} [barSpacing=1] The pixel spacing between each bar. |
|
*/ |
|
barSpacing: 1, |
|
|
|
/** |
|
* @cfg {String} [posBarColor=#6f6] The color for positive value bars. |
|
*/ |
|
posBarColor: '#6f6', |
|
|
|
/** |
|
* @cfg {String} [negBarColor=#f44] The color for negative value bars. |
|
*/ |
|
negBarColor: '#f44', |
|
|
|
/** |
|
* @cfg {String} [zeroBarColor=#999] The color for zero value bars. |
|
*/ |
|
zeroBarColor: '#999', |
|
|
|
/** |
|
* @cfg {Object} [colorMap] An object which uses range specifiers as keys to |
|
* indicate bar color values for a range of values. A range specifier is |
|
* specified in the form `[number]:[number]` indicating start and end range. |
|
* Omitting either means an open ended range. |
|
* |
|
* For example to render green bars on all values less than -1 and red on values |
|
* higher than 1 you would use: |
|
* |
|
* colorMap: { |
|
* // Open ended range, with max value -1 |
|
* ":-1": "green", |
|
* |
|
* // Open ended range, with min value 1 |
|
* "1:": "red" |
|
* } |
|
*/ |
|
colorMap: {}, |
|
|
|
tipTpl: new Ext.XTemplate('● {value:this.states}', { |
|
states: function(v) { |
|
var value = Number(v); |
|
if (value === -1) { |
|
return 'Loss'; |
|
} |
|
if (value === 0) { |
|
return 'Draw'; |
|
} |
|
if (value === 1) { |
|
return 'Win'; |
|
} |
|
return v; |
|
} |
|
}) |
|
}, |
|
|
|
applyColorMap: function(colorMap) { |
|
var me = this; |
|
|
|
if (Ext.isArray(colorMap)) { |
|
me.colorMapByIndex = colorMap; |
|
me.colorMapByValue = null; |
|
} else { |
|
me.colorMapByIndex = null; |
|
me.colorMapByValue = colorMap; |
|
if (me.colorMapByValue && me.colorMapByValue.get == null) { |
|
me.colorMapByValue = new Ext.sparkline.RangeMap(colorMap); |
|
} |
|
} |
|
return colorMap; |
|
}, |
|
|
|
// Ensure values is an array of numbers |
|
applyValues: function(newValues) { |
|
newValues = Ext.Array.map(Ext.Array.from(newValues), Number); |
|
this.disabled = !(newValues && newValues.length); |
|
return newValues; |
|
}, |
|
|
|
onUpdate: function() { |
|
this.totalBarWidth = this.getBarWidth() + this.getBarSpacing(); |
|
}, |
|
|
|
getBarWidth: function() { |
|
var values = this.values; |
|
|
|
return this._barWidth || (this.getWidth() - (values.length - 1) * this.getBarSpacing()) / values.length; |
|
}, |
|
|
|
getRegion: function (x, y) { |
|
return Math.floor(x / this.totalBarWidth); |
|
}, |
|
|
|
getRegionFields: function (region) { |
|
return { |
|
isNull: this.values[region] == null, |
|
value: this.values[region], |
|
color: this.calcColor(this.values[region], region), |
|
offset: region |
|
}; |
|
}, |
|
|
|
calcColor: function (value, valuenum) { |
|
var me = this, |
|
values = me.values, |
|
colorMapByIndex = me.colorMapByIndex, |
|
colorMapByValue = me.colorMapByValue, |
|
color, newColor; |
|
|
|
if (colorMapByValue && (newColor = colorMapByValue.get(value))) { |
|
color = newColor; |
|
} else if (colorMapByIndex && colorMapByIndex.length > valuenum) { |
|
color = colorMapByIndex[valuenum]; |
|
} else if (values[valuenum] < 0) { |
|
color = me.getNegBarColor(); |
|
} else if (values[valuenum] > 0) { |
|
color = me.getPosBarColor(); |
|
} else { |
|
color = me.getZeroBarColor(); |
|
} |
|
return color; |
|
}, |
|
|
|
renderRegion: function (valuenum, highlight) { |
|
var me = this, |
|
values = me.values, |
|
canvas = me.canvas, |
|
canvasHeight, height, halfHeight, x, y, color; |
|
|
|
canvasHeight = canvas.pixelHeight; |
|
halfHeight = Math.round(canvasHeight / 2); |
|
|
|
x = valuenum * me.totalBarWidth; |
|
if (values[valuenum] < 0) { |
|
y = halfHeight; |
|
height = halfHeight - 1; |
|
} else if (values[valuenum] > 0) { |
|
y = 0; |
|
height = halfHeight - 1; |
|
} else { |
|
y = halfHeight - 1; |
|
height = 2; |
|
} |
|
color = me.calcColor(values[valuenum], valuenum); |
|
if (color == null) { |
|
return; |
|
} |
|
if (highlight) { |
|
color = me.calcHighlightColor(color); |
|
} |
|
canvas.drawRect(x, y, me.getBarWidth() - 1, height - 1, color, color).append(); |
|
} |
|
}); |