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

189 lines
5.9 KiB

/**
* @class Ext.sparkline.Bullet
*
* Plots a bullet graph based upon the input {@link #values} array.
*
* See <a href="http://en.wikipedia.org/wiki/Bullet_graph">Bullet graphs Wikipedia Page</a> for more information.
*
* See {@link Ext.sparkline.Base the base class} for a simple example.
*/
Ext.define('Ext.sparkline.Bullet', {
extend: 'Ext.sparkline.Base',
alias: 'widget.sparklinebullet',
config: {
/**
* @cfg {String} [targetColor=#f33] The colour of the vertical target marker.
*/
targetColor: '#f33',
/**
* @cfg {Number} [targetWidth=3] Width of the target bar in pixels.
*/
targetWidth: 3,
/**
* @cfg {String} [performanceColor=#33f] The color of the performance measure horizontal bar.
*/
performanceColor: '#33f',
/**
* @cfg {String[]} [rangeColors] An array of colors to use for each qualitative range background color.
*/
rangeColors: ['#d3dafe', '#a8b6ff', '#7f94ff'],
/**
* @cfg {Number} [base] Set this to a number to change the base start number.
*/
base: null,
tipTpl: new Ext.XTemplate('{fieldkey:this.fields} - {value}', {
fields: function(v) {
if (v === 'r') {
return 'Range';
}
if (v === 'p') {
return 'Performance';
}
if (v === 't') {
return 'Target';
}
}
})
},
// Ensure values is an array of normalized values
applyValues: function(newValues) {
newValues = Ext.Array.map(Ext.Array.from(newValues), this.normalizeValue);
this.disabled = !(newValues && newValues.length);
return newValues;
},
onUpdate: function() {
var me = this,
values = me.values,
min, max, vals,
base = me.getBase();
me.callParent(arguments);
// target or performance could be null
vals = values.slice();
vals[0] = vals[0] === null ? vals[2] : vals[0];
vals[1] = values[1] === null ? vals[2] : vals[1];
min = Math.min.apply(Math, values);
max = Math.max.apply(Math, values);
if (base == null) {
min = min < 0 ? min : 0;
} else {
min = base;
}
me.min = min;
me.max = max;
me.range = max - min;
me.shapes = {};
me.valueShapes = {};
me.regiondata = {};
if (!values.length) {
me.disabled = true;
}
},
getRegion: function(x, y) {
var shapeid = this.canvas.getShapeAt(x, y);
return (shapeid !== undefined && this.shapes[shapeid] !== undefined) ? this.shapes[shapeid] : undefined;
},
getRegionFields: function(region) {
return {
fieldkey: region.substr(0, 1),
value: this.values[region.substr(1)],
region: region
};
},
renderHighlight: function(region) {
switch (region.substr(0, 1)) {
case 'r':
this.renderRange(region.substr(1), true).append();
break;
case 'p':
this.renderPerformance(true).append();
break;
case 't':
this.renderTarget(true).append();
break;
}
},
renderRange: function(region, highlight) {
var rangeval = this.values[region],
rangewidth = Math.round(this.getWidth() * ((rangeval - this.min) / this.range)),
color = this.getRangeColors()[region - 2];
if (highlight) {
color = this.calcHighlightColor(color);
}
return this.canvas.drawRect(0, 0, rangewidth - 1, this.getHeight() - 1, color, color);
},
renderPerformance: function(highlight) {
var perfval = this.values[1],
perfwidth = Math.round(this.getWidth() * ((perfval - this.min) / this.range)),
color = this.getPerformanceColor();
if (highlight) {
color = this.calcHighlightColor(color);
}
return this.canvas.drawRect(0, Math.round(this.getHeight() * 0.3), perfwidth - 1,
Math.round(this.getHeight() * 0.4) - 1, color, color);
},
renderTarget: function(highlight) {
var targetval = this.values[0],
targetWidth = this.getTargetWidth(),
x = Math.round(this.getWidth() * ((targetval - this.min) / this.range) - (targetWidth / 2)),
targettop = Math.round(this.getHeight() * 0.10),
targetheight = this.getHeight() - (targettop * 2),
color = this.getTargetColor();
if (highlight) {
color = this.calcHighlightColor(color);
}
return this.canvas.drawRect(x, targettop, targetWidth - 1, targetheight - 1, color, color);
},
renderGraph: function () {
var me = this,
vlen = me.values.length,
canvas = me.canvas,
i, shape,
shapes = me.shapes || (me.shapes = {}),
valueShapes = me.valueShapes || (me.valueShapes = {});
if (!me.callParent()) {
return;
}
for (i = 2; i < vlen; i++) {
shape = me.renderRange(i).append();
shapes[shape.id] = 'r' + i;
valueShapes['r' + i] = shape.id;
}
if (me.values[1] !== null) {
shape = me.renderPerformance().append();
shapes[shape.id] = 'p1';
valueShapes.p1 = shape.id;
}
if (me.values[0] !== null) {
shape = this.renderTarget().append();
shapes[shape.id] = 't0';
valueShapes.t0 = shape.id;
}
// If mouse is over, apply the highlight
if (me.currentPageXY && me.el.getRegion().contains(me.currentPageXY)) {
me.updateDisplay();
}
canvas.render();
}
});