Skip to content

Commit 2002573

Browse files
author
Loïc Mangeonjean
committed
feat: support disabling view containers
1 parent a4dfdc7 commit 2002573

File tree

1 file changed

+102
-0
lines changed

1 file changed

+102
-0
lines changed
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
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

Comments
 (0)