| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var tslib_1 = require("tslib");
- var util_1 = require("@antv/util");
- var label_1 = require("../util/label");
- var matrix_1 = require("../util/matrix");
- var state_1 = require("../util/state");
- var theme_1 = require("../util/theme");
- var base_1 = require("./base");
- /**
- * 分页器 默认配置
- */
- var DEFAULT_PAGE_NAVIGATOR = {
- marker: {
- style: {
- inactiveFill: '#000',
- inactiveOpacity: 0.45,
- fill: '#000',
- opacity: 1,
- size: 12,
- },
- },
- text: {
- style: {
- fill: '#ccc',
- fontSize: 12,
- },
- },
- };
- // 默认 文本style
- var textStyle = {
- fill: theme_1.default.textColor,
- fontSize: 12,
- textAlign: 'start',
- textBaseline: 'middle',
- fontFamily: theme_1.default.fontFamily,
- fontWeight: 'normal',
- lineHeight: 12,
- };
- var RIGHT_ARROW_NAME = 'navigation-arrow-right';
- var LEFT_ARROW_NAME = 'navigation-arrow-left';
- var ROTATE_MAP = {
- right: (90 * Math.PI) / 180,
- left: ((360 - 90) * Math.PI) / 180,
- up: 0,
- down: (180 * Math.PI) / 180,
- };
- var Category = /** @class */ (function (_super) {
- tslib_1.__extends(Category, _super);
- function Category() {
- var _this = _super !== null && _super.apply(this, arguments) || this;
- _this.currentPageIndex = 1;
- _this.totalPagesCnt = 1;
- _this.pageWidth = 0;
- _this.pageHeight = 0;
- _this.startX = 0;
- _this.startY = 0;
- _this.onNavigationBack = function () {
- var itemGroup = _this.getElementByLocalId('item-group');
- if (_this.currentPageIndex > 1) {
- _this.currentPageIndex -= 1;
- _this.updateNavigation();
- var matrix = _this.getCurrentNavigationMatrix();
- if (_this.get('animate')) {
- itemGroup.animate({
- matrix: matrix,
- }, 100);
- }
- else {
- itemGroup.attr({ matrix: matrix });
- }
- }
- };
- _this.onNavigationAfter = function () {
- var itemGroup = _this.getElementByLocalId('item-group');
- if (_this.currentPageIndex < _this.totalPagesCnt) {
- _this.currentPageIndex += 1;
- _this.updateNavigation();
- var matrix = _this.getCurrentNavigationMatrix();
- if (_this.get('animate')) {
- itemGroup.animate({
- matrix: matrix,
- }, 100);
- }
- else {
- itemGroup.attr({ matrix: matrix });
- }
- }
- };
- return _this;
- }
- Category.prototype.getDefaultCfg = function () {
- var cfg = _super.prototype.getDefaultCfg.call(this);
- return tslib_1.__assign(tslib_1.__assign({}, cfg), { name: 'legend', type: 'category', itemSpacing: 24, itemMarginBottom: 8, maxItemWidth: null, itemWidth: null, itemHeight: null, itemName: {}, itemValue: null, maxWidth: null, maxHeight: null, marker: {}, radio: null, items: [], itemStates: {}, itemBackground: {}, pageNavigator: {}, defaultCfg: {
- title: {
- spacing: 5,
- style: {
- fill: theme_1.default.textColor,
- fontSize: 12,
- textAlign: 'start',
- textBaseline: 'top',
- },
- },
- background: {
- padding: 5,
- style: {
- stroke: theme_1.default.lineColor,
- },
- },
- itemBackground: {
- style: {
- opacity: 0,
- fill: '#fff',
- },
- },
- pageNavigator: DEFAULT_PAGE_NAVIGATOR,
- itemName: {
- spacing: 16,
- style: textStyle,
- },
- marker: {
- spacing: 8,
- style: {
- r: 6,
- symbol: 'circle',
- },
- },
- itemValue: {
- alignRight: false,
- formatter: null,
- style: textStyle,
- spacing: 6,
- },
- itemStates: {
- active: {
- nameStyle: {
- opacity: 0.8,
- },
- },
- unchecked: {
- nameStyle: {
- fill: theme_1.default.uncheckedColor,
- },
- markerStyle: {
- fill: theme_1.default.uncheckedColor,
- stroke: theme_1.default.uncheckedColor,
- },
- },
- inactive: {
- nameStyle: {
- fill: theme_1.default.uncheckedColor,
- },
- markerStyle: {
- opacity: 0.2,
- },
- },
- },
- } });
- };
- // 实现 IList 接口
- Category.prototype.isList = function () {
- return true;
- };
- /**
- * 获取图例项
- * @return {ListItem[]} 列表项集合
- */
- Category.prototype.getItems = function () {
- return this.get('items');
- };
- /**
- * 设置列表项
- * @param {ListItem[]} items 列表项集合
- */
- Category.prototype.setItems = function (items) {
- this.update({
- items: items,
- });
- };
- /**
- * 更新列表项
- * @param {ListItem} item 列表项
- * @param {object} cfg 列表项
- */
- Category.prototype.updateItem = function (item, cfg) {
- util_1.mix(item, cfg);
- this.clear(); // 由于单个图例项变化,会引起全局变化,所以全部更新
- this.render();
- };
- /**
- * 清空列表
- */
- Category.prototype.clearItems = function () {
- var itemGroup = this.getElementByLocalId('item-group');
- itemGroup && itemGroup.clear();
- };
- /**
- * 设置列表项的状态
- * @param {ListItem} item 列表项
- * @param {string} state 状态名
- * @param {boolean} value 状态值, true, false
- */
- Category.prototype.setItemState = function (item, state, value) {
- item[state] = value;
- var itemElement = this.getElementByLocalId("item-" + item.id);
- if (itemElement) {
- var items = this.getItems();
- var index = items.indexOf(item);
- var offsetGroup = this.createOffScreenGroup(); // 离屏的 group
- var newElement = this.drawItem(item, index, this.getItemHeight(), offsetGroup);
- this.updateElements(newElement, itemElement); // 更新整个分组
- this.clearUpdateStatus(itemElement); // 清理更新状态,防止出现 bug
- }
- };
- /**
- * 是否存在指定的状态
- * @param {ListItem} item 列表项
- * @param {boolean} state 状态名
- */
- Category.prototype.hasState = function (item, state) {
- return !!item[state];
- };
- Category.prototype.getItemStates = function (item) {
- var itemStates = this.get('itemStates');
- var rst = [];
- util_1.each(itemStates, function (v, k) {
- if (item[k]) {
- // item.selected
- rst.push(k);
- }
- });
- return rst;
- };
- /**
- * 清楚所有列表项的状态
- * @param {string} state 状态值
- */
- Category.prototype.clearItemsState = function (state) {
- var _this = this;
- var items = this.getItemsByState(state);
- util_1.each(items, function (item) {
- _this.setItemState(item, state, false);
- });
- };
- /**
- * 根据状态获取图例项
- * @param {string} state [description]
- * @return {ListItem[]} [description]
- */
- Category.prototype.getItemsByState = function (state) {
- var _this = this;
- var items = this.getItems();
- return util_1.filter(items, function (item) {
- return _this.hasState(item, state);
- });
- };
- // 绘制 legend 的选项
- Category.prototype.drawLegendContent = function (group) {
- this.processItems();
- this.drawItems(group);
- };
- // 防止未设置 id
- Category.prototype.processItems = function () {
- var items = this.get('items');
- util_1.each(items, function (item) {
- if (!item.id) {
- // 如果没有设置 id,默认使用 name
- item.id = item.name;
- }
- });
- };
- // 绘制所有的图例选项
- Category.prototype.drawItems = function (group) {
- var _this = this;
- var itemContainerGroup = this.addGroup(group, {
- id: this.getElementId('item-container-group'),
- name: 'legend-item-container-group',
- });
- var itemGroup = this.addGroup(itemContainerGroup, {
- id: this.getElementId('item-group'),
- name: 'legend-item-group',
- });
- var itemHeight = this.getItemHeight();
- var itemWidth = this.get('itemWidth');
- var itemSpacing = this.get('itemSpacing');
- var itemMarginBottom = this.get('itemMarginBottom');
- var currentPoint = this.get('currentPoint');
- var startX = currentPoint.x;
- var startY = currentPoint.y;
- var layout = this.get('layout');
- var items = this.get('items');
- var wrapped = false;
- var pageWidth = 0;
- var maxWidth = this.get('maxWidth'); // 最大宽度,会导致 layout : 'horizontal' 时自动换行
- var maxHeight = this.get('maxHeight'); // 最大高度,会导致出现分页
- // 暂时不考虑分页
- util_1.each(items, function (item, index) {
- var subGroup = _this.drawItem(item, index, itemHeight, itemGroup);
- var bbox = subGroup.getBBox();
- var width = itemWidth || bbox.width;
- if (width > pageWidth) {
- pageWidth = width;
- }
- if (layout === 'horizontal') {
- // 如果水平布局
- if (maxWidth && maxWidth < currentPoint.x + width - startX) {
- // 检测是否换行
- wrapped = true;
- currentPoint.x = startX;
- currentPoint.y += itemHeight + itemMarginBottom;
- }
- _this.moveElementTo(subGroup, currentPoint);
- currentPoint.x += width + itemSpacing;
- }
- else {
- // 如果垂直布局
- if (maxHeight && maxHeight < currentPoint.y + itemHeight + itemMarginBottom - startY) {
- // 换行
- wrapped = true;
- currentPoint.x += pageWidth + itemSpacing;
- currentPoint.y = startY;
- pageWidth = 0;
- }
- _this.moveElementTo(subGroup, currentPoint);
- currentPoint.y += itemHeight + itemMarginBottom; // itemSpacing 仅影响水平间距
- }
- });
- if (wrapped && this.get('flipPage')) {
- this.pageHeight = 0;
- this.pageWidth = 0;
- this.totalPagesCnt = 1;
- this.startX = startX;
- this.startY = startY;
- this.adjustNavigation(group, itemGroup);
- }
- };
- // 获取图例项的高度,如果未定义,则按照 name 的高度计算
- Category.prototype.getItemHeight = function () {
- var itemHeight = this.get('itemHeight');
- if (!itemHeight) {
- var style_1 = (this.get('itemName') || {}).style;
- if (util_1.isFunction(style_1)) {
- var items_1 = this.getItems();
- items_1.forEach(function (item, index) {
- var fontSize = tslib_1.__assign(tslib_1.__assign({}, textStyle), style_1(item, index, items_1)).fontSize;
- if (itemHeight < fontSize) {
- itemHeight = fontSize;
- }
- });
- }
- else if (style_1) {
- itemHeight = style_1.fontSize;
- }
- }
- return itemHeight;
- };
- // 绘制 marker
- Category.prototype.drawMarker = function (container, markerCfg, item, itemHeight) {
- var markerAttrs = tslib_1.__assign(tslib_1.__assign(tslib_1.__assign({ x: 0, y: itemHeight / 2 }, markerCfg.style), { symbol: util_1.get(item.marker, 'symbol', 'circle') }), util_1.get(item.marker, 'style', {}));
- var shape = this.addShape(container, {
- type: 'marker',
- id: this.getElementId("item-" + item.id + "-marker"),
- name: 'legend-item-marker',
- attrs: markerAttrs,
- });
- var bbox = shape.getBBox();
- shape.attr('x', bbox.width / 2); // marker 需要左对齐,所以不能占用左侧的空间
- var _a = shape.attr(), stroke = _a.stroke, fill = _a.fill;
- if (stroke) {
- shape.set('isStroke', true);
- }
- if (fill) {
- shape.set('isFill', true);
- }
- return shape;
- };
- // 绘制文本
- Category.prototype.drawItemText = function (container, textName, cfg, item, itemHeight, xPosition, index) {
- var formatter = cfg.formatter;
- var style = cfg.style;
- var attrs = tslib_1.__assign(tslib_1.__assign({ x: xPosition, y: itemHeight / 2, text: formatter ? formatter(item[textName], item, index) : item[textName] }, textStyle), (util_1.isFunction(style) ? style(item, index, this.getItems()) : style));
- return this.addShape(container, {
- type: 'text',
- id: this.getElementId("item-" + item.id + "-" + textName),
- name: "legend-item-" + textName,
- attrs: attrs,
- });
- };
- Category.prototype.drawRadio = function (container, radioCfg, item, itemHeight, x) {
- var _a, _b;
- var style = radioCfg.style || {};
- // 以用户设置的 r 为主
- var r = (_a = style.r) !== null && _a !== void 0 ? _a : itemHeight / 2;
- var lineWidth = (r * 3.6) / 8;
- var _c = [x + r, itemHeight / 2 - r], x0 = _c[0], y0 = _c[1];
- var _d = [x0 + r, y0 + r], x1 = _d[0], y1 = _d[1];
- var _e = [x0, y1 + r], x2 = _e[0], y2 = _e[1];
- var _f = [x, y0 + r], x3 = _f[0], y3 = _f[1];
- var showRadio = item.showRadio;
- var attrs = tslib_1.__assign(tslib_1.__assign({ path: [
- ['M', x0, y0],
- ['A', r, r, 0, 0, 1, x1, y1],
- ['L', x1 - lineWidth, y1],
- ['L', x1, y1],
- ['A', r, r, 0, 0, 1, x2, y2],
- ['L', x2, y2 - lineWidth],
- ['L', x2, y2],
- ['A', r, r, 0, 0, 1, x3, y3],
- ['L', x3 + lineWidth, y3],
- ['L', x3, y3],
- ['A', r, r, 0, 0, 1, x0, y0],
- ['L', x0, y0 + lineWidth],
- ], stroke: '#000000', fill: '#ffffff' }, style), { opacity: showRadio ? ((_b = style === null || style === void 0 ? void 0 : style.opacity) !== null && _b !== void 0 ? _b : 0.45) : 0 });
- var radioShape = this.addShape(container, {
- type: 'path',
- id: this.getElementId("item-" + item.id + "-radio"),
- name: 'legend-item-radio',
- attrs: attrs,
- });
- radioShape.set('tip', radioCfg.tip);
- return radioShape;
- };
- // 绘制图例项
- Category.prototype.drawItem = function (item, index, itemHeight, itemGroup) {
- var groupId = "item-" + item.id;
- // 设置单独的 Group 用于 setClip
- var subContainer = this.addGroup(itemGroup, {
- name: 'legend-item-container',
- id: this.getElementId("item-container-" + groupId),
- delegateObject: {
- item: item,
- index: index,
- },
- });
- var subGroup = this.addGroup(subContainer, {
- name: 'legend-item',
- id: this.getElementId(groupId),
- delegateObject: {
- item: item,
- index: index,
- },
- });
- var marker = this.get('marker');
- var itemName = this.get('itemName');
- var itemValue = this.get('itemValue');
- var itemBackground = this.get('itemBackground');
- var radio = this.get('radio');
- var itemWidth = this.getLimitItemWidth();
- var curX = 0; // 记录当前 x 的位置
- if (marker) {
- var markerShape = this.drawMarker(subGroup, marker, item, itemHeight);
- var spacing = marker.spacing;
- var itemMarkerSpacing = util_1.get(item, ['marker', 'spacing']);
- if (util_1.isNumber(itemMarkerSpacing)) {
- // 如果 item 有配置 marker.spacing,采用 item 的配置
- spacing = itemMarkerSpacing;
- }
- curX = markerShape.getBBox().maxX + spacing;
- }
- if (itemName) {
- var nameShape = this.drawItemText(subGroup, 'name', itemName, item, itemHeight, curX, index);
- if (itemWidth) {
- // 设置了 item 的最大宽度限制,并且超出了,进行省略处理
- label_1.ellipsisLabel(true, nameShape, util_1.clamp(itemWidth - curX, 0, itemWidth));
- }
- curX = nameShape.getBBox().maxX + itemName.spacing;
- }
- if (itemValue) {
- var valueShape = this.drawItemText(subGroup, 'value', itemValue, item, itemHeight, curX, index);
- if (itemWidth) {
- if (itemValue.alignRight) {
- valueShape.attr({
- textAlign: 'right',
- x: itemWidth,
- });
- label_1.ellipsisLabel(true, valueShape, util_1.clamp(itemWidth - curX, 0, itemWidth), 'head');
- }
- else {
- label_1.ellipsisLabel(true, valueShape, util_1.clamp(itemWidth - curX, 0, itemWidth));
- }
- }
- curX = valueShape.getBBox().maxX + itemValue.spacing;
- }
- if (radio) {
- this.drawRadio(subGroup, radio, item, itemHeight, curX);
- }
- // 添加透明的背景,便于拾取和包围盒计算
- if (itemBackground) {
- var bbox = subGroup.getBBox();
- var backShape = this.addShape(subGroup, {
- type: 'rect',
- name: 'legend-item-background',
- id: this.getElementId(groupId + "-background"),
- attrs: tslib_1.__assign({ x: 0, y: 0, width: bbox.width, height: itemHeight }, itemBackground.style),
- });
- backShape.toBack();
- }
- this.applyItemStates(item, subGroup);
- return subGroup;
- };
- // 加上分页器并重新排序 items
- Category.prototype.adjustNavigation = function (container, itemGroup) {
- var _this = this;
- var startX = this.startX;
- var startY = this.startY;
- var layout = this.get('layout');
- var subGroups = itemGroup.findAll(function (item) { return item.get('name') === 'legend-item'; });
- var maxWidth = this.get('maxWidth');
- var maxHeight = this.get('maxHeight');
- var itemWidth = this.get('itemWidth');
- var itemSpacing = this.get('itemSpacing');
- var itemHeight = this.getItemHeight();
- var pageNavigator = util_1.deepMix({}, DEFAULT_PAGE_NAVIGATOR, this.get('pageNavigator'));
- var navigation = this.drawNavigation(container, layout, '00/00', pageNavigator);
- var navigationBBox = navigation.getBBox();
- var currentPoint = { x: startX, y: startY };
- var pages = 1;
- var widthLimit = 0;
- var pageWidth = 0;
- var maxItemWidth = 0;
- var itemMarginBottom = this.get('itemMarginBottom');
- /** 判断当前 item 是否溢出当前页。是的话,需要换行 */
- function shouldWrap(item, currentPoint) {
- var bbox = item.getBBox();
- var width = itemWidth || bbox.width;
- var newItemXPos = currentPoint.x + width + itemSpacing + navigationBBox.width;
- return newItemXPos > maxWidth;
- }
- if (layout === 'horizontal') {
- var maxRow = this.get('maxRow') || 1;
- var maxRowHeight_1 = itemHeight + (maxRow === 1 ? 0 : itemMarginBottom);
- // 分页器一直靠右上角
- var navigationX_1 = maxWidth - itemSpacing - navigationBBox.width - navigationBBox.minX; // 理论上不需要减 navigationBBox.minX
- this.pageHeight = maxRowHeight_1 * maxRow;
- this.pageWidth = navigationX_1;
- util_1.each(subGroups, function (item) {
- var bbox = item.getBBox();
- var width = itemWidth || bbox.width;
- if ((widthLimit && widthLimit < currentPoint.x + width + itemSpacing) ||
- shouldWrap(item, currentPoint)) {
- if (pages === 1) {
- widthLimit = currentPoint.x + itemSpacing;
- _this.moveElementTo(navigation, {
- x: navigationX_1,
- y: currentPoint.y + itemHeight / 2 - navigationBBox.height / 2 - navigationBBox.minY,
- });
- }
- pages += 1;
- currentPoint.x = startX;
- currentPoint.y += maxRowHeight_1;
- }
- _this.moveElementTo(item, currentPoint);
- item.getParent().setClip({
- type: 'rect',
- attrs: {
- x: currentPoint.x,
- y: currentPoint.y,
- width: width + itemSpacing,
- height: itemHeight,
- },
- });
- currentPoint.x += width + itemSpacing;
- });
- }
- else {
- util_1.each(subGroups, function (item) {
- var bbox = item.getBBox();
- if (bbox.width > pageWidth) {
- pageWidth = bbox.width;
- }
- });
- maxItemWidth = pageWidth;
- pageWidth += itemSpacing;
- if (maxWidth) {
- // maxWidth 限制加上
- pageWidth = Math.min(maxWidth, pageWidth);
- maxItemWidth = Math.min(maxWidth, maxItemWidth);
- }
- this.pageWidth = pageWidth;
- this.pageHeight = maxHeight - Math.max(navigationBBox.height, itemHeight + itemMarginBottom);
- var cntPerPage_1 = Math.floor(this.pageHeight / (itemHeight + itemMarginBottom));
- util_1.each(subGroups, function (item, index) {
- if (index !== 0 && index % cntPerPage_1 === 0) {
- pages += 1;
- currentPoint.x += pageWidth;
- currentPoint.y = startY;
- }
- _this.moveElementTo(item, currentPoint);
- item.getParent().setClip({
- type: 'rect',
- attrs: {
- x: currentPoint.x,
- y: currentPoint.y,
- width: pageWidth,
- height: itemHeight,
- },
- });
- currentPoint.y += itemHeight + itemMarginBottom;
- });
- this.totalPagesCnt = pages;
- this.moveElementTo(navigation, {
- x: startX + maxItemWidth / 2 - navigationBBox.width / 2 - navigationBBox.minX,
- y: maxHeight - navigationBBox.height - navigationBBox.minY,
- });
- }
- if (this.pageHeight && this.pageWidth) {
- // 为了使固定的 clip 生效,clip 设置在 itemContainerGroup 上,itemGroup 需要在翻页时会设置 matrix
- itemGroup.getParent().setClip({
- type: 'rect',
- attrs: {
- x: this.startX,
- y: this.startY,
- width: this.pageWidth,
- height: this.pageHeight,
- },
- });
- }
- // 重新计算 totalPagesCnt
- if (layout === 'horizontal' && this.get('maxRow')) {
- this.totalPagesCnt = Math.ceil(pages / this.get('maxRow'));
- }
- else {
- this.totalPagesCnt = pages;
- }
- if (this.currentPageIndex > this.totalPagesCnt) {
- this.currentPageIndex = 1;
- }
- this.updateNavigation(navigation);
- // update initial matrix
- itemGroup.attr('matrix', this.getCurrentNavigationMatrix());
- };
- /**
- * 绘制分页器
- */
- Category.prototype.drawNavigation = function (group, layout, text, styleCfg) {
- var currentPoint = { x: 0, y: 0 };
- var subGroup = this.addGroup(group, {
- id: this.getElementId('navigation-group'),
- name: 'legend-navigation',
- });
- var _a = util_1.get(styleCfg.marker, 'style', {}), _b = _a.size, size = _b === void 0 ? 12 : _b, arrowStyle = tslib_1.__rest(_a, ["size"]);
- var leftArrow = this.drawArrow(subGroup, currentPoint, LEFT_ARROW_NAME, layout === 'horizontal' ? 'up' : 'left', size, arrowStyle);
- leftArrow.on('click', this.onNavigationBack);
- var leftArrowBBox = leftArrow.getBBox();
- currentPoint.x += leftArrowBBox.width + 2;
- var textShape = this.addShape(subGroup, {
- type: 'text',
- id: this.getElementId('navigation-text'),
- name: 'navigation-text',
- attrs: tslib_1.__assign({ x: currentPoint.x, y: currentPoint.y + size / 2, text: text, textBaseline: 'middle' }, util_1.get(styleCfg.text, 'style')),
- });
- var textBBox = textShape.getBBox();
- currentPoint.x += textBBox.width + 2;
- var rightArrow = this.drawArrow(subGroup, currentPoint, RIGHT_ARROW_NAME, layout === 'horizontal' ? 'down' : 'right', size, arrowStyle);
- rightArrow.on('click', this.onNavigationAfter);
- return subGroup;
- };
- Category.prototype.updateNavigation = function (navigation) {
- var pageNavigator = util_1.deepMix({}, DEFAULT_PAGE_NAVIGATOR, this.get('pageNavigator'));
- var _a = pageNavigator.marker.style, fill = _a.fill, opacity = _a.opacity, inactiveFill = _a.inactiveFill, inactiveOpacity = _a.inactiveOpacity;
- var text = this.currentPageIndex + "/" + this.totalPagesCnt;
- var textShape = navigation ? navigation.getChildren()[1] : this.getElementByLocalId('navigation-text');
- var leftArrow = navigation
- ? navigation.findById(this.getElementId(LEFT_ARROW_NAME))
- : this.getElementByLocalId(LEFT_ARROW_NAME);
- var rightArrow = navigation
- ? navigation.findById(this.getElementId(RIGHT_ARROW_NAME))
- : this.getElementByLocalId(RIGHT_ARROW_NAME);
- textShape.attr('text', text);
- // 更新 left-arrow marker
- leftArrow.attr('opacity', this.currentPageIndex === 1 ? inactiveOpacity : opacity);
- leftArrow.attr('fill', this.currentPageIndex === 1 ? inactiveFill : fill);
- leftArrow.attr('cursor', this.currentPageIndex === 1 ? 'not-allowed' : 'pointer');
- // 更新 right-arrow marker
- rightArrow.attr('opacity', this.currentPageIndex === this.totalPagesCnt ? inactiveOpacity : opacity);
- rightArrow.attr('fill', this.currentPageIndex === this.totalPagesCnt ? inactiveFill : fill);
- rightArrow.attr('cursor', this.currentPageIndex === this.totalPagesCnt ? 'not-allowed' : 'pointer');
- // 更新位置
- var cursorX = leftArrow.getBBox().maxX + 2;
- textShape.attr('x', cursorX);
- cursorX += textShape.getBBox().width + 2;
- this.updateArrowPath(rightArrow, { x: cursorX, y: 0 });
- };
- Category.prototype.drawArrow = function (group, currentPoint, name, direction, size, style) {
- var x = currentPoint.x, y = currentPoint.y;
- var shape = this.addShape(group, {
- type: 'path',
- id: this.getElementId(name),
- name: name,
- attrs: tslib_1.__assign({ size: size,
- direction: direction, path: [['M', x + size / 2, y], ['L', x, y + size], ['L', x + size, y + size], ['Z']], cursor: 'pointer' }, style),
- });
- shape.attr('matrix', matrix_1.getMatrixByAngle({ x: x + size / 2, y: y + size / 2 }, ROTATE_MAP[direction]));
- return shape;
- };
- /**
- * 更新分页器 arrow 组件
- */
- Category.prototype.updateArrowPath = function (arrow, point) {
- var x = point.x, y = point.y;
- var _a = arrow.attr(), size = _a.size, direction = _a.direction;
- var matrix = matrix_1.getMatrixByAngle({ x: x + size / 2, y: y + size / 2 }, ROTATE_MAP[direction]);
- arrow.attr('path', [['M', x + size / 2, y], ['L', x, y + size], ['L', x + size, y + size], ['Z']]);
- arrow.attr('matrix', matrix);
- };
- Category.prototype.getCurrentNavigationMatrix = function () {
- var _a = this, currentPageIndex = _a.currentPageIndex, pageWidth = _a.pageWidth, pageHeight = _a.pageHeight;
- var layout = this.get('layout');
- var translate = layout === 'horizontal'
- ? {
- x: 0,
- y: pageHeight * (1 - currentPageIndex),
- }
- : {
- x: pageWidth * (1 - currentPageIndex),
- y: 0,
- };
- return matrix_1.getMatrixByTranslate(translate);
- };
- // 附加状态对应的样式
- Category.prototype.applyItemStates = function (item, subGroup) {
- var states = this.getItemStates(item);
- var hasStates = states.length > 0;
- if (hasStates) {
- var children = subGroup.getChildren();
- var itemStates_1 = this.get('itemStates');
- util_1.each(children, function (element) {
- var name = element.get('name');
- var elName = name.split('-')[2]; // marker, name, value
- var statesStyle = state_1.getStatesStyle(item, elName, itemStates_1);
- if (statesStyle) {
- element.attr(statesStyle);
- if (elName === 'marker' && !(element.get('isStroke') && element.get('isFill'))) {
- // 如果 marker 是单填充或者单描边的话,就不要额外添加 stroke 或这 fill 属性,否则会影响 unchecked 后的显示
- if (element.get('isStroke')) {
- element.attr('fill', null);
- }
- if (element.get('isFill')) {
- element.attr('stroke', null);
- }
- }
- }
- });
- }
- };
- // 获取 itemWidth 的最终设置
- Category.prototype.getLimitItemWidth = function () {
- var itemWidth = this.get('itemWidth');
- var maxItemWidth = this.get('maxItemWidth');
- if (maxItemWidth) {
- // 设置了最大宽度
- if (itemWidth) {
- maxItemWidth = itemWidth <= maxItemWidth ? itemWidth : maxItemWidth;
- }
- }
- else if (itemWidth) {
- maxItemWidth = itemWidth;
- }
- return maxItemWidth;
- };
- return Category;
- }(base_1.default));
- exports.default = Category;
- //# sourceMappingURL=category.js.map
|