blob: b6223f7678eac31dd5fec4e49f40b681d2e2f9c8 [file] [log] [blame]
/**
* echarts组件基类
*
* @desc echarts基于Canvas,纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据统计图表。
* @author Kener (@Kener-林峰, kener.linfeng@gmail.com)
*
*/
define(function (require) {
var ecConfig = require('../config');
var ecData = require('../util/ecData');
var ecQuery = require('../util/ecQuery');
var number = require('../util/number');
var zrUtil = require('zrender/tool/util');
function Base(ecTheme, messageCenter, zr, option, myChart){
this.ecTheme = ecTheme;
this.messageCenter = messageCenter;
this.zr =zr;
this.option = option;
this.series = option.series;
this.myChart = myChart;
this.component = myChart.component;
this.shapeList = [];
this.effectList = [];
var self = this;
self._onlegendhoverlink = function(param) {
if (self.legendHoverLink) {
var targetName = param.target;
var name;
for (var i = self.shapeList.length - 1; i >= 0; i--) {
name = self.type == ecConfig.CHART_TYPE_PIE
|| self.type == ecConfig.CHART_TYPE_FUNNEL
? ecData.get(self.shapeList[i], 'name')
: (ecData.get(self.shapeList[i], 'series') || {}).name;
if (name == targetName
&& !self.shapeList[i].invisible
&& !self.shapeList[i]._animating
) {
self.zr.addHoverShape(self.shapeList[i]);
}
}
}
};
messageCenter && messageCenter.bind(
ecConfig.EVENT.LEGEND_HOVERLINK, this._onlegendhoverlink
);
}
/**
* 基类方法
*/
Base.prototype = {
canvasSupported: require('zrender/tool/env').canvasSupported,
_getZ : function(zWhat) {
var opt = this.ecTheme[this.type];
if (opt && opt[zWhat] != null) {
return opt[zWhat];
}
opt = ecConfig[this.type];
if (opt && opt[zWhat] != null) {
return opt[zWhat];
}
return 0;
},
/**
* 获取zlevel基数配置
*/
getZlevelBase: function () {
return this._getZ('zlevel');
},
/**
* 获取z基数配置
*/
getZBase: function() {
return this._getZ('z');
},
/**
* 参数修正&默认值赋值
* @param {Object} opt 参数
*
* @return {Object} 修正后的参数
*/
reformOption: function (opt) {
// 默认配置项动态多级合并,依赖加载的组件选项未被merge到ecTheme里,需要从config里取
return zrUtil.merge(
zrUtil.merge(
opt || {},
zrUtil.clone(this.ecTheme[this.type] || {})
),
zrUtil.clone(ecConfig[this.type] || {})
);
},
/**
* css类属性数组补全,如padding,margin等~
*/
reformCssArray: function (p) {
if (p instanceof Array) {
switch (p.length + '') {
case '4':
return p;
case '3':
return [p[0], p[1], p[2], p[1]];
case '2':
return [p[0], p[1], p[0], p[1]];
case '1':
return [p[0], p[0], p[0], p[0]];
case '0':
return [0, 0, 0, 0];
}
}
else {
return [p, p, p, p];
}
},
getShapeById: function(id) {
for (var i = 0, l = this.shapeList.length; i < l; i++) {
if (this.shapeList[i].id === id) {
return this.shapeList[i];
}
}
return null;
},
/**
* 获取自定义和默认配置合并后的字体设置
*/
getFont: function (textStyle) {
var finalTextStyle = this.getTextStyle(
zrUtil.clone(textStyle)
);
return finalTextStyle.fontStyle + ' '
+ finalTextStyle.fontWeight + ' '
+ finalTextStyle.fontSize + 'px '
+ finalTextStyle.fontFamily;
},
/**
* 获取统一主题字体样式
*/
getTextStyle: function(targetStyle) {
return zrUtil.merge(
zrUtil.merge(
targetStyle || {},
this.ecTheme.textStyle
),
ecConfig.textStyle
);
},
getItemStyleColor: function (itemColor, seriesIndex, dataIndex, data) {
return typeof itemColor === 'function'
? itemColor.call(
this.myChart,
{
seriesIndex: seriesIndex,
series: this.series[seriesIndex],
dataIndex: dataIndex,
data: data
}
)
: itemColor;
},
/**
* @parmas {object | number} data 目标data
* @params {string= | number=} defaultData 无数据时默认返回
*/
getDataFromOption: function (data, defaultData) {
return data != null ? (data.value != null ? data.value : data) : defaultData;
},
// 亚像素优化
subPixelOptimize: function (position, lineWidth) {
if (lineWidth % 2 === 1) {
//position += position === Math.ceil(position) ? 0.5 : 0;
position = Math.floor(position) + 0.5;
}
else {
position = Math.round(position);
}
return position;
},
// 默认resize
resize: function () {
this.refresh && this.refresh();
this.clearEffectShape && this.clearEffectShape(true);
var self = this;
setTimeout(function(){
self.animationEffect && self.animationEffect();
},200);
},
/**
* 清除图形数据,实例仍可用
*/
clear :function () {
this.clearEffectShape && this.clearEffectShape();
this.zr && this.zr.delShape(this.shapeList);
this.shapeList = [];
},
/**
* 释放后实例不可用
*/
dispose: function () {
this.onbeforDispose && this.onbeforDispose();
this.clear();
this.shapeList = null;
this.effectList = null;
this.messageCenter && this.messageCenter.unbind(
ecConfig.EVENT.LEGEND_HOVERLINK, this._onlegendhoverlink
);
this.onafterDispose && this.onafterDispose();
},
query: ecQuery.query,
deepQuery: ecQuery.deepQuery,
deepMerge: ecQuery.deepMerge,
parsePercent: number.parsePercent,
parseCenter: number.parseCenter,
parseRadius: number.parseRadius,
numAddCommas: number.addCommas
};
return Base;
});