NuclearDispersionSystem/ant-design-vue-jeecg/node_modules/@antv/g2/lib/component/legend/tail.js
2023-09-14 14:47:11 +08:00

287 lines
7.3 KiB
Java

function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
/**
* @fileOverview The class of tail legend
* @author Ye Liu
*/
var Util = require('../../util'); // const Category = require('./category');
var Components = require('@antv/component/lib');
var Global = require('../../global');
var Legend = Components.Legend;
var Category = Legend.Category;
var Tail = /*#__PURE__*/function (_Category) {
_inheritsLoose(Tail, _Category);
function Tail() {
return _Category.apply(this, arguments) || this;
}
var _proto = Tail.prototype;
_proto.getDefaultCfg = function getDefaultCfg() {
var cfg = _Category.prototype.getDefaultCfg.call(this);
return Util.mix({}, cfg, {
/**
* type标识
* @type {String}
*/
type: 'tail-legend',
/**
* 布局方式
* horizontal 水平
* vertical 垂直
* @type {String}
*/
layout: 'vertical',
autoLayout: true
});
};
_proto._addItem = function _addItem(item) {
var itemsGroup = this.get('itemsGroup');
var x = this._getNextX();
var y = 0;
var unCheckColor = this.get('unCheckColor');
var itemGroup = itemsGroup.addGroup({
x: 0,
y: 0,
value: item.value,
scaleValue: item.scaleValue,
checked: item.checked
});
itemGroup.translate(x, y);
itemGroup.set('viewId', itemsGroup.get('viewId'));
var textStyle = this.get('textStyle');
var wordSpace = this.get('_wordSpaceing');
var startX = 0;
if (item.marker) {
// 如果有marker添加marker
var markerAttrs = Util.mix({}, item.marker, {
x: item.marker.radius,
y: 0
});
if (!item.checked) {
if (markerAttrs.fill) {
markerAttrs.fill = unCheckColor;
}
if (markerAttrs.stroke) {
markerAttrs.stroke = unCheckColor;
}
}
var markerShape = itemGroup.addShape('marker', {
type: 'marker',
attrs: markerAttrs
});
markerShape.attr('cursor', 'pointer');
markerShape.name = 'legend-marker';
startX += markerShape.getBBox().width + wordSpace;
}
var textAttrs = Util.mix({}, textStyle, {
x: startX,
y: 0,
text: this._formatItemValue(item.value)
});
if (!item.checked) {
Util.mix(textAttrs, {
fill: unCheckColor
});
}
var textShape = itemGroup.addShape('text', {
attrs: textAttrs
});
textShape.attr('cursor', 'pointer');
textShape.name = 'legend-text';
this.get('appendInfo') && textShape.setSilent('appendInfo', this.get('appendInfo')); // 添加一个包围矩形,用于事件支持
var bbox = itemGroup.getBBox();
var itemWidth = this.get('itemWidth');
var wrapperShape = itemGroup.addShape('rect', {
attrs: {
x: x,
y: y - bbox.height / 2,
fill: '#fff',
fillOpacity: 0,
width: itemWidth || bbox.width,
height: bbox.height
}
});
wrapperShape.attr('cursor', 'pointer');
wrapperShape.setSilent('origin', item); // 保存图例项相关的数据,便于事件操作
wrapperShape.name = 'legend-item';
this.get('appendInfo') && wrapperShape.setSilent('appendInfo', this.get('appendInfo'));
itemGroup.name = 'legendGroup';
return itemGroup;
};
_proto._adjust = function _adjust() {
var self = this;
var geom = self.get('geom');
if (geom) {
var groupMatrix = self.get('group').attr('matrix');
groupMatrix[7] = 0;
var dataArray = self.get('geom').get('dataArray');
var groups = this.get('itemsGroup').get('children');
var index = 0;
Util.each(groups, function (groupItem) {
var dArray = dataArray[index];
var lastY = dArray[dArray.length - 1].y;
if (Util.isArray(lastY)) {
lastY = lastY[1];
}
var groupHeight = groupItem.getBBox().height;
var x = groupItem.get('x');
var y = lastY - groupHeight / 2;
groupItem.translate(x, y);
index++;
});
if (self.get('autoLayout')) {
self._antiCollision(groups);
}
}
};
_proto.render = function render() {
var _this = this;
_Category.prototype.render.call(this);
var chart = this.get('chart');
chart.once('afterpaint', function () {
_this._adjust();
});
};
_proto._getPreviousY = function _getPreviousY(item) {
var y = item.attr('matrix')[7];
var height = item.getBBox().height;
return y + height;
};
_proto._adjustDenote = function _adjustDenote(group, start, end) {
var margin = Global.legend.legendMargin;
var x0 = -2;
var x2 = -margin * 2;
group.addShape('path', {
attrs: {
path: 'M' + x0 + ',' + start + 'L' + x2 + ',' + (end + 3),
lineWidth: 1,
lineDash: [2, 2],
stroke: '#999999'
}
});
};
_proto._antiCollision = function _antiCollision(items) {
if (items === void 0) {
items = [];
}
if (!items.length) return;
var self = this;
items.sort(function (a, b) {
var ay = a.attr('matrix')[7];
var by = b.attr('matrix')[7];
return ay - by;
});
var overlapping = true;
var plotRange = self.get('chart').get('plotRange');
var startY = plotRange.tl.y;
var totalHeight = Math.abs(startY - plotRange.bl.y);
var elementHeight = items[0].getBBox().height;
var minY = Number.MIN_VALUE;
var maxY = 0;
var boxes = items.map(function (item) {
var y = item.attr('matrix')[7];
if (y > maxY) {
maxY = y;
}
if (y < minY) {
minY = y;
}
return {
size: item.getBBox().height,
targets: [y - startY]
};
});
minY -= startY;
var i = 0;
while (overlapping) {
for (var _i = 0; _i < boxes.length; _i++) {
var box = boxes[_i];
var target = (Math.min.apply(minY, box.targets) + Math.max.apply(minY, box.targets)) / 2;
box.pos = Math.min(Math.max(minY, target - box.size / 2), totalHeight - box.size);
}
overlapping = false;
i = boxes.length;
while (i--) {
if (i > 0) {
var previous = boxes[i - 1];
var current = boxes[i];
if (previous.pos + previous.size > current.pos) {
// overlapping
previous.size += current.size;
previous.targets = previous.targets.concat(current.targets);
boxes.splice(i, 1);
overlapping = true;
}
}
} // end of while i
} // end of while
// adjust y
i = 0;
var group = this.get('itemsGroup').addGroup();
boxes.forEach(function (b) {
var posInCompositeBox = startY + elementHeight;
b.targets.forEach(function () {
var origin_y = items[i].attr('matrix')[7];
var y = b.pos + posInCompositeBox - elementHeight / 2;
var dist = Math.abs(origin_y - y);
if (dist > elementHeight / 2) {
self._adjustDenote(group, y, origin_y - self.get('group').attr('matrix')[7] / 2);
}
items[i].translate(0, -origin_y);
items[i].translate(0, y);
posInCompositeBox += elementHeight;
i++;
});
});
} // end of antiCollision
;
return Tail;
}(Category);
module.exports = Tail;