X-Git-Url: http://git.ithinksw.org/extjs.git/blobdiff_plain/6746dc89c47ed01b165cc1152533605f97eb8e8d..f562e4c6e5fac7bcb445985b99acbea4d706e6f0:/src/chart/Label.js diff --git a/src/chart/Label.js b/src/chart/Label.js index 94a1ba0e..3e636d2c 100644 --- a/src/chart/Label.js +++ b/src/chart/Label.js @@ -15,11 +15,11 @@ If you are unsure which license is appropriate for your use, please contact the /** * @class Ext.chart.Label * - * Labels is a mixin whose methods are appended onto the Series class. Labels is an interface with methods implemented - * in each of the Series (Pie, Bar, etc) for label creation and label placement. + * Labels is a mixin to the Series class. Labels methods are implemented + * in each of the Series (Pie, Bar, etc) for label creation and placement. * * The methods implemented by the Series are: - * + * * - **`onCreateLabel(storeItem, item, i, display)`** Called each time a new label is created. * The arguments of the method are: * - *`storeItem`* The element of the store that is related to the label sprite. @@ -43,57 +43,59 @@ Ext.define('Ext.chart.Label', { /* Begin Definitions */ requires: ['Ext.draw.Color'], - - /* End Definitions */ - - /** - * @cfg {String} display - * Specifies the presence and position of labels for each pie slice. Either "rotate", "middle", "insideStart", - * "insideEnd", "outside", "over", "under", or "none" to prevent label rendering. - * Default value: 'none'. - */ - - /** - * @cfg {String} color - * The color of the label text. - * Default value: '#000' (black). - */ - - /** - * @cfg {String} field - * The name of the field to be displayed in the label. - * Default value: 'name'. - */ - /** - * @cfg {Number} minMargin - * Specifies the minimum distance from a label to the origin of the visualization. - * This parameter is useful when using PieSeries width variable pie slice lengths. - * Default value: 50. - */ - - /** - * @cfg {String} font - * The font used for the labels. - * Defautl value: "11px Helvetica, sans-serif". - */ - - /** - * @cfg {String} orientation - * Either "horizontal" or "vertical". - * Dafault value: "horizontal". - */ + /* End Definitions */ /** - * @cfg {Function} renderer - * Optional function for formatting the label into a displayable value. - * Default value: function(v) { return v; } - * @param v + * @cfg {Object} label + * Object with the following properties: + * + * - **display** : String + * + * Specifies the presence and position of labels for each pie slice. Either "rotate", "middle", "insideStart", + * "insideEnd", "outside", "over", "under", or "none" to prevent label rendering. + * Default value: 'none'. + * + * - **color** : String + * + * The color of the label text. + * Default value: '#000' (black). + * + * - **contrast** : Boolean + * + * True to render the label in contrasting color with the backround. + * Default value: false. + * + * - **field** : String + * + * The name of the field to be displayed in the label. + * Default value: 'name'. + * + * - **minMargin** : Number + * + * Specifies the minimum distance from a label to the origin of the visualization. + * This parameter is useful when using PieSeries width variable pie slice lengths. + * Default value: 50. + * + * - **font** : String + * + * The font used for the labels. + * Default value: "11px Helvetica, sans-serif". + * + * - **orientation** : String + * + * Either "horizontal" or "vertical". + * Dafault value: "horizontal". + * + * - **renderer** : Function + * + * Optional function for formatting the label into a displayable value. + * Default value: function(v) { return v; } */ //@private a regex to parse url type colors. colorStringRe: /url\s*\(\s*#([^\/)]+)\s*\)/, - + //@private the mixin constructor. Used internally by Series. constructor: function(config) { var me = this; @@ -127,102 +129,110 @@ Ext.define('Ext.chart.Label', { color = config.color, field = [].concat(config.field), group = me.labelsGroup, + groupLength = (group || 0) && group.length, store = me.chart.store, len = store.getCount(), itemLength = (items || 0) && items.length, ratio = itemLength / len, gradientsCount = (gradients || 0) && gradients.length, Color = Ext.draw.Color, - gradient, i, count, index, j, k, colorStopTotal, colorStopIndex, colorStop, item, label, + hides = [], + gradient, i, count, groupIndex, index, j, k, colorStopTotal, colorStopIndex, colorStop, item, label, storeItem, sprite, spriteColor, spriteBrightness, labelColor, colorString; if (display == 'none') { return; } + // no items displayed, hide all labels + if(itemLength == 0){ + while(groupLength--) + hides.push(groupLength); + }else{ + for (i = 0, count = 0, groupIndex = 0; i < len; i++) { + index = 0; + for (j = 0; j < ratio; j++) { + item = items[count]; + label = group.getAt(groupIndex); + storeItem = store.getAt(i); + //check the excludes + while(this.__excludes && this.__excludes[index] && ratio > 1) { + if(field[j]){ + hides.push(groupIndex); + } + index++; - for (i = 0, count = 0; i < len; i++) { - index = 0; - for (j = 0; j < ratio; j++) { - item = items[count]; - label = group.getAt(count); - storeItem = store.getAt(i); - - //check the excludes - while(this.__excludes && this.__excludes[index]) { - index++; - } - - if (!item && label) { - label.hide(true); - } + } - if (item && field[j]) { - if (!label) { - label = me.onCreateLabel(storeItem, item, i, display, j, index); + if (!item && label) { + label.hide(true); + groupIndex++; } - me.onPlaceLabel(label, storeItem, item, i, display, animate, j, index); - - //set contrast - if (config.contrast && item.sprite) { - sprite = item.sprite; - //set the color string to the color to be set. - if (sprite._endStyle) { - colorString = sprite._endStyle.fill; - } - else if (sprite._to) { - colorString = sprite._to.fill; - } - else { - colorString = sprite.attr.fill; + + if (item && field[j]) { + if (!label) { + label = me.onCreateLabel(storeItem, item, i, display, j, index); } - colorString = colorString || sprite.attr.fill; - - spriteColor = Color.fromString(colorString); - //color wasn't parsed property maybe because it's a gradient id - if (colorString && !spriteColor) { - colorString = colorString.match(me.colorStringRe)[1]; - for (k = 0; k < gradientsCount; k++) { - gradient = gradients[k]; - if (gradient.id == colorString) { - //avg color stops - colorStop = 0; colorStopTotal = 0; - for (colorStopIndex in gradient.stops) { - colorStop++; - colorStopTotal += Color.fromString(gradient.stops[colorStopIndex].color).getGrayscale(); + me.onPlaceLabel(label, storeItem, item, i, display, animate, j, index); + groupIndex++; + + //set contrast + if (config.contrast && item.sprite) { + sprite = item.sprite; + //set the color string to the color to be set. + if (sprite._endStyle) { + colorString = sprite._endStyle.fill; + } + else if (sprite._to) { + colorString = sprite._to.fill; + } + else { + colorString = sprite.attr.fill; + } + colorString = colorString || sprite.attr.fill; + + spriteColor = Color.fromString(colorString); + //color wasn't parsed property maybe because it's a gradient id + if (colorString && !spriteColor) { + colorString = colorString.match(me.colorStringRe)[1]; + for (k = 0; k < gradientsCount; k++) { + gradient = gradients[k]; + if (gradient.id == colorString) { + //avg color stops + colorStop = 0; colorStopTotal = 0; + for (colorStopIndex in gradient.stops) { + colorStop++; + colorStopTotal += Color.fromString(gradient.stops[colorStopIndex].color).getGrayscale(); + } + spriteBrightness = (colorStopTotal / colorStop) / 255; + break; } - spriteBrightness = (colorStopTotal / colorStop) / 255; - break; } } + else { + spriteBrightness = spriteColor.getGrayscale() / 255; + } + if (label.isOutside) { + spriteBrightness = 1; + } + labelColor = Color.fromString(label.attr.color || label.attr.fill).getHSL(); + labelColor[2] = spriteBrightness > 0.5 ? 0.2 : 0.8; + label.setAttributes({ + fill: String(Color.fromHSL.apply({}, labelColor)) + }, true); } - else { - spriteBrightness = spriteColor.getGrayscale() / 255; - } - if (label.isOutside) { - spriteBrightness = 1; - } - labelColor = Color.fromString(label.attr.color || label.attr.fill).getHSL(); - labelColor[2] = spriteBrightness > 0.5 ? 0.2 : 0.8; - label.setAttributes({ - fill: String(Color.fromHSL.apply({}, labelColor)) - }, true); + } + count++; + index++; } - count++; - index++; } } - me.hideLabels(count); + me.hideLabels(hides); }, - - //@private a method to hide labels. - hideLabels: function(index) { - var labelsGroup = this.labelsGroup, len; - if (labelsGroup) { - len = labelsGroup.getCount(); - while (len-->index) { - labelsGroup.getAt(len).hide(true); - } - } + hideLabels: function(hides){ + var labelsGroup = this.labelsGroup, + hlen = hides.length; + while(hlen--) + labelsGroup.getAt(hides[hlen]).hide(true); } });