mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-16 10:58:30 -05:00
Save grid selection/vertical scroll when switching tabs (#3682)
This commit is contained in:
@@ -88,7 +88,8 @@ export class GridTableState extends Disposable {
|
|||||||
private _canBeMaximized: boolean;
|
private _canBeMaximized: boolean;
|
||||||
|
|
||||||
/* The top row of the current scroll */
|
/* The top row of the current scroll */
|
||||||
public scrollPosition = 0;
|
public scrollPositionY = 0;
|
||||||
|
public scrollPositionX = 0;
|
||||||
public selection: Slick.Range[];
|
public selection: Slick.Range[];
|
||||||
public activeCell: Slick.Cell;
|
public activeCell: Slick.Cell;
|
||||||
|
|
||||||
@@ -145,7 +146,7 @@ export class GridPanel extends ViewletPanel {
|
|||||||
super(options, keybindingService, contextMenuService, configurationService);
|
super(options, keybindingService, contextMenuService, configurationService);
|
||||||
this.splitView = new ScrollableSplitView(this.container, { enableResizing: false, verticalScrollbarVisibility: ScrollbarVisibility.Visible });
|
this.splitView = new ScrollableSplitView(this.container, { enableResizing: false, verticalScrollbarVisibility: ScrollbarVisibility.Visible });
|
||||||
this.splitView.onScroll(e => {
|
this.splitView.onScroll(e => {
|
||||||
if (this.state) {
|
if (this.state && this.splitView.length !== 0) {
|
||||||
this.state.scrollPosition = e;
|
this.state.scrollPosition = e;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -455,6 +456,7 @@ class GridTable<T> extends Disposable implements IView {
|
|||||||
});
|
});
|
||||||
this.dataProvider.dataRows = collection;
|
this.dataProvider.dataRows = collection;
|
||||||
this.table.updateRowCount();
|
this.table.updateRowCount();
|
||||||
|
this.setupState();
|
||||||
}
|
}
|
||||||
|
|
||||||
public onRemove() {
|
public onRemove() {
|
||||||
@@ -548,12 +550,18 @@ class GridTable<T> extends Disposable implements IView {
|
|||||||
});
|
});
|
||||||
|
|
||||||
this.table.grid.onScroll.subscribe((e, data) => {
|
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.scrolled = true;
|
||||||
this.table.grid.scrollTo(this.state.scrollPosition);
|
this.restoreScrollState();
|
||||||
}
|
}
|
||||||
if (this.state && isInDOM(this.container)) {
|
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.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() {
|
private setupState() {
|
||||||
@@ -572,20 +585,18 @@ class GridTable<T> extends Disposable implements IView {
|
|||||||
|
|
||||||
this._register(this.state.onCanBeMaximizedChange(this.rebuildActionBar, this));
|
this._register(this.state.onCanBeMaximizedChange(this.rebuildActionBar, this));
|
||||||
|
|
||||||
if (this.state.scrollPosition) {
|
this.restoreScrollState();
|
||||||
// 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.
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.state.selection) {
|
// Setting the active cell resets the selection so save it here
|
||||||
this.selectionModel.setSelectedRanges(this.state.selection);
|
let savedSelection = this.state.selection;
|
||||||
}
|
|
||||||
|
|
||||||
if (this.state.activeCell) {
|
if (this.state.activeCell) {
|
||||||
this.table.setActiveCell(this.state.activeCell.row, this.state.activeCell.cell);
|
this.table.setActiveCell(this.state.activeCell.row, this.state.activeCell.cell);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (savedSelection) {
|
||||||
|
this.selectionModel.setSelectedRanges(savedSelection);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public get state(): GridTableState {
|
public get state(): GridTableState {
|
||||||
|
|||||||
Reference in New Issue
Block a user