ScrollView: refactor getScrollPosForColumn

This commit is contained in:
Peter Fajdiga
2023-07-07 12:31:43 +02:00
parent 68d2c5bbd8
commit fa17b1fcc2

View File

@@ -34,21 +34,32 @@ class ScrollView {
// calculates ScrollPos that scrolls the column into view // calculates ScrollPos that scrolls the column into view
public getScrollPosForColumn(column: Column) { public getScrollPosForColumn(column: Column) {
const left = this.gridToTilingSpace(column.getLeft()); const left = column.getLeft();
const right = this.gridToTilingSpace(column.getRight()); const right = column.getRight();
let scrollPos: ScrollPos; const initialScrollPos = this.getCurrentScrollPos();
if (left < 0) {
scrollPos = this.getScrollPos(this.clampScrollX(this.scrollX + left)); let targetScrollX: number;
} else if (right > this.tilingArea.width) { if (left < initialScrollPos.left) {
scrollPos = this.getScrollPos(this.clampScrollX(this.scrollX + right - this.tilingArea.width)); targetScrollX = this.clampScrollX(left);
} else if (right > initialScrollPos.right) {
targetScrollX = this.clampScrollX(right - this.tilingArea.width);
} else { } else {
return this.getScrollPos(this.clampScrollX(this.scrollX)); return this.getScrollPos(this.clampScrollX(this.scrollX));
} }
const remainingSpace = this.tilingArea.width - this.grid.getVisibleColumnsWidth(scrollPos, true); const overscroll = this.getTargetOverscroll(targetScrollX, left < initialScrollPos.left);
const overScrollX = Math.min(this.world.config.overscroll, Math.round(remainingSpace / 2)); return this.getScrollPos(this.clampScrollX(targetScrollX + overscroll));
const direction = left < 0 ? -1 : 1; }
return this.getScrollPos(this.clampScrollX(scrollPos.left + overScrollX * direction));
private getTargetOverscroll(targetScrollX: number, scrollLeft: boolean) {
if (this.world.config.overscroll === 0) {
return 0;
}
const visibleColumnsWidth = this.grid.getVisibleColumnsWidth(this.getScrollPos(targetScrollX), true);
const remainingSpace = this.tilingArea.width - visibleColumnsWidth;
const overscrollX = Math.min(this.world.config.overscroll, Math.round(remainingSpace / 2));
const direction = scrollLeft ? -1 : 1;
return overscrollX * direction;
} }
scrollToColumn(column: Column) { scrollToColumn(column: Column) {