Save grid selection/vertical scroll when switching tabs (#3682)

This commit is contained in:
Matt Irvine
2019-01-08 15:51:57 -08:00
committed by GitHub
parent 2235ebaf20
commit ee87604a4d

View File

@@ -88,7 +88,8 @@ export class GridTableState extends Disposable {
private _canBeMaximized: boolean;
/* The top row of the current scroll */
public scrollPosition = 0;
public scrollPositionY = 0;
public scrollPositionX = 0;
public selection: Slick.Range[];
public activeCell: Slick.Cell;
@@ -145,7 +146,7 @@ export class GridPanel extends ViewletPanel {
super(options, keybindingService, contextMenuService, configurationService);
this.splitView = new ScrollableSplitView(this.container, { enableResizing: false, verticalScrollbarVisibility: ScrollbarVisibility.Visible });
this.splitView.onScroll(e => {
if (this.state) {
if (this.state && this.splitView.length !== 0) {
this.state.scrollPosition = e;
}
});
@@ -455,6 +456,7 @@ class GridTable<T> extends Disposable implements IView {
});
this.dataProvider.dataRows = collection;
this.table.updateRowCount();
this.setupState();
}
public onRemove() {
@@ -548,12 +550,18 @@ class GridTable<T> extends Disposable implements IView {
});
this.table.grid.onScroll.subscribe((e, data) => {
if (!this.scrolled && this.state.scrollPosition && isInDOM(this.container)) {
if (!this.visible) {
// If the grid is not set up yet it can get scroll events resetting the top to 0px,
// so ignore those events
return;
}
if (!this.scrolled && (this.state.scrollPositionY || this.state.scrollPositionX) && isInDOM(this.container)) {
this.scrolled = true;
this.table.grid.scrollTo(this.state.scrollPosition);
this.restoreScrollState();
}
if (this.state && isInDOM(this.container)) {
this.state.scrollPosition = data.scrollTop;
this.state.scrollPositionY = data.scrollTop;
this.state.scrollPositionX = data.scrollLeft;
}
});
@@ -562,8 +570,13 @@ class GridTable<T> extends Disposable implements IView {
this.state.activeCell = this.table.grid.getActiveCell();
}
});
}
this.setupState();
private restoreScrollState() {
if (this.state.scrollPositionX || this.state.scrollPositionY) {
this.table.grid.scrollTo(this.state.scrollPositionY);
this.table.grid.getContainerNode().children[3].scrollLeft = this.state.scrollPositionX;
}
}
private setupState() {
@@ -572,20 +585,18 @@ class GridTable<T> extends Disposable implements IView {
this._register(this.state.onCanBeMaximizedChange(this.rebuildActionBar, this));
if (this.state.scrollPosition) {
// most of the time this won't do anything
this.table.grid.scrollTo(this.state.scrollPosition);
// the problem here is that the scrolling state slickgrid uses
// doesn't work with it offDOM.
}
this.restoreScrollState();
if (this.state.selection) {
this.selectionModel.setSelectedRanges(this.state.selection);
}
// Setting the active cell resets the selection so save it here
let savedSelection = this.state.selection;
if (this.state.activeCell) {
this.table.setActiveCell(this.state.activeCell.row, this.state.activeCell.cell);
}
if (savedSelection) {
this.selectionModel.setSelectedRanges(savedSelection);
}
}
public get state(): GridTableState {