You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

165 lines
7.2 KiB

import { __assign, __extends, __read } from "tslib";
import { deepMix, isUndefined } from '@antv/util';
import { Component } from '../../core';
import { maybeAppend, parseSeriesAttr, select, subStyleProps } from '../../util';
import { Marker } from '../marker';
import { DISABLED_STYLE, SIZE_STYLE, TYPE_STYLE } from './constant';
var Button = /** @class */ (function (_super) {
__extends(Button, _super);
function Button(options) {
var _this = _super.call(this, options, {
cursor: 'pointer',
padding: 10,
size: 'middle',
type: 'default',
text: '',
state: 'default',
markerAlign: 'left',
markerSpacing: 5,
default: {
buttonLineWidth: 1,
buttonRadius: 5,
},
active: {},
}) || this;
_this.state = 'default';
_this.clickEvents = function () {
var _a = _this.attributes, onClick = _a.onClick, state = _a.state;
// 点击事件
if (state !== 'disabled')
onClick === null || onClick === void 0 ? void 0 : onClick.call(_this, _this);
};
_this.mouseenterEvent = function () {
var state = _this.attributes.state;
if (state !== 'disabled') {
_this.state = 'active';
_this.render(_this.attributes, _this);
}
};
_this.mouseleaveEvent = function () {
var state = _this.attributes.state;
_this.state = state;
_this.render(_this.attributes, _this);
};
return _this;
}
Object.defineProperty(Button.prototype, "markerSize", {
get: function () {
var markerSymbol = this.attributes.markerSymbol;
var markerStyle = this.getStyle('marker');
var markerSize = !markerSymbol ? 0 : (markerStyle === null || markerStyle === void 0 ? void 0 : markerStyle.size) || 2;
return markerSize;
},
enumerable: false,
configurable: true
});
Object.defineProperty(Button.prototype, "textAvailableWidth", {
/* 获得文本可用宽度 */
get: function () {
var _a = this.attributes, markerSymbol = _a.markerSymbol, padding = _a.padding, ellipsis = _a.ellipsis, bWidth = _a.width, spacing = _a.markerSpacing;
if (!ellipsis)
return Infinity;
/* 按钮总宽度 */
var width = (isUndefined(bWidth) ? this.getStyle('button').width : bWidth);
if (markerSymbol)
return width - padding * 2 - spacing - this.markerSize;
return width - padding * 2;
},
enumerable: false,
configurable: true
});
Object.defineProperty(Button.prototype, "buttonHeight", {
get: function () {
var height = this.attributes.height;
if (height)
return +height;
return +this.getStyle('button').height;
},
enumerable: false,
configurable: true
});
/**
* 根据size、type属性生成实际渲染的属性
*/
Button.prototype.getStyle = function (name) {
var _a = this.attributes, size = _a.size, type = _a.type;
var state = this.state;
var mixedStyle = deepMix({}, SIZE_STYLE[size], TYPE_STYLE[type][state], this.attributes.default, this.attributes[state]);
if (state === 'disabled') {
// 从DISABLED_STYLE中pick中pick mixedStyle里已有的style
Object.keys(mixedStyle).forEach(function (key) {
if (key in DISABLED_STYLE) {
// @ts-ignore
mixedStyle[key] = DISABLED_STYLE[key];
}
});
Object.keys(DISABLED_STYLE.strict).forEach(function (key) {
// @ts-ignore
mixedStyle[key] = DISABLED_STYLE.strict[key];
});
deepMix(mixedStyle, this.attributes.disabled || {});
}
return subStyleProps(mixedStyle, name);
};
// @todo 处理 markerAlign='right' 的场景. 方案: left marker & right marker 处理为两个 shape, 互相不干扰
Button.prototype.render = function (attributes, container) {
var _a = attributes.text, text = _a === void 0 ? '' : _a, _b = attributes.padding, padding = _b === void 0 ? 0 : _b, markerSymbol = attributes.markerSymbol, _c = attributes.markerSpacing, markerSpacing = _c === void 0 ? 0 : _c, _d = attributes.x, x = _d === void 0 ? 0 : _d, _e = attributes.y, y = _e === void 0 ? 0 : _e;
container.attr({
cursor: this.state === 'disabled' ? 'not-allowed' : 'pointer',
});
var _f = __read(parseSeriesAttr(padding), 4), pt = _f[0], pr = _f[1], pb = _f[2], pl = _f[3];
var height = this.buttonHeight;
var markerStyle = this.getStyle('marker');
var markerSize = this.markerSize;
var style = __assign(__assign({}, markerStyle), { symbol: markerSymbol, x: x + pl + markerSize / 2, y: y + height / 2, size: markerSize });
var markerShape = maybeAppend(container, '.marker', function () { return new Marker({ className: 'marker', style: style }); })
.update({ style: style })
.node();
var bounds = markerShape.getLocalBounds();
var textStyle = this.getStyle('text');
this.textShape = maybeAppend(container, '.text', 'text')
.attr('className', 'text')
.styles(__assign(__assign({ x: x + (markerSize ? bounds.max[0] + markerSpacing : pl), y: y + height / 2 }, textStyle), { text: text, textAlign: 'left', textBaseline: 'middle', wordWrap: true, wordWrapWidth: this.textAvailableWidth, maxLines: 1, textOverflow: '...' }))
.node();
var textBounds = this.textShape.getLocalBounds();
var buttonStyle = this.getStyle('button');
select(container)
.maybeAppendByClassName('.background', 'rect')
.styles(__assign(__assign({ zIndex: -1 }, buttonStyle), { x: x, y: y, height: height, width: pl + (markerSize ? markerSize + markerSpacing : 0) + textBounds.halfExtents[0] * 2 + pr }));
};
/**
* 组件的更新
*/
Button.prototype.update = function (attr) {
if (attr === void 0) { attr = {}; }
this.attr(deepMix({}, this.attributes, attr));
var state = this.attributes.state;
// 更新状态
this.state = state;
this.render(this.attributes, this);
};
/** 更新状态 (不需要走 update) */
Button.prototype.setState = function (state) {
this.update({ state: state });
};
Button.prototype.hide = function () {
// @ts-ignore
this.style.visibility = 'hidden';
};
Button.prototype.show = function () {
// @ts-ignore
this.style.visibility = 'visible';
};
Button.prototype.bindEvents = function () {
this.addEventListener('click', this.clickEvents);
this.addEventListener('mouseenter', this.mouseenterEvent);
this.addEventListener('mouseleave', this.mouseleaveEvent);
};
/**
* 组件类型
*/
Button.tag = 'button';
return Button;
}(Component));
export { Button };
//# sourceMappingURL=index.js.map