@visactor/vgrammar-core
Version:
VGrammar is a visual grammar library
89 lines (82 loc) • 5.37 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: !0
}), exports.registerIntervalMark = exports.Interval = void 0;
const vscale_1 = require("@visactor/vscale"), enums_1 = require("../graph/enums"), encode_1 = require("../graph/mark/encode"), mark_1 = require("../parse/mark"), util_1 = require("../parse/util"), mark_2 = require("../view/mark"), vutils_1 = require("@visactor/vutils"), graphic_1 = require("../graph/util/graphic"), transform_1 = require("../graph/attributes/transform"), factory_1 = require("../core/factory");
class Interval extends mark_2.Mark {
encodeState(state, channel, value) {
return super.encodeState(state, channel, value), this._updateComponentEncoders(state),
this;
}
_updateComponentEncoders(state) {
this._encoders || (this._encoders = {});
const userEncoder = this.spec.encode[state];
if (userEncoder && "update" === state) {
const params = this.parameters(), scales = (0, util_1.isFunctionType)(userEncoder) ? null : Object.keys(userEncoder).reduce(((res, channel) => ((0,
mark_1.isScaleEncode)(userEncoder[channel]) && (res[channel] = (0, util_1.getGrammarOutput)(userEncoder[channel].scale, params)),
res)), {});
this._encoders[state] = {
callback: (datum, element, parameters) => {
var _a, _b, _c;
const userEncodeRes = (0, encode_1.invokeEncoder)(userEncoder, datum, element, parameters);
if (this.disableCoordinateTransform = !1, scales && scales.x && scales.x.type === vscale_1.ScaleEnum.Band) {
if (!(0, vutils_1.isNil)(scales.y)) {
const domain = scales.y.domain(), min = (0, vutils_1.minInArray)(domain), max = (0,
vutils_1.maxInArray)(domain), baseValue = min > 0 ? min : max < 0 ? max : 0;
userEncodeRes.y1 = scales.y.scale(baseValue);
}
const bandWidth = scales.x.bandwidth();
userEncodeRes.x = userEncodeRes.x + bandWidth / 4, userEncodeRes.x1 = userEncodeRes.x + bandWidth / 2;
} else if (scales && scales.y && scales.y.type === vscale_1.ScaleEnum.Band) {
if (!(0, vutils_1.isNil)(scales.x)) {
const domain = scales.x.domain(), min = (0, vutils_1.minInArray)(domain), max = (0,
vutils_1.maxInArray)(domain), baseValue = min > 0 ? min : max < 0 ? max : 0;
userEncodeRes.x1 = scales.x.scale(baseValue);
}
const bandWidth = scales.y.bandwidth();
userEncodeRes.y = userEncodeRes.y + bandWidth / 4, userEncodeRes.y1 = userEncodeRes.y + bandWidth / 2;
}
if (scales) {
const coord = (null !== (_b = this.view.getScaleById(null === (_a = userEncoder.x) || void 0 === _a ? void 0 : _a.scale)) && void 0 !== _b ? _b : this.view.getScaleById(null === (_c = userEncoder.y) || void 0 === _c ? void 0 : _c.scale)).getCoordinate();
if (coord && "polar" === coord.type) {
this.disableCoordinateTransform = !0;
const origin = coord.origin();
userEncodeRes.cx = origin.x, userEncodeRes.cy = origin.y;
}
}
return userEncodeRes;
}
};
} else this._encoders[state] = userEncoder;
}
_getEncoders() {
var _a;
return null !== (_a = this._encoders) && void 0 !== _a ? _a : {};
}
getAttributeTransforms() {
return this.coord && "polar" === this.coord.output().type ? [ {
channels: [ "x", "y", "x1", "y1", "cx", "cy" ],
transform: (graphicAttributes, nextAttrs, storedAttrs) => {
graphicAttributes.x = storedAttrs.cx, graphicAttributes.y = storedAttrs.cy, this.coord.output().isTransposed() ? (graphicAttributes.startAngle = storedAttrs.y,
graphicAttributes.endAngle = storedAttrs.y1, graphicAttributes.innerRadius = storedAttrs.x,
graphicAttributes.outerRadius = storedAttrs.x1) : (graphicAttributes.startAngle = storedAttrs.x,
graphicAttributes.endAngle = storedAttrs.x1, graphicAttributes.innerRadius = storedAttrs.y,
graphicAttributes.outerRadius = storedAttrs.y1);
},
storedAttrs: "sizeAttrs"
} ] : transform_1.transformsByType.rect;
}
addGraphicItem(attrs, groupKey) {
const graphicItem = (0, graphic_1.createGraphicItem)(this, this.coord && "polar" === this.coord.output().type ? enums_1.GrammarMarkType.arc : enums_1.GrammarMarkType.rect, attrs);
return super.addGraphicItem(attrs, groupKey, graphicItem);
}
release() {
super.release(), this._encoders = null;
}
}
exports.Interval = Interval, Interval.markType = enums_1.GrammarMarkType.interval;
const registerIntervalMark = () => {
factory_1.Factory.registerMark(enums_1.GrammarMarkType.interval, Interval);
};
exports.registerIntervalMark = registerIntervalMark;
//# sourceMappingURL=interval.js.map