@visactor/vgrammar-core
Version:
VGrammar is a visual grammar library
64 lines (57 loc) • 3.2 kB
JavaScript
import { isContinuous } from "@visactor/vscale";
import { ComponentEnum } from "../graph/enums";
export const getRangeOfLinkedComponent = comp => {
if (comp.componentType === ComponentEnum.datazoom) {
const res = comp.getStartEndValue();
return res ? [ res.start, res.end ] : null;
}
return comp.getScrollRange();
};
export const getBoundsRangeOfLinkedComponent = (comp, dim) => {
const bounds = comp.getBounds();
if (bounds && !bounds.empty()) return "y" === dim ? [ bounds.y1, bounds.y2 ] : [ bounds.x1, bounds.x2 ];
};
export const getFilteredValuesFromScale = (scale, range) => {
const scaleRange = scale.range(), startPos = scaleRange[0] + (scaleRange[1] - scaleRange[0]) * range[0], endPos = scaleRange[0] + (scaleRange[1] - scaleRange[0]) * range[1];
if (isContinuous(scale.type)) {
const startValue = scale.invert(startPos), endValue = scale.invert(endPos);
return [ Math.min(startValue, endValue), Math.max(startValue, endValue) ];
}
return scale.domain().filter((entry => {
const val = scale.scale(entry);
return val >= startPos && val <= endPos;
}));
};
export const updateScrollRange = (rangeFactor = [ 0, 1 ], range, scrollValue = 0, scrollOptions) => {
if (Math.abs(scrollValue) < .001) return;
if (Math.abs(rangeFactor[1] - rangeFactor[0]) >= 1) return;
const size = Math.abs(range[range.length - 1] - range[0]);
if (size <= 0 || Number.isNaN(size)) return;
const value = (scrollOptions.reversed ? -1 : 1) * scrollValue;
if (value > 0 && rangeFactor[1] < 1) {
const delta = Math.min(1 - rangeFactor[1], value / size);
return [ rangeFactor[0] + delta, rangeFactor[1] + delta ];
}
if (value < 0 && rangeFactor[0] > 0) {
const delta = Math.max(-rangeFactor[0], value / size);
return [ rangeFactor[0] + delta, rangeFactor[1] + delta ];
}
};
export const handleScrolling = (scrollPos, navState, scrollOptions) => {
const res = {
needUpdate: !1
};
return navState ? (Object.keys(navState).forEach((dim => {
const {scale: scale, data: data, linkedComponent: linkedComponent, rangeFactor: rangeFactor, getCurrentRange: getCurrentRange} = navState[dim];
if (linkedComponent) res[dim] = updateScrollRange(getRangeOfLinkedComponent(linkedComponent), getBoundsRangeOfLinkedComponent(linkedComponent, dim), scrollPos[dim], scrollOptions); else if (scale) {
const innerScale = scale.getScale(), oldRange = scale.getRangeFactor() || rangeFactor, newRange = updateScrollRange(oldRange, innerScale.range(), scrollPos[dim], scrollOptions);
newRange && (navState[dim].rangeFactor = newRange, data ? (navState[dim].filterValue = newRange,
data.commit()) : (scale.setRangeFactor(newRange), scale.commit()), res.needUpdate = !0,
res[dim] = newRange);
} else {
const oldRange = (getCurrentRange ? getCurrentRange() : rangeFactor) || [ 0, 1 ], newRange = updateScrollRange(oldRange, [ 0, 1 ], scrollPos[dim], scrollOptions);
res[dim] = newRange || oldRange;
}
})), res) : res;
};
//# sourceMappingURL=view-utils.js.map