jui.define("chart.brush.bubble", [ "util.base", "util.math" ], function(_, math) { /** * @class chart.brush.bubble * * @extends chart.brush.core */ var BubbleBrush = function() { var self = this, min = null, max = null; this.getFormatText = function(value, dataIndex) { if(_.typeCheck("function", this.brush.format)) { return this.format(this.axis.data[dataIndex]); } return value; } this.getBubbleRadius = function(value, dataIndex) { var scaleKey = this.brush.scaleKey; if(scaleKey != null) { var scaleValue = this.axis.data[dataIndex][scaleKey]; value = (_.typeCheck("number", scaleValue)) ? scaleValue : value; } return math.scaleValue(value, min, max, this.brush.min, this.brush.max); } this.createBubble = function(pos, color, dataIndex) { var radius = this.getBubbleRadius(pos.value, dataIndex), circle = this.svg.group().translate(pos.x, pos.y); circle.append( this.svg.circle({ r: radius, "fill": color, "fill-opacity": this.chart.theme("bubbleBackgroundOpacity"), "stroke": color, "stroke-width": this.chart.theme("bubbleBorderWidth") }) ); if(this.brush.showText) { var text = this.getFormatText(pos.value, dataIndex); circle.append( this.chart.text({ "font-size": this.chart.theme("bubbleFontSize"), fill: this.chart.theme("bubbleFontColor"), "text-anchor": "middle", dy: 3 }).text(text) ); } this.bubbleList.push(circle); return circle; } this.setActiveEffect = function(r) { var cols = this.bubbleList; for(var i = 0; i < cols.length; i++) { var opacity = (cols[i] == r) ? 1 : this.chart.theme("bubbleBackgroundOpacity"); cols[i].get(0).attr({ opacity: opacity }); cols[i].get(1).attr({ opacity: opacity }); } } this.drawBubble = function(points) { var g = this.svg.group(); for(var i = 0; i < points.length; i++) { for(var j = 0; j < points[i].x.length; j++) { var b = this.createBubble({ x: points[i].x[j], y: points[i].y[j], value: points[i].value[j] }, this.color(j, i), j); // 컬럼 및 기본 브러쉬 이벤트 설정 if(this.brush.activeEvent != null) { (function(bubble) { bubble.on(self.brush.activeEvent, function(e) { self.setActiveEffect(bubble); }); bubble.attr({ cursor: "pointer" }); })(b); } this.addEvent(b, j, i); g.append(b); } } // 액티브 버블 설정 var bubble = this.bubbleList[this.brush.active]; if(bubble != null) { this.setActiveEffect(bubble); } return g; } this.drawBefore = function() { var scaleKey = this.brush.scaleKey; if(scaleKey != null) { var values = []; for (var i = 0; i < this.axis.data.length; i++) { values.push(this.axis.data[i][scaleKey]); } min = Math.min.apply(this, values); max = Math.max.apply(this, values); } else { min = this.axis.y.min(); max = this.axis.y.max(); } this.bubbleList = []; } this.draw = function() { return this.drawBubble(this.getXY()); } this.drawAnimate = function(root) { root.each(function(i, elem) { var c = elem.children[0]; c.append(self.svg.animateTransform({ attributeType: "xml", attributeName: "transform", type: "scale", from: "0", to: "1", dur: "0.7s", fill: "freeze", repeatCount: "1" })); c.append(self.svg.animate({ attributeType: "xml", attributeName: "fill-opacity", from: "0", to: self.chart.theme("bubbleBackgroundOpacity"), dur: "1.4s", repeatCount: "1", fill: "freeze" })); }); } } BubbleBrush.setup = function() { return { /** @cfg {Number} [min=5] Determines the minimum size of a bubble. */ min: 5, /** @cfg {Number} [max=30] Determines the maximum size of a bubble.*/ max: 30, /** @cfg {String} [scaleKey=null] The name of the property to determine the bubble size. */ scaleKey: null, /** @cfg {Boolean} [showText=false] Set the text appear. */ showText: false, /** @cfg {Function} [format=null] Returns a value from the format callback function of a defined option. */ format: null, /** @cfg {Number} [active=null] Activates the bar of an applicable index. */ active: null, /** @cfg {String} [activeEvent=null] Activates the bar in question when a configured event occurs (click, mouseover, etc). */ activeEvent: null }; } return BubbleBrush; }, "chart.brush.core");