From 90787304bb342a84ade5d4bbbee9063ef8eb712c Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 17 Oct 2023 01:49:18 +0200 Subject: [PATCH] make visibility workspace state (#195739) --- .../parts/activitybar/activitybarPart.ts | 2 + .../parts/auxiliarybar/auxiliaryBarPart.ts | 2 + .../browser/parts/paneCompositeBar.ts | 55 ++++++++++++++++++- .../browser/parts/panel/panelPart.ts | 1 + .../browser/parts/sidebar/sidebarPart.ts | 1 + 5 files changed, 58 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts index 13f0980b69c..d0182c35883 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts @@ -46,6 +46,7 @@ export class ActivitybarPart extends Part { static readonly pinnedViewContainersKey = 'workbench.activity.pinnedViewlets2'; static readonly placeholderViewContainersKey = 'workbench.activity.placeholderViewlets'; + static readonly viewContainersWorkspaceStateKey = 'workbench.activity.viewletsWorkspaceState'; //#region IView @@ -74,6 +75,7 @@ export class ActivitybarPart extends Part { partContainerClass: 'activitybar', pinnedViewContainersKey: ActivitybarPart.pinnedViewContainersKey, placeholderViewContainersKey: ActivitybarPart.placeholderViewContainersKey, + viewContainersWorkspaceStateKey: ActivitybarPart.viewContainersWorkspaceStateKey, orientation: ActionsOrientation.VERTICAL, icon: true, iconSize: 24, diff --git a/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart.ts b/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart.ts index e6bd36f86c6..a574fdae744 100644 --- a/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart.ts +++ b/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart.ts @@ -34,6 +34,7 @@ export class AuxiliaryBarPart extends AbstractPaneCompositePart { static readonly activePanelSettingsKey = 'workbench.auxiliarybar.activepanelid'; static readonly pinnedPanelsKey = 'workbench.auxiliarybar.pinnedPanels'; static readonly placeholdeViewContainersKey = 'workbench.auxiliarybar.placeholderPanels'; + static readonly viewContainersWorkspaceStateKey = 'workbench.auxiliarybar.viewContainersWorkspaceState'; // Use the side bar dimensions override readonly minimumWidth: number = 170; @@ -127,6 +128,7 @@ export class AuxiliaryBarPart extends AbstractPaneCompositePart { partContainerClass: 'auxiliarybar', pinnedViewContainersKey: AuxiliaryBarPart.pinnedPanelsKey, placeholderViewContainersKey: AuxiliaryBarPart.placeholdeViewContainersKey, + viewContainersWorkspaceStateKey: AuxiliaryBarPart.viewContainersWorkspaceStateKey, icon: true, orientation: ActionsOrientation.HORIZONTAL, recomputeSizes: true, diff --git a/src/vs/workbench/browser/parts/paneCompositeBar.ts b/src/vs/workbench/browser/parts/paneCompositeBar.ts index 6c1286bc2b0..73d02bedaad 100644 --- a/src/vs/workbench/browser/parts/paneCompositeBar.ts +++ b/src/vs/workbench/browser/parts/paneCompositeBar.ts @@ -38,6 +38,7 @@ interface IPlaceholderViewContainer { readonly themeIcon?: ThemeIcon; readonly isBuiltin?: boolean; readonly views?: { when?: string }[]; + // TODO @sandy081: Remove this after a while. Migrated to visible in IViewContainerWorkspaceState readonly visible?: boolean; } @@ -45,7 +46,12 @@ interface IPinnedViewContainer { readonly id: string; readonly pinned: boolean; readonly order?: number; - // TODO @sandy081: Remove this after a while. Migrated to visible in IPlaceholderViewContainer + // TODO @sandy081: Remove this after a while. Migrated to visible in IViewContainerWorkspaceState + readonly visible: boolean; +} + +interface IViewContainerWorkspaceState { + readonly id: string; readonly visible: boolean; } @@ -64,6 +70,7 @@ export interface IPaneCompositeBarOptions { readonly partContainerClass: string; readonly pinnedViewContainersKey: string; readonly placeholderViewContainersKey: string; + readonly viewContainersWorkspaceStateKey: string; readonly icon: boolean; readonly compact?: boolean; readonly iconSize: number; @@ -554,6 +561,12 @@ export class PaneCompositeBar extends Disposable { cachedViewContainer.isBuiltin = placeholderViewContainer.isBuiltin; } } + for (const viewContainerWorkspaceState of this.getViewContainersWorkspaceState()) { + const cachedViewContainer = this._cachedViewContainers.find(cached => cached.id === viewContainerWorkspaceState.id); + if (cachedViewContainer) { + cachedViewContainer.visible = viewContainerWorkspaceState.visible ?? cachedViewContainer.visible; + } + } } return this._cachedViewContainers; @@ -568,15 +581,19 @@ export class PaneCompositeBar extends Disposable { order }))); - this.setPlaceholderViewContainers(cachedViewContainers.map(({ id, icon, name, views, visible, isBuiltin }) => ({ + this.setPlaceholderViewContainers(cachedViewContainers.map(({ id, icon, name, views, isBuiltin }) => ({ id, iconUrl: URI.isUri(icon) ? icon : undefined, themeIcon: ThemeIcon.isThemeIcon(icon) ? icon : undefined, name, isBuiltin, - visible, views }))); + + this.setViewContainersWorkspaceState(cachedViewContainers.map(({ id, visible }) => ({ + id, + visible, + }))); } private getPinnedViewContainers(): IPinnedViewContainer[] { @@ -642,6 +659,38 @@ export class PaneCompositeBar extends Disposable { private setStoredPlaceholderViewContainersValue(value: string): void { this.storageService.store(this.options.placeholderViewContainersKey, value, StorageScope.PROFILE, StorageTarget.MACHINE); } + + private getViewContainersWorkspaceState(): IViewContainerWorkspaceState[] { + return JSON.parse(this.viewContainersWorkspaceStateValue); + } + + private setViewContainersWorkspaceState(viewContainersWorkspaceState: IViewContainerWorkspaceState[]): void { + this.viewContainersWorkspaceStateValue = JSON.stringify(viewContainersWorkspaceState); + } + + private _viewContainersWorkspaceStateValue: string | undefined; + private get viewContainersWorkspaceStateValue(): string { + if (!this._viewContainersWorkspaceStateValue) { + this._viewContainersWorkspaceStateValue = this.getStoredViewContainersWorkspaceStateValue(); + } + + return this._viewContainersWorkspaceStateValue; + } + + private set viewContainersWorkspaceStateValue(viewContainersWorkspaceStateValue: string) { + if (this.viewContainersWorkspaceStateValue !== viewContainersWorkspaceStateValue) { + this._viewContainersWorkspaceStateValue = viewContainersWorkspaceStateValue; + this.setStoredViewContainersWorkspaceStateValue(viewContainersWorkspaceStateValue); + } + } + + private getStoredViewContainersWorkspaceStateValue(): string { + return this.storageService.get(this.options.viewContainersWorkspaceStateKey, StorageScope.WORKSPACE, '[]'); + } + + private setStoredViewContainersWorkspaceStateValue(value: string): void { + this.storageService.store(this.options.viewContainersWorkspaceStateKey, value, StorageScope.WORKSPACE, StorageTarget.MACHINE); + } } class ViewContainerActivityAction extends CompositeBarAction { diff --git a/src/vs/workbench/browser/parts/panel/panelPart.ts b/src/vs/workbench/browser/parts/panel/panelPart.ts index cd158dfcdba..aa0cba7df12 100644 --- a/src/vs/workbench/browser/parts/panel/panelPart.ts +++ b/src/vs/workbench/browser/parts/panel/panelPart.ts @@ -120,6 +120,7 @@ export class PanelPart extends AbstractPaneCompositePart { partContainerClass: 'panel', pinnedViewContainersKey: 'workbench.panel.pinnedPanels', placeholderViewContainersKey: 'workbench.panel.placeholderPanels', + viewContainersWorkspaceStateKey: 'workbench.panel.viewContainersWorkspaceState', icon: false, orientation: ActionsOrientation.HORIZONTAL, recomputeSizes: true, diff --git a/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts b/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts index 17a010dfad8..fd1aaa43fb2 100644 --- a/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts +++ b/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts @@ -165,6 +165,7 @@ export class SidebarPart extends AbstractPaneCompositePart { partContainerClass: 'sidebar', pinnedViewContainersKey: ActivitybarPart.pinnedViewContainersKey, placeholderViewContainersKey: ActivitybarPart.placeholderViewContainersKey, + viewContainersWorkspaceStateKey: ActivitybarPart.viewContainersWorkspaceStateKey, icon: true, orientation: ActionsOrientation.HORIZONTAL, recomputeSizes: true,