Skip to content

Commit 48e368c

Browse files
committed
[FIX] Rendering: Skip hidden headers
Some functions in the renderer and sheetview plugins were iterating on every header from start to end regardeless of their visibility. In their context of use, we only care about visible headers (compute visible sizes or drawing them). closes #5605 closes #5623 Task: 4535794 X-original-commit: f3f7026 Signed-off-by: Rémi Rahir (rar) <[email protected]> Signed-off-by: Pierre Rousseau (pro) <[email protected]>
1 parent fc0aa2a commit 48e368c

File tree

2 files changed

+26
-26
lines changed

2 files changed

+26
-26
lines changed

src/plugins/ui_stateful/sheetview.ts

+14-12
Original file line numberDiff line numberDiff line change
@@ -422,21 +422,23 @@ export class SheetViewPlugin extends UIPlugin {
422422

423423
getColRowOffsetInViewport(
424424
dimension: Dimension,
425-
referenceIndex: HeaderIndex,
426-
index: HeaderIndex
425+
referenceHeaderIndex: HeaderIndex,
426+
targetHeaderIndex: HeaderIndex
427427
): Pixel {
428-
const sheetId = this.getters.getActiveSheetId();
429-
const visibleCols = this.getters.getSheetViewVisibleCols();
430-
const visibleRows = this.getters.getSheetViewVisibleRows();
431-
if (index < referenceIndex) {
432-
return -this.getColRowOffsetInViewport(dimension, index, referenceIndex);
428+
if (targetHeaderIndex < referenceHeaderIndex) {
429+
return -this.getColRowOffsetInViewport(dimension, targetHeaderIndex, referenceHeaderIndex);
433430
}
431+
432+
const sheetId = this.getters.getActiveSheetId();
433+
const visibleHeaders =
434+
dimension === "COL"
435+
? this.getters.getSheetViewVisibleCols()
436+
: this.getters.getSheetViewVisibleRows();
437+
const startIndex = visibleHeaders.findIndex((header) => referenceHeaderIndex >= header);
438+
const endIndex = visibleHeaders.findIndex((header) => targetHeaderIndex <= header);
439+
const relevantIndexes = visibleHeaders.slice(startIndex, endIndex);
434440
let offset = 0;
435-
const visibleIndexes = dimension === "COL" ? visibleCols : visibleRows;
436-
for (let i = referenceIndex; i < index; i++) {
437-
if (!visibleIndexes.includes(i)) {
438-
continue;
439-
}
441+
for (const i of relevantIndexes) {
440442
offset += this.getters.getHeaderSize(sheetId, dimension, i);
441443
}
442444
return offset;

src/stores/grid_renderer_store.ts

+12-14
Original file line numberDiff line numberDiff line change
@@ -395,10 +395,8 @@ export class GridRenderer {
395395
const { ctx, thinLineWidth } = renderingContext;
396396
const visibleCols = this.getters.getSheetViewVisibleCols();
397397
const left = visibleCols[0];
398-
const right = visibleCols[visibleCols.length - 1];
399398
const visibleRows = this.getters.getSheetViewVisibleRows();
400399
const top = visibleRows[0];
401-
const bottom = visibleRows[visibleRows.length - 1];
402400
const { width, height } = this.getters.getSheetViewDimensionWithHeaders();
403401
const selection = this.getters.getSelectedZones();
404402
const selectedCols = getZonesCols(selection);
@@ -416,7 +414,7 @@ export class GridRenderer {
416414
ctx.strokeStyle = "#333";
417415

418416
// Columns headers background
419-
for (let col = left; col <= right; col++) {
417+
for (const col of visibleCols) {
420418
const colZone = { left: col, right: col, top: 0, bottom: numberOfRows - 1 };
421419
const { x, width } = this.getters.getVisibleRect(colZone);
422420
const isColActive = activeCols.has(col);
@@ -432,7 +430,7 @@ export class GridRenderer {
432430
}
433431

434432
// Rows headers background
435-
for (let row = top; row <= bottom; row++) {
433+
for (const row of visibleRows) {
436434
const rowZone = { top: row, bottom: row, left: 0, right: numberOfCols - 1 };
437435
const { y, height } = this.getters.getVisibleRect(rowZone);
438436

@@ -460,22 +458,22 @@ export class GridRenderer {
460458
ctx.beginPath();
461459

462460
// column text + separator
463-
for (const i of visibleCols) {
464-
const colSize = this.getters.getColSize(sheetId, i);
465-
const colName = numberToLetters(i);
466-
ctx.fillStyle = activeCols.has(i) ? "#fff" : TEXT_HEADER_COLOR;
467-
let colStart = this.getHeaderOffset("COL", left, i);
461+
for (const col of visibleCols) {
462+
const colSize = this.getters.getColSize(sheetId, col);
463+
const colName = numberToLetters(col);
464+
ctx.fillStyle = activeCols.has(col) ? "#fff" : TEXT_HEADER_COLOR;
465+
let colStart = this.getHeaderOffset("COL", left, col);
468466
ctx.fillText(colName, colStart + colSize / 2, HEADER_HEIGHT / 2);
469467
ctx.moveTo(colStart + colSize, 0);
470468
ctx.lineTo(colStart + colSize, HEADER_HEIGHT);
471469
}
472470
// row text + separator
473-
for (const i of visibleRows) {
474-
const rowSize = this.getters.getRowSize(sheetId, i);
475-
ctx.fillStyle = activeRows.has(i) ? "#fff" : TEXT_HEADER_COLOR;
471+
for (const row of visibleRows) {
472+
const rowSize = this.getters.getRowSize(sheetId, row);
473+
ctx.fillStyle = activeRows.has(row) ? "#fff" : TEXT_HEADER_COLOR;
476474

477-
let rowStart = this.getHeaderOffset("ROW", top, i);
478-
ctx.fillText(String(i + 1), HEADER_WIDTH / 2, rowStart + rowSize / 2);
475+
let rowStart = this.getHeaderOffset("ROW", top, row);
476+
ctx.fillText(String(row + 1), HEADER_WIDTH / 2, rowStart + rowSize / 2);
479477
ctx.moveTo(0, rowStart + rowSize);
480478
ctx.lineTo(HEADER_WIDTH, rowStart + rowSize);
481479
}

0 commit comments

Comments
 (0)