|
| 1 | +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
| 2 | +From: =?UTF-8?q?Lo=C3=AFc=20Mangeonjean?= <loic@coderpad.io> |
| 3 | +Date: Fri, 19 Dec 2025 15:03:37 +0100 |
| 4 | +Subject: [PATCH] feat: support disabling view containers |
| 5 | + |
| 6 | +--- |
| 7 | + src/vs/workbench/browser/parts/paneCompositeBar.ts | 7 ++----- |
| 8 | + src/vs/workbench/common/views.ts | 3 +++ |
| 9 | + .../workbench/services/views/browser/viewsService.ts | 4 ++++ |
| 10 | + .../services/views/common/viewContainerModel.ts | 11 +++++++++++ |
| 11 | + 4 files changed, 20 insertions(+), 5 deletions(-) |
| 12 | + |
| 13 | +diff --git a/src/vs/workbench/browser/parts/paneCompositeBar.ts b/src/vs/workbench/browser/parts/paneCompositeBar.ts |
| 14 | +index b26b6c55177..2b4d8a6bf96 100644 |
| 15 | +--- a/src/vs/workbench/browser/parts/paneCompositeBar.ts |
| 16 | ++++ b/src/vs/workbench/browser/parts/paneCompositeBar.ts |
| 17 | +@@ -359,6 +359,7 @@ export class PaneCompositeBar extends Disposable { |
| 18 | + const disposables = new DisposableStore(); |
| 19 | + disposables.add(viewContainerModel.onDidChangeContainerInfo(() => this.updateCompositeBarActionItem(viewContainer, viewContainerModel))); |
| 20 | + disposables.add(viewContainerModel.onDidChangeActiveViewDescriptors(() => this.showOrHideViewContainer(viewContainer))); |
| 21 | ++ disposables.add(viewContainerModel.onDidChangeEnablement(() => this.showOrHideViewContainer(viewContainer))); |
| 22 | + |
| 23 | + this.viewContainerDisposables.set(viewContainer.id, disposables); |
| 24 | + } |
| 25 | +@@ -436,11 +437,7 @@ export class PaneCompositeBar extends Disposable { |
| 26 | + const viewContainerId = isString(viewContainerOrId) ? viewContainerOrId : viewContainerOrId.id; |
| 27 | + |
| 28 | + if (viewContainer) { |
| 29 | +- if (viewContainer.hideIfEmpty) { |
| 30 | +- if (this.viewService.isViewContainerActive(viewContainerId)) { |
| 31 | +- return false; |
| 32 | +- } |
| 33 | +- } else { |
| 34 | ++ if (this.viewService.isViewContainerActive(viewContainerId)) { |
| 35 | + return false; |
| 36 | + } |
| 37 | + } |
| 38 | +diff --git a/src/vs/workbench/common/views.ts b/src/vs/workbench/common/views.ts |
| 39 | +index 9c60b15706c..5498bc9a0f5 100644 |
| 40 | +--- a/src/vs/workbench/common/views.ts |
| 41 | ++++ b/src/vs/workbench/common/views.ts |
| 42 | +@@ -121,6 +121,8 @@ export interface IViewContainerDescriptor { |
| 43 | + |
| 44 | + readonly rejectAddedViews?: boolean; |
| 45 | + |
| 46 | ++ readonly when?: ContextKeyExpression; |
| 47 | ++ |
| 48 | + requestedIndex?: number; |
| 49 | + } |
| 50 | + |
| 51 | +@@ -344,6 +346,7 @@ export interface IViewContainerModel { |
| 52 | + readonly onDidAddVisibleViewDescriptors: Event<IAddedViewDescriptorRef[]>; |
| 53 | + readonly onDidRemoveVisibleViewDescriptors: Event<IViewDescriptorRef[]>; |
| 54 | + readonly onDidMoveVisibleViewDescriptors: Event<{ from: IViewDescriptorRef; to: IViewDescriptorRef }>; |
| 55 | ++ readonly onDidChangeEnablement: Event<void>; |
| 56 | + |
| 57 | + isVisible(id: string): boolean; |
| 58 | + setVisible(id: string, visible: boolean): void; |
| 59 | +diff --git a/src/vs/workbench/services/views/browser/viewsService.ts b/src/vs/workbench/services/views/browser/viewsService.ts |
| 60 | +index 4938ebb966b..eef6628f853 100644 |
| 61 | +--- a/src/vs/workbench/services/views/browser/viewsService.ts |
| 62 | ++++ b/src/vs/workbench/services/views/browser/viewsService.ts |
| 63 | +@@ -221,6 +221,10 @@ export class ViewsService extends Disposable implements IViewsService { |
| 64 | + return false; |
| 65 | + } |
| 66 | + |
| 67 | ++ if (!this.contextKeyService.contextMatchesRules(viewContainer.when)) { |
| 68 | ++ return false; |
| 69 | ++ } |
| 70 | ++ |
| 71 | + if (!viewContainer.hideIfEmpty) { |
| 72 | + return true; |
| 73 | + } |
| 74 | +diff --git a/src/vs/workbench/services/views/common/viewContainerModel.ts b/src/vs/workbench/services/views/common/viewContainerModel.ts |
| 75 | +index fa24dca15c2..17a3e8c759b 100644 |
| 76 | +--- a/src/vs/workbench/services/views/common/viewContainerModel.ts |
| 77 | ++++ b/src/vs/workbench/services/views/common/viewContainerModel.ts |
| 78 | +@@ -324,6 +324,9 @@ export class ViewContainerModel extends Disposable implements IViewContainerMode |
| 79 | + private _onDidMoveVisibleViewDescriptors = this._register(new Emitter<{ from: IViewDescriptorRef; to: IViewDescriptorRef }>()); |
| 80 | + readonly onDidMoveVisibleViewDescriptors: Event<{ from: IViewDescriptorRef; to: IViewDescriptorRef }> = this._onDidMoveVisibleViewDescriptors.event; |
| 81 | + |
| 82 | ++ private _onDidChangeEnablement = this._register(new Emitter<void>()); |
| 83 | ++ readonly onDidChangeEnablement: Event<void> = this._onDidChangeEnablement.event; |
| 84 | ++ |
| 85 | + private readonly logger: Lazy<ILogger>; |
| 86 | + |
| 87 | + constructor( |
| 88 | +@@ -334,6 +337,14 @@ export class ViewContainerModel extends Disposable implements IViewContainerMode |
| 89 | + ) { |
| 90 | + super(); |
| 91 | + |
| 92 | ++ if (viewContainer.when) { |
| 93 | ++ const whenContextKeys = new CounterSet<string>(); |
| 94 | ++ for (const key of viewContainer.when.keys()) { |
| 95 | ++ whenContextKeys.add(key); |
| 96 | ++ } |
| 97 | ++ this._register(Event.filter(contextKeyService.onDidChangeContext, e => e.affectsSome(whenContextKeys))(() => this._onDidChangeEnablement.fire())); |
| 98 | ++ } |
| 99 | ++ |
| 100 | + this.logger = new Lazy(() => loggerService.createLogger(VIEWS_LOG_ID, { name: VIEWS_LOG_NAME, group: windowLogGroup })); |
| 101 | + |
| 102 | + this._register(Event.filter(contextKeyService.onDidChangeContext, e => e.affectsSome(this.contextKeys))(() => this.onDidChangeContext())); |
0 commit comments