/** | |
* echarts组件基类 | |
* | |
* @desc echarts基于Canvas,纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据统计图表。 | |
* @author Kener (@Kener-林峰, linzhifeng@baidu.com) | |
* | |
*/ | |
define(function(require) { | |
function Base(zr, option){ | |
var ecData = require('../util/ecData'); | |
var accMath = require('../util/accMath'); | |
var zrUtil = require('zrender/tool/util'); | |
var self = this; | |
self.selectedMap = {}; | |
self.shapeHandler = { | |
onclick : function() { | |
self.isClick = true; | |
}, | |
ondragover : function (param) { | |
// 返回触发可计算特性的图形提示 | |
var calculableShape = zrUtil.clone(param.target); | |
calculableShape.highlightStyle = { | |
text : '', | |
r : calculableShape.style.r + 5, | |
brushType : 'stroke', | |
strokeColor : option.calculableColor,//self.zr.getCalculableColor(), | |
lineWidth : (calculableShape.style.lineWidth || 1) + 12 | |
}; | |
self.zr.addHoverShape(calculableShape); | |
}, | |
ondrop : function (param) { | |
// 排除一些非数据的拖拽进入 | |
if (typeof ecData.get(param.dragged, 'data') != 'undefined') { | |
self.isDrop = true; | |
} | |
}, | |
ondragend : function () { | |
self.isDragend = true; | |
} | |
}; | |
function setCalculable(shape) { | |
shape.dragEnableTime = option.DRAG_ENABLE_TIME; | |
shape.ondragover = self.shapeHandler.ondragover; | |
shape.ondragend = self.shapeHandler.ondragend; | |
shape.ondrop = self.shapeHandler.ondrop; | |
return shape; | |
} | |
/** | |
* 数据项被拖拽进来 | |
*/ | |
function ondrop(param, status) { | |
if (!self.isDrop || !param.target) { | |
// 没有在当前实例上发生拖拽行为则直接返回 | |
return; | |
} | |
var target = param.target; // 拖拽安放目标 | |
var dragged = param.dragged; // 当前被拖拽的图形对象 | |
var seriesIndex = ecData.get(target, 'seriesIndex'); | |
var dataIndex = ecData.get(target, 'dataIndex'); | |
// 落到数据item上,数据被拖拽到某个数据项上,数据修改 | |
var data = option.series[seriesIndex].data[dataIndex] || '-'; | |
if (data.value) { | |
if (data.value != '-') { | |
option.series[seriesIndex].data[dataIndex].value = | |
accMath.accAdd( | |
option.series[seriesIndex].data[dataIndex].value, | |
ecData.get(dragged, 'value') | |
); | |
} | |
else { | |
option.series[seriesIndex].data[dataIndex].value = | |
ecData.get(dragged, 'value'); | |
} | |
} | |
else { | |
if (data != '-') { | |
option.series[seriesIndex].data[dataIndex] = | |
accMath.accAdd( | |
option.series[seriesIndex].data[dataIndex], | |
ecData.get(dragged, 'value') | |
); | |
} | |
else { | |
option.series[seriesIndex].data[dataIndex] = | |
ecData.get(dragged, 'value'); | |
} | |
} | |
// 别status = {}赋值啊!! | |
status.dragIn = status.dragIn || true; | |
// 处理完拖拽事件后复位 | |
self.isDrop = false; | |
return; | |
} | |
/** | |
* 数据项被拖拽出去 | |
*/ | |
function ondragend(param, status) { | |
if (!self.isDragend || !param.target) { | |
// 没有在当前实例上发生拖拽行为则直接返回 | |
return; | |
} | |
var target = param.target; // 被拖拽图形元素 | |
var seriesIndex = ecData.get(target, 'seriesIndex'); | |
var dataIndex = ecData.get(target, 'dataIndex'); | |
// 被拖拽的图形是折线图bar,删除被拖拽走的数据 | |
option.series[seriesIndex].data[dataIndex] = '-'; | |
// 别status = {}赋值啊!! | |
status.dragOut = true; | |
status.needRefresh = true; | |
// 处理完拖拽事件后复位 | |
self.isDragend = false; | |
return; | |
} | |
/** | |
* 图例选择 | |
*/ | |
function onlegendSelected(param, status) { | |
var legendSelected = param.selected; | |
for (var itemName in self.selectedMap) { | |
if (self.selectedMap[itemName] != legendSelected[itemName]) { | |
// 有一项不一致都需要重绘 | |
status.needRefresh = true; | |
} | |
self.selectedMap[itemName] = legendSelected[itemName]; | |
} | |
return; | |
} | |
/** | |
* 基类方法 | |
*/ | |
self.setCalculable = setCalculable; | |
self.ondrop = ondrop; | |
self.ondragend = ondragend; | |
self.onlegendSelected = onlegendSelected; | |
} | |
return Base; | |
}); |