Skip to content

Commit ebf4616

Browse files
committed
feat: add support for preserving merged workspace name casing in File Explorer
1 parent ac88aa1 commit ebf4616

3 files changed

Lines changed: 43 additions & 7 deletions

File tree

src/vs/workbench/contrib/files/browser/views/explorerView.ts

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ export interface IExplorerViewPaneOptions extends IViewPaneOptions {
153153
export class ExplorerView extends ViewPane implements IExplorerView {
154154

155155
private static readonly preserveWorkspaceNameCaseClass = 'preserve-workspace-name-case';
156+
private static readonly preserveMergedWorkspaceNameCaseClass = 'preserve-merged-workspace-name-case';
156157
static readonly TREE_VIEW_STATE_STORAGE_KEY: string = 'workbench.explorer.treeViewState';
157158

158159
private tree!: WorkbenchCompressibleAsyncDataTree<ExplorerItem | ExplorerItem[], ExplorerItem, FuzzyScore>;
@@ -237,7 +238,7 @@ export class ExplorerView extends ViewPane implements IExplorerView {
237238
this.viewVisibleContextKey = FoldersViewVisibleContext.bindTo(contextKeyService);
238239

239240
this.explorerService.registerView(this);
240-
this._register(toDisposable(() => this.workspaceTitleContainer?.classList.remove(ExplorerView.preserveWorkspaceNameCaseClass)));
241+
this._register(toDisposable(() => this.clearWorkspaceTitleContainer()));
241242
}
242243

243244
get autoReveal() {
@@ -260,7 +261,19 @@ export class ExplorerView extends ViewPane implements IExplorerView {
260261
// noop
261262
}
262263

264+
override get headerVisible(): boolean {
265+
return super.headerVisible;
266+
}
267+
268+
override set headerVisible(visible: boolean) {
269+
super.headerVisible = visible;
270+
this.updateWorkspaceTitleCase();
271+
}
272+
263273
override setVisible(visible: boolean): void {
274+
if (!visible) {
275+
this.clearWorkspaceTitleContainer();
276+
}
264277
this.viewVisibleContextKey.set(visible);
265278
super.setVisible(visible);
266279
if (visible) {
@@ -305,16 +318,23 @@ export class ExplorerView extends ViewPane implements IExplorerView {
305318
private updateWorkspaceTitleContainer(): void {
306319
const workspaceTitleContainer = DOM.findParentWithClass(this.element, 'part') ?? undefined;
307320
if (this.workspaceTitleContainer !== workspaceTitleContainer) {
308-
this.workspaceTitleContainer?.classList.remove(ExplorerView.preserveWorkspaceNameCaseClass);
321+
this.workspaceTitleContainer?.classList.remove(ExplorerView.preserveMergedWorkspaceNameCaseClass);
309322
this.workspaceTitleContainer = workspaceTitleContainer;
310323
}
311324
this.updateWorkspaceTitleCase();
312325
}
313326

327+
private clearWorkspaceTitleContainer(): void {
328+
this.workspaceTitleContainer?.classList.remove(ExplorerView.preserveMergedWorkspaceNameCaseClass);
329+
this.workspaceTitleContainer = undefined;
330+
}
331+
314332
private updateWorkspaceTitleCase(): void {
315333
const workspace = this.contextService.getWorkspace();
316334
const isUntitled = workspace.configuration ? isUntitledWorkspace(workspace.configuration, this.environmentService) : false;
317-
this.workspaceTitleContainer?.classList.toggle(ExplorerView.preserveWorkspaceNameCaseClass, !isUntitled);
335+
const preserveWorkspaceNameCase = this.contextService.getWorkbenchState() !== WorkbenchState.EMPTY && !isUntitled;
336+
this.element.classList.toggle(ExplorerView.preserveWorkspaceNameCaseClass, preserveWorkspaceNameCase);
337+
this.workspaceTitleContainer?.classList.toggle(ExplorerView.preserveMergedWorkspaceNameCaseClass, preserveWorkspaceNameCase && this.isVisible() && !this.headerVisible);
318338
}
319339

320340
protected override layoutBody(height: number, width: number): void {

src/vs/workbench/contrib/modernUI/browser/media/fontRamp.css

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,8 @@
137137
* Named File Explorer workspace titles preserve the casing supplied by the
138138
* user. Untitled workspaces continue to use the standard capitalized header.
139139
*/
140-
.modern-ui.monaco-workbench .part.preserve-workspace-name-case > .title > .title-label h2,
141-
.modern-ui .part.preserve-workspace-name-case .pane-header > .icon.codicon-explorer-view-icon + .title {
140+
.modern-ui.monaco-workbench .part.preserve-merged-workspace-name-case > .title > .title-label h2,
141+
.modern-ui .pane.preserve-workspace-name-case > .pane-header > .icon.codicon-explorer-view-icon + .title {
142142
text-transform: none;
143143
}
144144

src/vs/workbench/contrib/modernUI/test/browser/modernUI.contribution.test.ts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -282,14 +282,22 @@ suite('ModernUIContribution', () => {
282282
const paneHeader = appendElement(appendElement(paneView, 'pane'), 'pane-header');
283283
const paneTitle = appendElement(paneHeader, 'title');
284284

285-
const explorerPart = appendElement(layoutService.mainContainer, 'part preserve-workspace-name-case');
285+
const explorerPart = appendElement(layoutService.mainContainer, 'part preserve-merged-workspace-name-case');
286286
explorerPart.dataset.activeComposite = 'workbench.views.service.sidebar.custom';
287287
const explorerTitleLabel = appendElement(appendElement(explorerPart, 'title'), 'title-label');
288288
const explorerTitle = document.createElement('h2');
289289
explorerTitleLabel.appendChild(explorerTitle);
290-
const explorerPaneHeader = appendElement(appendElement(appendElement(explorerPart, 'monaco-pane-view'), 'pane'), 'pane-header');
290+
const explorerPaneHeader = appendElement(appendElement(appendElement(explorerPart, 'monaco-pane-view'), 'pane preserve-workspace-name-case'), 'pane-header');
291291
appendElement(explorerPaneHeader, 'icon codicon-explorer-view-icon');
292292
const explorerPaneTitle = appendElement(explorerPaneHeader, 'title');
293+
const multiViewPart = appendElement(layoutService.mainContainer, 'part');
294+
multiViewPart.dataset.activeComposite = 'workbench.views.service.sidebar.multiView';
295+
const multiViewTitleLabel = appendElement(appendElement(multiViewPart, 'title'), 'title-label');
296+
const multiViewTitle = document.createElement('h2');
297+
multiViewTitleLabel.appendChild(multiViewTitle);
298+
const multiViewExplorerPaneHeader = appendElement(appendElement(appendElement(multiViewPart, 'monaco-pane-view'), 'pane preserve-workspace-name-case'), 'pane-header');
299+
appendElement(multiViewExplorerPaneHeader, 'icon codicon-explorer-view-icon');
300+
const multiViewExplorerPaneTitle = appendElement(multiViewExplorerPaneHeader, 'title');
293301
const extensionsPart = appendElement(layoutService.mainContainer, 'part');
294302
const extensionsTitleLabel = appendElement(appendElement(extensionsPart, 'title'), 'title-label');
295303
const extensionsTitle = document.createElement('h2');
@@ -304,6 +312,8 @@ suite('ModernUIContribution', () => {
304312
paneTitleTransform: targetWindow.getComputedStyle(paneTitle).textTransform,
305313
explorerTitleTransform: targetWindow.getComputedStyle(explorerTitle).textTransform,
306314
explorerPaneTitleTransform: targetWindow.getComputedStyle(explorerPaneTitle).textTransform,
315+
multiViewTitleTransform: targetWindow.getComputedStyle(multiViewTitle).textTransform,
316+
multiViewExplorerPaneTitleTransform: targetWindow.getComputedStyle(multiViewExplorerPaneTitle).textTransform,
307317
extensionsTitleTransform: targetWindow.getComputedStyle(extensionsTitle).textTransform,
308318
panelTabTransform: targetWindow.getComputedStyle(panelTab).textTransform,
309319
layoutCount: layoutService.layoutCount,
@@ -323,6 +333,8 @@ suite('ModernUIContribution', () => {
323333
paneTitleTransform: targetWindow.getComputedStyle(paneTitle).textTransform,
324334
explorerTitleTransform: targetWindow.getComputedStyle(explorerTitle).textTransform,
325335
explorerPaneTitleTransform: targetWindow.getComputedStyle(explorerPaneTitle).textTransform,
336+
multiViewTitleTransform: targetWindow.getComputedStyle(multiViewTitle).textTransform,
337+
multiViewExplorerPaneTitleTransform: targetWindow.getComputedStyle(multiViewExplorerPaneTitle).textTransform,
326338
extensionsTitleTransform: targetWindow.getComputedStyle(extensionsTitle).textTransform,
327339
panelTabTransform: targetWindow.getComputedStyle(panelTab).textTransform,
328340
layoutCount: layoutService.layoutCount,
@@ -332,6 +344,8 @@ suite('ModernUIContribution', () => {
332344
paneTitleTransform: 'capitalize',
333345
explorerTitleTransform: 'none',
334346
explorerPaneTitleTransform: 'none',
347+
multiViewTitleTransform: 'capitalize',
348+
multiViewExplorerPaneTitleTransform: 'none',
335349
extensionsTitleTransform: 'capitalize',
336350
panelTabTransform: 'capitalize',
337351
layoutCount: 0,
@@ -340,6 +354,8 @@ suite('ModernUIContribution', () => {
340354
paneTitleTransform: 'uppercase',
341355
explorerTitleTransform: 'uppercase',
342356
explorerPaneTitleTransform: 'uppercase',
357+
multiViewTitleTransform: 'uppercase',
358+
multiViewExplorerPaneTitleTransform: 'uppercase',
343359
extensionsTitleTransform: 'uppercase',
344360
panelTabTransform: 'uppercase',
345361
layoutCount: 0,

0 commit comments

Comments
 (0)