From e0978e3e21e7e6c666ffd990ee5be8409b00a40b Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 12 Dec 2017 12:09:13 +0100 Subject: [PATCH] #37189 - Fix remembering view sizes when a view is hidden and shown --- .../browser/parts/views/viewsViewlet.ts | 70 +++++++++---------- 1 file changed, 34 insertions(+), 36 deletions(-) diff --git a/src/vs/workbench/browser/parts/views/viewsViewlet.ts b/src/vs/workbench/browser/parts/views/viewsViewlet.ts index cd2d2213b2d..afb99b00024 100644 --- a/src/vs/workbench/browser/parts/views/viewsViewlet.ts +++ b/src/vs/workbench/browser/parts/views/viewsViewlet.ts @@ -289,7 +289,7 @@ export class ViewsViewlet extends PanelViewlet { async create(parent: Builder): TPromise { await super.create(parent); - this._register(this.onDidSashChange(() => this.updateAllViewsSizes())); + this._register(this.onDidSashChange(() => this.snapshotViewsStates())); this._register(ViewsRegistry.onViewsRegistered(this.onViewsRegistered, this)); this._register(ViewsRegistry.onViewsDeregistered(this.onViewsDeregistered, this)); this._register(this.contextKeyService.onDidChangeContext(this.onContextChanged, this)); @@ -326,12 +326,13 @@ export class ViewsViewlet extends PanelViewlet { layout(dimension: Dimension): void { super.layout(dimension); - if (!this.didLayout) { + if (this.didLayout) { + this.snapshotViewsStates(); + } else { this.didLayout = true; - this._resizePanels(); + this.resizePanels(); } - this.updateAllViewsSizes(); } getOptimalWidth(): number { @@ -357,7 +358,7 @@ export class ViewsViewlet extends PanelViewlet { viewState = viewState || this.createViewState(view); viewState.isHidden = true; } else { - viewState = viewState || { collapsed: true, size: void 0, isHidden: false, order: void 0 }; + viewState = viewState || { collapsed: true, size: 200, isHidden: false, order: void 0 }; viewState.isHidden = false; } this.viewsStates.set(id, viewState); @@ -414,19 +415,12 @@ export class ViewsViewlet extends PanelViewlet { const toCreate: ViewsViewletPanel[] = []; if (toAdd.length || toRemove.length) { - const panels = [...this.viewsViewletPanels]; - for (const view of panels) { - let viewState = this.viewsStates.get(view.id); - if (!viewState || typeof viewState.size === 'undefined' || !view.isExpanded() !== viewState.collapsed) { - this.updateViewStateSize(view); - } - } + this.snapshotViewsStates(); if (toRemove.length) { for (const viewDescriptor of toRemove) { let view = this.getView(viewDescriptor.id); - this.updateViewStateSize(view); this.removePanel(view); this.viewsViewletPanels.splice(this.viewsViewletPanels.indexOf(view), 1); } @@ -448,35 +442,33 @@ export class ViewsViewlet extends PanelViewlet { const size = (viewState && viewState.size) || viewDescriptor.size || 200; this.addPanel(view, size, index); this.viewsViewletPanels.splice(index, 0, view); - - this.updateViewStateSize(view); } return TPromise.join(toCreate.map(view => view.create())) .then(() => this.onViewsUpdated()) - .then(() => this._resizePanels()) - .then(() => toCreate); + .then(() => { + this.resizePanels(toCreate); + return toCreate; + }); } return TPromise.as([]); } - private updateAllViewsSizes(): void { - for (const view of this.viewsViewletPanels) { - this.updateViewStateSize(view); - } - } - - private _resizePanels(): void { + private resizePanels(panels: ViewsViewletPanel[] = this.viewsViewletPanels): void { if (!this.didLayout) { + // Do not do anything if layout has not happened yet return; } - for (const panel of this.viewsViewletPanels) { + for (const panel of panels) { const viewState = this.viewsStates.get(panel.id); - const size = (viewState && viewState.size) || 200; + const viewDescriptor = this.getViewDescriptorsFromRegistry().filter(viewDescriptor => viewDescriptor.id === panel.id)[0]; + const size = (viewState && viewState.size) || viewDescriptor.size || 200; this.resizePanel(panel, size); } + + this.snapshotViewsStates(); } movePanel(from: ViewletPanel, to: ViewletPanel): void { @@ -616,22 +608,28 @@ export class ViewsViewlet extends PanelViewlet { return this.viewsViewletPanels.filter(view => view.id === id)[0]; } - private updateViewStateSize(view: ViewsViewletPanel): void { - const currentState = this.viewsStates.get(view.id); - if (currentState && !this.didLayout) { - // Do not update to new state if the layout has not happened yet - return; - } + private snapshotViewsStates(): void { + for (const view of this.viewsViewletPanels) { + const currentState = this.viewsStates.get(view.id); + if (currentState && !this.didLayout) { + // Do not update to new state if the layout has not happened yet + return; + } - const newViewState = this.createViewState(view); - const stateToUpdate = currentState ? { ...currentState, collapsed: newViewState.collapsed, size: newViewState.size } : newViewState; - this.viewsStates.set(view.id, stateToUpdate); + const newViewState = this.createViewState(view); + if (currentState) { + newViewState.isHidden = currentState.isHidden; + newViewState.size = newViewState.collapsed ? currentState.size : newViewState.size; + } + this.viewsStates.set(view.id, newViewState); + } } protected createViewState(view: ViewsViewletPanel): IViewState { + const viewDescriptor = this.getViewDescriptorsFromRegistry().filter(viewDescriptor => viewDescriptor.id === view.id)[0]; return { collapsed: !view.isExpanded(), - size: this.getPanelSize(view), + size: this.didLayout ? this.getPanelSize(view) : viewDescriptor.size || 200, // Take the default value incase of layout not happened yet. isHidden: false, order: this.viewsViewletPanels.indexOf(view) };