function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } var Util = require('../../util'); var _require = require('@antv/component/lib'), Legend = _require.Legend; var Tail = require('../../component/legend/tail'); var Shape = require('../../geom/shape/shape'); var bboxOfBackPlot = require('../util/bbox-of-back-plot'); var plotRange2BBox = require('../util/plot-range2bbox'); var Global = require('../../global'); var FIELD_ORIGIN = '_origin'; var MARKER_SIZE = 4.5; var requireAnimationFrameFn = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame; var STROKE_MARKERS = ['cross', 'tick', 'plus', 'hyphen', 'line', 'hollowCircle', 'hollowSquare', 'hollowDiamond', 'hollowTriangle', 'hollowTriangleDown', 'hollowHexagon', 'hollowBowtie']; function _snapEqual(v1, v2, scale) { var isEqual; if (Util.isNil(scale)) { return false; } v1 = scale.translate(v1); v2 = scale.translate(v2); if (scale.isCategory) { isEqual = v1 === v2; } else { isEqual = Math.abs(v1 - v2) <= 1; } return isEqual; } function findGeom(geoms, value) { var rst; Util.each(geoms, function (geom) { if (geom.get('visible')) { var yScale = geom.getYScale(); if (yScale.field === value) { rst = geom; return; } } }); return rst; } var LegendController = /*#__PURE__*/function () { function LegendController(cfg) { var self = this; self.options = {}; Util.mix(self, cfg); self.clear(); var chart = self.chart; self.container = chart.get('frontPlot'); self.plotRange = chart.get('plotRange'); } var _proto = LegendController.prototype; _proto.clear = function clear() { var legends = this.legends; this.backRange = null; Util.each(legends, function (legendItems) { Util.each(legendItems, function (legend) { legend.destroy(); }); }); this.legends = {}; } // 获取坐标轴等背景元素占的范围,防止遮挡坐标轴 ; _proto.getBackRange = function getBackRange() { var backRange = this.backRange; if (!backRange) { var backPlot = this.chart.get('backPlot'); backRange = bboxOfBackPlot(backPlot, plotRange2BBox(this.chart.get('plotRange'))); var plotRange = this.plotRange; if (backRange.maxX - backRange.minX < plotRange.br.x - plotRange.tl.x && backRange.maxY - backRange.minY < plotRange.br.y - plotRange.tl.y) { // 如果背景小于则直接使用 plotRange backRange = { minX: plotRange.tl.x, minY: plotRange.tl.y, maxX: plotRange.br.x, maxY: plotRange.br.y }; } this.backRange = backRange; } return backRange; }; _proto._isFieldInView = function _isFieldInView(field, value, view) { var flag = false; var scales = view.get('scales'); var fieldScale = scales[field]; if (fieldScale && fieldScale.values) { flag = Util.inArray(fieldScale.values, value); } return flag; }; _proto._bindClickEvent = function _bindClickEvent(legend, scale, filterVals) { var self = this; var chart = self.chart; var views = chart.get('views'); var field = scale.field; var options = self.options; legend.on('itemclick', function (ev) { if (options.onClick && options.defaultClickHandlerEnabled !== true) { options.onClick(ev); } else { // if 'defaultClickHandlerEnabled' is true the default click behavior would be worked. var item = ev.item; var checked = ev.checked; var isSingleSelected = legend.get('selectedMode') === 'single'; // 图例的选中模式 var clickedValue = item.dataValue; // import: 需要取该图例项原始的数值 if (checked) { Util.Array.remove(filterVals, clickedValue); if (self._isFieldInView(field, clickedValue, chart)) { chart.filter(field, function (field) { return isSingleSelected ? field === clickedValue : !Util.inArray(filterVals, field); }); } Util.each(views, function (view) { if (self._isFieldInView(field, clickedValue, view)) { view.filter(field, function (field) { return isSingleSelected ? field === clickedValue : !Util.inArray(filterVals, field); }); } }); } else if (!isSingleSelected) { filterVals.push(clickedValue); if (self._isFieldInView(field, clickedValue, chart)) { chart.filter(field, function (field) { return !Util.inArray(filterVals, field); }); } Util.each(views, function (view) { if (self._isFieldInView(field, clickedValue, view)) { view.filter(field, function (field) { return !Util.inArray(filterVals, field); }); } }); } if (options.onClick) { options.onClick(ev); } chart.set('keepLegend', true); // 图例不重新渲染 chart.set('keepPadding', true); // 边框不重新计算 chart.repaint(); chart.set('keepPadding', false); chart.set('keepLegend', false); } }); }; _proto._bindClickEventForMix = function _bindClickEventForMix(legend) { var self = this; var chart = self.chart; var geoms = chart.getAllGeoms(); legend.on('itemclick', function (ev) { var itemField = ev.item.field; var checked = ev.checked; if (checked) { Util.each(geoms, function (geom) { var field = geom.getYScale().field; if (field === itemField) { geom.show(); } }); } else { Util.each(geoms, function (geom) { var field = geom.getYScale().field; if (field === itemField) { geom.hide(); } }); } }); }; _proto._filterLabels = function _filterLabels(shape, geom, visible) { if (shape.get('gLabel')) { shape.get('gLabel').set('visible', visible); } else { var labelCfg = geom.get('labelCfg'); if (labelCfg && labelCfg.fields && labelCfg.fields.length > 0) { var xScale = geom.getXScale(); var yScale = geom.getYScale(); var xField = xScale.field; var yField = yScale.field; var shapeData = shape.get('origin')._origin; var labelContainer = geom.get('labelContainer'); var labels = labelContainer.get('labelsGroup').get('children'); Util.each(labels, function (label) { var labelData = label.get('origin') || []; if (labelData[xField] === shapeData[xField] && labelData[yField] === shapeData[yField]) { label.set('visible', visible); shape.set('gLabel', label); } }); } } }; _proto._bindFilterEvent = function _bindFilterEvent(legend, scale) { var self = this; var chart = this.chart; var field = scale.field; legend.on('itemfilter', function (ev) { var range = ev.range; chart.filterShape(function (obj, shape, geom) { // @2018-12-21 by blue.lb 由于数值0直接被类型转换为false,这里需要做更精确一点的判断 if (!Util.isNil(obj[field])) { var filtered = obj[field] >= range[0] && obj[field] <= range[1]; // shape 带 label,则还需要隐藏 label self._filterLabels(shape, geom, filtered); return filtered; } return true; }); var geoms = chart.getAllGeoms() || []; var _loop = function _loop(i) { var geom = geoms[i]; if (geom.get('type') === 'heatmap') { requireAnimationFrameFn(function () { geom.drawWithRange(range); }); } }; for (var i = 0; i < geoms.length; i++) { _loop(i); } }); }; _proto._getShapeData = function _getShapeData(shape) { var originData = shape.get('origin'); if (Util.isArray(originData)) { originData = originData[0]; } return originData[FIELD_ORIGIN]; }; _proto._bindHoverEvent = function _bindHoverEvent(legend, field) { var self = this; var chart = self.chart; var geoms = chart.getAllGeoms(); var options = self.options; var canvas = chart.get('canvas'); legend.on('itemhover', function (ev) { var value = ev.item.value; var pre = self.pre; if (!pre) { Util.each(geoms, function (geom) { var shapeContainer = geom.get('shapeContainer'); var shapes = geom.getShapes(); var activeShapes = []; if (field) { var scale = geom.get('scales')[field]; Util.each(shapes, function (shape) { var origin = self._getShapeData(shape); if (origin && _snapEqual(origin[field], value, scale)) { activeShapes.push(shape); } }); } else if (geom.getYScale().field === value) { activeShapes = shapes; } if (!Util.isEmpty(activeShapes)) { ev.shapes = activeShapes; ev.geom = geom; if (options.onHover) { options.onHover(ev); shapeContainer.sort(); canvas.draw(); } else { geom.setShapesActived(activeShapes); } } }); self.pre = value; } else if (pre === value) { return; } }); legend.on('itemunhover', function (ev) { self.pre = null; if (options.onUnhover) { options.onUnhover(ev); } Util.each(geoms, function (geom) { if (geom.get('activeShapes')) { geom.clearActivedShapes(); canvas.draw(); } }); }); }; _proto._isFiltered = function _isFiltered(scale, filterVals, scaleValue) { if (!scale.isCategory) { return true; } var rst = true; scaleValue = scale.invert(scaleValue); Util.each(filterVals, function (val) { if (scale.getText(val) === scale.getText(scaleValue)) { rst = false; return false; } }); return rst; }; _proto._alignLegend = function _alignLegend(legend, pre, region, position) { var self = this; var viewTheme = self.viewTheme; var container = self.container; var canvas = container.get('canvas'); var width = canvas.get('width'); var height = canvas.get('height'); var totalRegion = self.totalRegion; var plotRange = self.plotRange; var backRange = self.getBackRange(); // 背景占得范围 var offsetX = legend.get('offset')[0] || 0; var offsetY = legend.get('offset')[1] || 0; // const offset = Util.isNil(legend.get('offset')) ? MARGIN : legend.get('offset'); var legendHeight = legend.getHeight(); var legendWidth = legend.getWidth(); var borderMargin = viewTheme.legend.margin; var innerMargin = viewTheme.legend.legendMargin; var legendNum = self.legends[position].length; var posArray = position.split('-'); var x = 0; var y = 0; var tempoRegion = legendNum > 1 ? totalRegion : region; if (posArray[0] === 'left' || posArray[0] === 'right') { height = plotRange.br.y; x = self._getXAlign(posArray[0], width, region, backRange, legendWidth, borderMargin); if (pre) { // @2018-10-19 by blue.lb 由于legend中并不存在y属性,这里需要先获取group再获取y值 // @2019-03-21 by blue.lb 由于内部实现问题,usehtml部分的实例可以直接获取x、y的 y = (pre.get('y') || pre.get('group').get('y')) + pre.getHeight() + innerMargin; } else { y = self._getYAlignVertical(posArray[1], height, tempoRegion, backRange, 0, borderMargin, canvas.get('height')); } } else if (posArray[0] === 'top' || posArray[0] === 'bottom') { y = self._getYAlignHorizontal(posArray[0], height, region, backRange, legendHeight, borderMargin); if (pre) { var preWidth = pre.getWidth(); // @2018-10-19 by blue.lb 由于legend中并不存在x属性,这里需要先获取group再获取x值 // @2019-03-21 by blue.lb 由于内部实现问题,usehtml部分的实例可以直接获取x、y的 x = (pre.get('x') || pre.get('group').get('x')) + preWidth + innerMargin; } else { x = self._getXAlign(posArray[1], width, tempoRegion, backRange, 0, borderMargin); if (posArray[1] === 'right') x = plotRange.br.x - tempoRegion.totalWidth; } } legend.move(x + offsetX, y + offsetY); }; _proto._getXAlign = function _getXAlign(pos, width, region, backRange, legendWidth, borderMargin) { var leftPos = backRange.minX - legendWidth - borderMargin[3] < 0 ? 0 : backRange.minX - legendWidth - borderMargin[3]; var x = pos === 'left' ? leftPos : backRange.maxX + borderMargin[1]; if (pos === 'center') { x = (width - region.totalWidth) / 2; } return x; }; _proto._getYAlignHorizontal = function _getYAlignHorizontal(pos, height, region, backRange, legendHeight, borderMargin) { var y = pos === 'top' ? backRange.minY - legendHeight - borderMargin[0] : backRange.maxY + borderMargin[2]; return y; }; _proto._getYAlignVertical = function _getYAlignVertical(pos, height, region, backRange, legendHeight, borderMargin, canvasHeight) { var y = pos === 'top' ? backRange.minY - legendHeight - borderMargin[0] : height - region.totalHeight; if (pos === 'center') { y = (canvasHeight - region.totalHeight) / 2; } return y; }; _proto._getSubRegion = function _getSubRegion(legends) { var maxWidth = 0; var maxHeight = 0; var totalWidth = 0; var totalHeight = 0; Util.each(legends, function (legend) { var width = legend.getWidth(); var height = legend.getHeight(); if (maxWidth < width) { maxWidth = width; } totalWidth += width; if (maxHeight < height) { maxHeight = height; } totalHeight += height; }); return { maxWidth: maxWidth, totalWidth: totalWidth, maxHeight: maxHeight, totalHeight: totalHeight }; }; _proto._getRegion = function _getRegion() { var self = this; var viewTheme = self.viewTheme; var legends = self.legends; var innerMargin = viewTheme.legend.legendMargin; var subs = []; var totalWidth = 0; var totalHeight = 0; Util.each(legends, function (legendItems) { var subRegion = self._getSubRegion(legendItems); subs.push(subRegion); totalWidth += subRegion.totalWidth + innerMargin; totalHeight += subRegion.totalHeight + innerMargin; }); return { totalWidth: totalWidth, totalHeight: totalHeight, subs: subs }; }; _proto._addCategoryLegend = function _addCategoryLegend(scale, attr, geom, filterVals, position) { var self = this; var field = scale.field; var legendOptions = self.options; var fieldOption = legendOptions[field]; if (fieldOption) { legendOptions = fieldOption; } var legends = self.legends; legends[position] = legends[position] || []; var container = self.container; var items = []; var ticks = scale.getTicks(); var isByAttr = true; var shapeType = geom.get('shapeType') || 'point'; var shape = geom.getDefaultValue('shape') || 'circle'; if (legendOptions[field] && legendOptions[field].marker) { // 用户为 field 对应的图例定义了 marker shape = legendOptions[field].marker; shapeType = 'point'; isByAttr = false; } else if (legendOptions.marker) { shape = legendOptions.marker; shapeType = 'point'; isByAttr = false; } var chart = self.chart; var viewTheme = self.viewTheme; var canvas = chart.get('canvas'); var plotRange = self.plotRange; var posArray = position.split('-'); var maxLength = posArray[0] === 'right' || posArray[0] === 'left' ? plotRange.bl.y - plotRange.tr.y : canvas.get('width'); Util.each(ticks, function (tick) { var text = tick.text; var name = text; var scaleValue = tick.value; var value = scale.invert(scaleValue); var cfg = { isInCircle: geom.isInCircle() }; var checked = filterVals ? self._isFiltered(scale, filterVals, scaleValue) : true; var colorAttr = geom.getAttr('color'); var shapeAttr = geom.getAttr('shape'); if (colorAttr) { // 存在颜色映射 if (colorAttr.callback && colorAttr.callback.length > 1) { // 多参数映射,阻止程序报错 var restArgs = Array(colorAttr.callback.length - 1).fill(''); cfg.color = colorAttr.mapping.apply(colorAttr, [value].concat(restArgs)).join('') || viewTheme.defaultColor; } else { cfg.color = colorAttr.mapping(value).join('') || viewTheme.defaultColor; } } if (isByAttr && shapeAttr) { // 存在形状映射 if (shapeAttr.callback && shapeAttr.callback.length > 1) { // 多参数映射,阻止程序报错 var _restArgs = Array(shapeAttr.callback.length - 1).fill(''); shape = shapeAttr.mapping.apply(shapeAttr, [value].concat(_restArgs)).join(''); } else { shape = shapeAttr.mapping(value).join(''); } } var shapeObject = Shape.getShapeFactory(shapeType); var marker = shapeObject.getMarkerCfg(shape, cfg); if (Global.legendMarkerRadius) { marker.radius = Global.legendMarkerRadius; } if (Util.isFunction(shape)) { marker.symbol = shape; } items.push({ value: name, // 图例项显示文本的内容 dataValue: value, // 图例项对应原始数据中的数值 checked: checked, marker: marker }); }); var legendCfg = Util.deepMix({}, viewTheme.legend[posArray[0]], legendOptions[field] || legendOptions, { viewId: chart.get('_id'), maxLength: maxLength, items: items, container: container, position: [0, 0] }); if (legendCfg.title) { Util.deepMix(legendCfg, { title: { text: scale.alias || scale.field } }); } var legend; if (self._isTailLegend(legendOptions, geom)) { legendCfg.chart = self.chart; legendCfg.geom = geom; legend = new Tail(legendCfg); } else { if (legendOptions.useHtml) { var canvasEle = container.get('canvas').get('el'); container = legendOptions.container; if (Util.isString(container) && /^\#/.test(container)) { // 如果传入 dom 节点的 id var id = container.replace('#', ''); container = document.getElementById(id); } if (!container) { container = canvasEle.parentNode; } legendCfg.container = container; if (legendCfg.legendStyle === undefined) legendCfg.legendStyle = {}; legendCfg.legendStyle.CONTAINER_CLASS = _extends({}, legendCfg.legendStyle.CONTAINER_CLASS, { position: 'absolute', overflow: 'auto', 'z-index': canvasEle.style.zIndex === '' ? 1 : parseInt(canvasEle.style.zIndex, 10) + 1 }); if (legendOptions.flipPage) { legendCfg.legendStyle.CONTAINER_CLASS.height = posArray[0] === 'right' || posArray[0] === 'left' ? maxLength + 'px' : 'auto'; legendCfg.legendStyle.CONTAINER_CLASS.width = !(posArray[0] === 'right' || posArray[0] === 'left') ? maxLength + 'px' : 'auto'; legend = new Legend.CatPageHtml(legendCfg); } else { legend = new Legend.CatHtml(legendCfg); } } else { legend = new Legend.Category(legendCfg); } } self._bindClickEvent(legend, scale, filterVals); legends[position].push(legend); return legend; }; _proto._bindChartMove = function _bindChartMove(scale) { var chart = this.chart; var legends = this.legends; chart.on('plotmove', function (ev) { var selected = false; if (ev.target) { var origin = ev.target.get('origin'); if (origin) { var data = origin[FIELD_ORIGIN] || origin[0][FIELD_ORIGIN]; var field = scale.field; if (data) { var value = data[field]; Util.each(legends, function (legendItems) { Util.each(legendItems, function (legend) { selected = true; !legend.destroyed && legend.activate(value); }); }); } } } if (!selected) { Util.each(legends, function (legendItems) { Util.each(legendItems, function (legend) { !legend.destroyed && legend.deactivate(); }); }); } }); }; _proto._addContinuousLegend = function _addContinuousLegend(scale, attr, position) { var self = this; var legends = self.legends; legends[position] = legends[position] || []; var container = self.container; var field = scale.field; var ticks = scale.getTicks(); var items = []; var legend; var minValue; var maxValue; var viewTheme = self.viewTheme; Util.each(ticks, function (tick) { var scaleValue = tick.value; var invertValue = scale.invert(scaleValue); var attrValue = attr.mapping(invertValue).join(''); items.push({ value: tick.tickValue, // tick.text attrValue: attrValue, color: attrValue, scaleValue: scaleValue }); if (scaleValue === 0) { minValue = true; } if (scaleValue === 1) { maxValue = true; } }); if (!minValue) { items.push({ value: scale.min, attrValue: attr.mapping(0).join(''), color: attr.mapping(0).join(''), scaleValue: 0 }); } if (!maxValue) { items.push({ value: scale.max, attrValue: attr.mapping(1).join(''), color: attr.mapping(1).join(''), scaleValue: 1 }); } var options = self.options; var posArray = position.split('-'); var defaultCfg = viewTheme.legend[posArray[0]]; if (options && options.slidable === false || options[field] && options[field].slidable === false) { defaultCfg = Util.mix({}, defaultCfg, viewTheme.legend.gradient); } var legendCfg = Util.deepMix({}, defaultCfg, options[field] || options, { items: items, attr: attr, formatter: scale.formatter, container: container, position: [0, 0] }); if (legendCfg.title) { Util.deepMix(legendCfg, { title: { text: scale.alias || scale.field } }); } if (attr.type === 'color') { legend = new Legend.Color(legendCfg); } else if (attr.type === 'size') { if (options && options.sizeType === 'circle') legend = new Legend.CircleSize(legendCfg);else legend = new Legend.Size(legendCfg); } else { return; } self._bindFilterEvent(legend, scale); legends[position].push(legend); return legend; }; _proto._isTailLegend = function _isTailLegend(opt, geom) { if (opt.hasOwnProperty('attachLast') && opt.attachLast) { var geomType = geom.get('type'); if (geomType === 'line' || geomType === 'lineStack' || geomType === 'area' || geomType === 'areaStack') return true; } return false; }; _proto._adjustPosition = function _adjustPosition(position, isTailLegend) { var pos; if (isTailLegend) { pos = 'right-top'; } else if (Util.isArray(position)) { pos = String(position[0]) + '-' + String(position[1]); } else { var posArr = position.split('-'); if (posArr.length === 1) { // 只用了left/right/bottom/top一个位置定位 if (posArr[0] === 'left') pos = 'left-bottom'; if (posArr[0] === 'right') pos = 'right-bottom'; if (posArr[0] === 'top') pos = 'top-center'; if (posArr[0] === 'bottom') pos = 'bottom-center'; } else { pos = position; } } return pos; }; _proto.addLegend = function addLegend(scale, attr, geom, filterVals) { var self = this; var legendOptions = self.options; var field = scale.field; var fieldOption = legendOptions[field]; var viewTheme = self.viewTheme; if (fieldOption === false) { // 如果不显示此图例 return null; } if (fieldOption && fieldOption.custom) { self.addCustomLegend(field); } else { var position = legendOptions.position || viewTheme.defaultLegendPosition; position = self._adjustPosition(position, self._isTailLegend(legendOptions, geom)); if (fieldOption && fieldOption.position) { // 如果对某个图例单独设置 position,则对 position 重新赋值 position = self._adjustPosition(fieldOption.position, self._isTailLegend(fieldOption, geom)); } var legend; if (scale.isLinear) { legend = self._addContinuousLegend(scale, attr, position); } else { legend = self._addCategoryLegend(scale, attr, geom, filterVals, position); } if (legend) { self._bindHoverEvent(legend, field); legendOptions.reactive && self._bindChartMove(scale); } } } /** * 自定义图例 * @param {string} field 自定义图例的数据字段名,可以为空 * @return {object} legend 自定义图例实例 */ ; _proto.addCustomLegend = function addCustomLegend(field) { var self = this; var chart = self.chart; var viewTheme = self.viewTheme; var container = self.container; var legendOptions = self.options; if (field) { legendOptions = legendOptions[field]; } var position = legendOptions.position || viewTheme.defaultLegendPosition; position = self._adjustPosition(position); var legends = self.legends; legends[position] = legends[position] || []; var items = legendOptions.items; if (!items) { return; } var geoms = chart.getAllGeoms(); Util.each(items, function (item) { var geom = findGeom(geoms, item.value); if (!Util.isPlainObject(item.marker)) { // 直接传入字符串或者回调函数时转换为对象,如 item.marker = 'circle' item.marker = { symbol: item.marker || 'circle', radius: Global.legendMarkerRadius || MARKER_SIZE }; if (Util.indexOf(STROKE_MARKERS, item.marker.symbol) !== -1) { item.marker.stroke = item.fill; } else { item.marker.fill = item.fill; } } else { // 用户传入对象 item.marker = { symbol: 'circle', fill: 'red', radius: 3 } item.marker.radius = item.marker.radius || Global.legendMarkerRadius || MARKER_SIZE; } var symbol = item.marker.symbol; if (Util.isString(symbol) && symbol.indexOf('hollow') !== -1) { item.marker.symbol = Util.lowerFirst(symbol.substr(6)); } item.checked = Util.isNil(item.checked) ? true : item.checked; item.geom = geom; }); var canvas = chart.get('canvas'); var plotRange = self.plotRange; var posArray = position.split('-'); var maxLength = posArray[0] === 'right' || posArray[0] === 'left' ? plotRange.bl.y - plotRange.tr.y : canvas.get('width'); var legendCfg = Util.deepMix({}, viewTheme.legend[posArray[0]], legendOptions, { maxLength: maxLength, items: items, container: container, position: [0, 0] }); var legend; if (legendOptions.useHtml) { var htmlContainer = legendOptions.container; if (/^\#/.test(container)) { // 如果传入 dom 节点的 id var id = htmlContainer.replace('#', ''); htmlContainer = document.getElementById(id); } else if (!htmlContainer) { htmlContainer = container.get('canvas').get('el').parentNode; } legendCfg.container = htmlContainer; if (legendCfg.legendStyle === undefined) legendCfg.legendStyle = {}; if (!legendCfg.legendStyle.CONTAINER_CLASS) { legendCfg.legendStyle.CONTAINER_CLASS = { height: posArray[0] === 'right' || posArray[0] === 'left' ? maxLength + 'px' : 'auto', width: !(posArray[0] === 'right' || posArray[0] === 'left') ? maxLength + 'px' : 'auto', position: 'absolute', overflow: 'auto' }; } if (legendOptions.flipPage) legend = new Legend.CatPageHtml(legendCfg);else legend = new Legend.CatHtml(legendCfg); } else legend = new Legend.Category(legendCfg); legends[position].push(legend); legend.on('itemclick', function (ev) { if (legendOptions.onClick) { // 用户自定义了图例点击事件 legendOptions.onClick(ev); } }); self._bindHoverEvent(legend); return legend; }; _proto.addMixedLegend = function addMixedLegend(scales, geoms) { var self = this; var legendOptions = self.options; var items = []; Util.each(scales, function (scale) { var value = scale.alias || scale.field; var fieldLegendOptions = legendOptions[scale.field]; Util.each(geoms, function (geom) { if (geom.getYScale() === scale && scale.values && scale.values.length > 0 && fieldLegendOptions !== false) { var shapeType = geom.get('shapeType') || 'point'; var shape = geom.getDefaultValue('shape') || 'circle'; var shapeObject = Shape.getShapeFactory(shapeType); var cfg = { color: geom.getDefaultValue('color') }; var marker = shapeObject.getMarkerCfg(shape, cfg); if (Global.legendMarkerRadius) { marker.radius = Global.legendMarkerRadius; } var item = { value: value, marker: marker, field: scale.field }; items.push(item); } }); // end of geom loop }); // end of scale loop var options = { custom: true, items: items }; self.options = Util.deepMix({}, options, self.options); var legend = self.addCustomLegend(); self._bindClickEventForMix(legend); }; _proto.alignLegends = function alignLegends() { var self = this; var legends = self.legends; var totalRegion = self._getRegion(legends); self.totalRegion = totalRegion; var i = 0; Util.each(legends, function (legendItems, position) { var region = /* self._getRegion(legendItems)*/ totalRegion.subs[i]; Util.each(legendItems, function (legend, index) { var pre = legendItems[index - 1]; if (!(legend.get('useHtml') && !legend.get('autoPosition'))) { self._alignLegend(legend, pre, region, position); } }); i++; }); return this; }; return LegendController; }(); module.exports = LegendController;