Форк Rambox
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.
 
 
 

121 lines
4.1 KiB

/**
* @class Ext.sparkline.Discrete
*
* Plots a series of thin vertical lines based upon the input {@link #values} array.
*
* See {@link Ext.sparkline.Base the base class} for a simple example.
*/
Ext.define('Ext.sparkline.Discrete', {
extend: 'Ext.sparkline.BarBase',
alias: 'widget.sparklinediscrete',
config: {
/**
* @cfg {Number} lineHeight Height of each line in pixels - Defaults to 30% of the graph height.
*/
lineHeight: 'auto',
/**
* @cfg {String} thresholdColor Colour to use in combination with {@link #thresholdValue}
*/
thresholdColor: null,
/**
* @cfg {Number} thresholdValue Values less than this value will be drawn using {@link #thresholdColor} instead of lineColor
*/
thresholdValue: 0,
/**
* @cfg {Number} [chartRangeMax] The maximum value to use for the range of Y values of the chart - Defaults to the maximum value supplied.
*/
chartRangeMax: null,
/**
* @cfg {Number} [chartRangeMin] The minimum value to use for the range of Y values of the chart - Defaults to the minimum value supplied.
*/
chartRangeMin: null,
/**
* @cfg {Boolean} chartRangeClip If true then the y values supplied to plot will be clipped to fall
* between {@link #chartRangeMin} and {@link #chartRangeMax} - By default chartRangeMin/Max just ensure that the chart
* spans at least that range of values, but does not constrain it.
*/
chartRangeClip: false,
tipTpl: new Ext.XTemplate('{prefix}{value}{suffix}')
},
// 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 () {
var me = this,
values = me.values,
chartRangeMin = me.getChartRangeMin(),
chartRangeMax = me.getChartRangeMax(),
chartRangeClip = me.getChartRangeClip();
me.callParent(arguments);
me.regionShapes = {};
me.min = Math.min.apply(Math, values);
me.max = Math.max.apply(Math, values);
me.range = me.max - me.min;
me.width = me.getWidth();
me.interval = Math.floor(me.width / values.length);
me.itemWidth = me.width / values.length;
if (chartRangeMin != null && (chartRangeClip || chartRangeMin < me.min)) {
me.min = chartRangeMin;
}
if (chartRangeMax != null && (chartRangeClip || chartRangeMax > me.max)) {
me.max = chartRangeMax;
}
if (me.canvas) {
if (me.getLineHeight() === 'auto') {
me.setLineHeight(Math.round(me.getHeight() * 0.3));
}
}
},
getRegion: function (x, y) {
return Math.floor(x / this.itemWidth);
},
getRegionFields: function (region) {
return {
isNull: this.values[region] === undefined,
value: this.values[region],
offset: region
};
},
renderRegion: function (valuenum, highlight) {
var me = this,
values = me.values,
min = me.min,
max = me.max,
range = me.range,
interval = me.interval,
canvas = me.canvas,
canvasHeight = me.getHeight(),
lineHeight = me.getLineHeight(),
pheight = canvasHeight - lineHeight,
ytop, val, color, x,
thresholdColor = me.getThresholdColor();
val = Ext.Number.constrain(values[valuenum], min, max);
x = valuenum * interval;
ytop = Math.round(pheight - pheight * ((val - min) / range));
color = (thresholdColor && val < me.getThresholdValue()) ? thresholdColor : me.getLineColor();
if (highlight) {
color = me.calcHighlightColor(color);
}
canvas.drawLine(x, ytop, x, ytop + lineHeight, color).append();
}
});