UNPKG

@visactor/vtable

Version:

canvas table width high performance

253 lines (237 loc) 11.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: !0 }), exports.getRowAtRelativePosition = exports.getColAtRelativePosition = exports.getCellAtRelativePosition = exports.computeTargetColByX = exports.computeTargetRowByY = exports.getTargetRowAtConsiderBottomFrozen = exports.getTargetColAtConsiderRightFrozen = exports.getTargetRowAt = exports.getTargetColAt = exports.getCellAt = exports.getColAt = exports.getRowAt = void 0; const tableHelper_1 = require("../tableHelper"); function getRowAt(absoluteY, _this) { var _a; const frozen = (0, tableHelper_1._getTargetFrozenRowAt)(_this, absoluteY); return frozen || (null !== (_a = getTargetRowAt(absoluteY, _this)) && void 0 !== _a ? _a : { top: -1, row: -1, bottom: -1, height: -1 }); } function getColAt(absoluteX, _this) { var _a; const frozen = (0, tableHelper_1._getTargetFrozenColAt)(_this, absoluteX); return frozen || (null !== (_a = getTargetColAt(absoluteX, _this)) && void 0 !== _a ? _a : { left: -1, col: -1, right: -1, width: 1 }); } function getCellAt(absoluteX, absoluteY, _this) { const rowInfo = getRowAt(absoluteY, _this), {row: row, top: top, bottom: bottom, height: height} = rowInfo, colInfo = getColAt(absoluteX, _this), {col: col, left: left, right: right, width: width} = colInfo; return { row: row, col: col, rect: { left: left, right: right, top: top, bottom: bottom, width: width, height: height } }; } function getTargetColAt(absoluteX, _this) { if (0 === absoluteX) return { left: 0, col: 0, right: 0, width: 0 }; const candCol = computeTargetColByX(absoluteX, _this), right = _this.getColsWidth(0, candCol); return absoluteX >= right ? ((startCol, startRight) => { let left = startRight - _this.getColWidth(startCol); const {colCount: colCount} = _this.internalProps; for (let col = startCol; col < colCount; col++) { const width = _this.getColWidth(col), right = left + width; if (Math.round(left) <= absoluteX && absoluteX < Math.round(right)) return { left: left, col: col, right: right, width: width }; left = right; } return null; })(candCol, right) : ((startCol, startRight) => { let right = startRight; for (let col = startCol; col >= 0; col--) { const width = _this.getColWidth(col), left = right - width; if (Math.round(left) <= absoluteX && absoluteX < Math.round(right)) return { left: left, col: col, right: right, width: width }; right = left; } return null; })(candCol, right); } function getTargetRowAt(absoluteY, _this) { var _a; if (0 === absoluteY) return { top: 0, row: 0, bottom: 0, height: 0 }; const floorOrRound = !0 === (null === (_a = _this.options.customConfig) || void 0 === _a ? void 0 : _a._disableColumnAndRowSizeRound) ? Math.floor : Math.round, candRow = computeTargetRowByY(absoluteY, _this), bottom = _this.getRowsHeight(0, candRow); return absoluteY >= bottom ? ((startRow, startBottom) => { let top = startBottom - _this.getRowHeight(startRow); const {rowCount: rowCount} = _this.internalProps; for (let row = startRow; row < rowCount; row++) { const height = _this.getRowHeight(row), bottom = top + height; if (floorOrRound(top) <= floorOrRound(absoluteY) && floorOrRound(absoluteY) < floorOrRound(bottom)) return { top: top, row: row, bottom: bottom, height: height }; top = bottom; } return null; })(candRow, bottom) : ((startRow, startBottom) => { let bottom = startBottom; for (let row = startRow; row >= 0; row--) { const height = _this.getRowHeight(row), top = bottom - height; if (floorOrRound(top) <= floorOrRound(absoluteY) && floorOrRound(absoluteY) < floorOrRound(bottom)) return { top: top, row: row, bottom: bottom, height: height }; bottom = top; } return null; })(candRow, bottom); } function getTargetColAtConsiderRightFrozen(absoluteX, isConsider, _this) { var _a, _b; if (0 === absoluteX) return { left: 0, col: 0, right: 0, width: 0 }; absoluteX -= _this.tableX; const rightFrozenScrollLeft = null !== (_b = null === (_a = _this.getRightFrozenColsScrollLeft) || void 0 === _a ? void 0 : _a.call(_this)) && void 0 !== _b ? _b : 0; if (isConsider && absoluteX > _this.tableNoFrameWidth - _this.getRightFrozenColsWidth() && absoluteX < _this.tableNoFrameWidth && absoluteX <= _this.getAllColsWidth()) { absoluteX -= rightFrozenScrollLeft; for (let i = 0; i < _this.rightFrozenColCount; i++) if (absoluteX > _this.tableNoFrameWidth - _this.getColsWidth(_this.colCount - i - 1, _this.colCount - 1)) return { col: _this.colCount - i - 1, left: void 0, right: void 0, width: void 0 }; } return getTargetColAt(absoluteX, _this); } function getTargetRowAtConsiderBottomFrozen(absoluteY, isConsider, _this) { if (0 === absoluteY) return { top: 0, row: 0, bottom: 0, height: 0 }; if (absoluteY -= _this.tableY, isConsider && absoluteY > _this.tableNoFrameHeight - _this.getBottomFrozenRowsHeight() && absoluteY < _this.tableNoFrameHeight) for (let i = 0; i < _this.rightFrozenColCount; i++) if (absoluteY > _this.tableNoFrameHeight - _this.getRowsHeight(_this.rowCount - i - 1, _this.rowCount - 1)) return { row: _this.rowCount - i - 1, top: void 0, bottom: void 0, height: void 0 }; return getTargetRowAt(absoluteY, _this); } function computeTargetRowByY(absoluteY, _this) { let defaultRowHeight = _this.defaultRowHeight; return _this._rowRangeHeightsMap.get("$0$" + (_this.rowCount - 1)) && (defaultRowHeight = _this._rowRangeHeightsMap.get("$0$" + (_this.rowCount - 1)) / _this.rowCount), Math.min(Math.ceil(absoluteY / defaultRowHeight), _this.rowCount - 1); } function computeTargetColByX(absoluteX, _this) { if (_this._colRangeWidthsMap.get("$0$" + (_this.colCount - 1))) { let startCol = 0, endCol = _this.colCount - 1; for (;endCol - startCol > 1; ) { const midCol = Math.floor((startCol + endCol) / 2); if (absoluteX < _this._colRangeWidthsMap.get(`$0$${midCol}`)) endCol = midCol; else { if (!(absoluteX > _this._colRangeWidthsMap.get(`$0$${midCol}`))) return midCol; startCol = midCol; } } return endCol; } return Math.min(Math.ceil(absoluteX / _this.internalProps.defaultColWidth), _this.colCount - 1); } function getCellAtRelativePosition(x, y, _this) { var _a, _b, _c, _d; x -= _this.tableX, y -= _this.tableY; const frozenColsWidth = _this.getFrozenColsWidth(), frozenColsOffset = null !== (_b = null === (_a = _this.getFrozenColsOffset) || void 0 === _a ? void 0 : _a.call(_this)) && void 0 !== _b ? _b : 0, frozenColsScrollLeft = null !== (_d = null === (_c = _this.getFrozenColsScrollLeft) || void 0 === _c ? void 0 : _c.call(_this)) && void 0 !== _d ? _d : 0; let topFrozen = !1; y > 0 && y < _this.getFrozenRowsHeight() && (topFrozen = !0); let leftFrozen = !1; x > 0 && x < frozenColsWidth && (leftFrozen = !0); let bottomFrozen = !1; y > _this.tableNoFrameHeight - _this.getBottomFrozenRowsHeight() && y < _this.tableNoFrameHeight && y <= _this.getAllRowsHeight() && (bottomFrozen = !0); let rightFrozen = !1; x > _this.tableNoFrameWidth - _this.getRightFrozenColsWidth() && x < _this.tableNoFrameWidth && x <= _this.getAllColsWidth() && (rightFrozen = !0); const colInfo = getTargetColAtConsiderRightFrozen((leftFrozen ? x + frozenColsScrollLeft : rightFrozen ? x : x + _this.scrollLeft + frozenColsOffset) + _this.tableX, rightFrozen, _this), rowInfo = getTargetRowAtConsiderBottomFrozen((topFrozen || bottomFrozen ? y : y + _this.scrollTop) + _this.tableY, bottomFrozen, _this); if (colInfo && rowInfo) { const {row: row, top: top, bottom: bottom, height: height} = rowInfo, {col: col, left: left, right: right, width: width} = colInfo; return { row: row, col: col, rect: { left: left, right: right, top: top, bottom: bottom, width: width, height: height } }; } return { col: -1, row: -1 }; } function getColAtRelativePosition(x, _this) { var _a, _b, _c, _d; x -= _this.tableX; const frozenColsWidth = _this.getFrozenColsWidth(), frozenColsOffset = null !== (_b = null === (_a = _this.getFrozenColsOffset) || void 0 === _a ? void 0 : _a.call(_this)) && void 0 !== _b ? _b : 0, frozenColsScrollLeft = null !== (_d = null === (_c = _this.getFrozenColsScrollLeft) || void 0 === _c ? void 0 : _c.call(_this)) && void 0 !== _d ? _d : 0; let leftFrozen = !1; x > 0 && x < frozenColsWidth && (leftFrozen = !0); let rightFrozen = !1; x > _this.tableNoFrameWidth - _this.getRightFrozenColsWidth() && x < _this.tableNoFrameWidth && x <= _this.getAllColsWidth() && (rightFrozen = !0); const colInfo = getTargetColAtConsiderRightFrozen((leftFrozen ? x + frozenColsScrollLeft : rightFrozen ? x : x + _this.scrollLeft + frozenColsOffset) + _this.tableX, rightFrozen, _this); if (colInfo) { const {col: col} = colInfo; return col; } return -1; } function getRowAtRelativePosition(y, _this) { let topFrozen = !1; (y -= _this.tableY) > 0 && y < _this.getFrozenRowsHeight() && (topFrozen = !0); let bottomFrozen = !1; y > _this.tableNoFrameHeight - _this.getBottomFrozenRowsHeight() && y < _this.tableNoFrameHeight && y <= _this.getAllRowsHeight() && (bottomFrozen = !0); const rowInfo = getTargetRowAtConsiderBottomFrozen((topFrozen || bottomFrozen ? y : y + _this.scrollTop) + _this.tableY, bottomFrozen, _this); if (rowInfo) { const {row: row} = rowInfo; return row; } return -1; } exports.getRowAt = getRowAt, exports.getColAt = getColAt, exports.getCellAt = getCellAt, exports.getTargetColAt = getTargetColAt, exports.getTargetRowAt = getTargetRowAt, exports.getTargetColAtConsiderRightFrozen = getTargetColAtConsiderRightFrozen, exports.getTargetRowAtConsiderBottomFrozen = getTargetRowAtConsiderBottomFrozen, exports.computeTargetRowByY = computeTargetRowByY, exports.computeTargetColByX = computeTargetColByX, exports.getCellAtRelativePosition = getCellAtRelativePosition, exports.getColAtRelativePosition = getColAtRelativePosition, exports.getRowAtRelativePosition = getRowAtRelativePosition; //# sourceMappingURL=get-cell-position.js.map