@antv/s2
Version:
effective spreadsheet render core lib
89 lines • 2.99 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.diffPanelIndexes = exports.diffIndexes = exports.allIndexes = exports.isXYInRange = void 0;
const lodash_1 = require("lodash");
/**
* 是否在 视窗索引范围中
* @param x
* @param y
* @param indexes
*/
const isXYInRange = (x, y, indexes) => {
const [xMin, xMax, yMin, yMax] = indexes;
return x >= xMin && x <= xMax && y >= yMin && y <= yMax;
};
exports.isXYInRange = isXYInRange;
const allIndexes = (indexes) => {
const [minI, maxI, minJ, maxJ] = indexes;
const r = [];
for (let i = minI; i <= maxI; i += 1) {
for (let j = minJ; j <= maxJ; j += 1) {
r.push([i, j]);
}
}
return r;
};
exports.allIndexes = allIndexes;
/**
* 计算两个 indexes 的 diff,获取 sourceIndexes -> targetIndexes 过程中新增的和移除的index
* @param sourceIndexes
* @param targetIndexes
*/
const diffIndexes = (sourceIndexes, targetIndexes) => {
const add = [];
const remove = [];
// source 为空
if ((0, lodash_1.isEmpty)(sourceIndexes)) {
if ((0, lodash_1.isEmpty)(targetIndexes)) {
// 都为空
return { add, remove };
}
// target 不为空
return { add: (0, exports.allIndexes)(targetIndexes), remove };
}
// source 不为空,target 为空
if ((0, lodash_1.isEmpty)(targetIndexes)) {
return { add, remove: (0, exports.allIndexes)(sourceIndexes) };
}
const [sourceMinI, sourceMaxI, sourceMinJ, sourceMaxJ] = sourceIndexes;
const [targetMinI, targetMaxI, targetMinJ, targetMaxJ] = targetIndexes;
// sourceIndexes -> targetIndexes 过程中,remove 掉的单元格
for (let i = sourceMinI; i <= sourceMaxI; i++) {
for (let j = sourceMinJ; j <= sourceMaxJ; j++) {
if (!(0, exports.isXYInRange)(i, j, targetIndexes)) {
remove.push([i, j]);
}
}
}
// sourceIndexes -> targetIndexes 过程中,add 新增的单元格
for (let i = targetMinI; i <= targetMaxI; i += 1) {
for (let j = targetMinJ; j <= targetMaxJ; j += 1) {
if (!(0, exports.isXYInRange)(i, j, sourceIndexes)) {
add.push([i, j]);
}
}
}
return {
add,
remove,
};
};
exports.diffIndexes = diffIndexes;
/**
* 计算 Panel 下所有子 Group的 Indexes Diff
*/
const diffPanelIndexes = (sourceIndexes, targetIndexes) => {
const allAdd = [];
const allRemove = [];
Object.keys(targetIndexes || {}).forEach((key) => {
const { add, remove } = (0, exports.diffIndexes)((sourceIndexes === null || sourceIndexes === void 0 ? void 0 : sourceIndexes[key]) || [], targetIndexes[key]);
allAdd.push(...add);
allRemove.push(...remove);
});
return {
add: allAdd,
remove: allRemove,
};
};
exports.diffPanelIndexes = diffPanelIndexes;
//# sourceMappingURL=indexes.js.map