Skip to content

Commit 826458a

Browse files
authored
sessions - tweaks to modal editor sidebar (persist width, allow to toggle visibility) (#306704)
* sessions - tweaks to modal editor sidebar * respect sizes * clamp width * . * yauzl * layout
1 parent eeaba7d commit 826458a

9 files changed

Lines changed: 444 additions & 34 deletions

File tree

src/vs/platform/editor/common/editor.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -361,13 +361,23 @@ export interface IModalEditorPartOptions {
361361
* opening and cannot currently be added, removed, or updated
362362
* after the modal editor is opened.
363363
*/
364-
readonly sidebar?: IModalEditorSidebarContent;
364+
readonly sidebar?: IModalEditorSidebar;
365365
}
366366

367367
/**
368-
* Content to render in the modal editor sidebar.
368+
* Modal sidebar supports rendering custom content in a sidebar next to the main editor content.
369369
*/
370-
export interface IModalEditorSidebarContent {
370+
export interface IModalEditorSidebar {
371+
372+
/**
373+
* Sidebar width set by the user via resizing, if any.
374+
*/
375+
readonly sidebarWidth?: number;
376+
377+
/**
378+
* Whether the sidebar is hidden.
379+
*/
380+
readonly sidebarHidden?: boolean;
371381

372382
/**
373383
* Render the sidebar content into the given container.

src/vs/sessions/contrib/changes/browser/changesView.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1569,7 +1569,6 @@ class ChangesTreeRenderer implements ICompressibleTreeRenderer<ChangesTreeElemen
15691569
}
15701570

15711571
renderElement(node: ITreeNode<ChangesTreeElement, void>, _index: number, templateData: IChangesTreeTemplate): void {
1572-
console.log('Rendering element:', node.element);
15731572
const element = node.element;
15741573
templateData.label.element.style.display = 'flex';
15751574

src/vs/workbench/browser/parts/editor/editorCommands.ts

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import { ITelemetryService } from '../../../../platform/telemetry/common/telemet
2727
import { ActiveGroupEditorsByMostRecentlyUsedQuickAccess } from './editorQuickAccess.js';
2828
import { SideBySideEditor } from './sideBySideEditor.js';
2929
import { TextDiffEditor } from './textDiffEditor.js';
30-
import { ActiveEditorCanSplitInGroupContext, ActiveEditorGroupEmptyContext, ActiveEditorGroupLockedContext, ActiveEditorStickyContext, EditorPartModalContext, EditorPartModalMaximizedContext, EditorPartModalNavigationContext, IsSessionsWindowContext, MultipleEditorGroupsContext, SideBySideEditorActiveContext, TextCompareEditorActiveContext } from '../../../common/contextkeys.js';
30+
import { ActiveEditorCanSplitInGroupContext, ActiveEditorGroupEmptyContext, ActiveEditorGroupLockedContext, ActiveEditorStickyContext, EditorPartModalContext, EditorPartModalMaximizedContext, EditorPartModalNavigationContext, EditorPartModalSidebarContext, IsSessionsWindowContext, MultipleEditorGroupsContext, SideBySideEditorActiveContext, TextCompareEditorActiveContext } from '../../../common/contextkeys.js';
3131
import { CloseDirection, EditorInputCapabilities, EditorsOrder, IResourceDiffEditorInput, IUntitledTextResourceEditorInput, isEditorInputWithOptionsAndGroup } from '../../../common/editor.js';
3232
import { EditorInput } from '../../../common/editor/editorInput.js';
3333
import { SideBySideEditorInput } from '../../../common/editor/sideBySideEditorInput.js';
@@ -111,6 +111,7 @@ export const MOVE_MODAL_EDITOR_TO_WINDOW_COMMAND_ID = 'workbench.action.moveModa
111111
export const TOGGLE_MODAL_EDITOR_MAXIMIZED_COMMAND_ID = 'workbench.action.toggleModalEditorMaximized';
112112
export const NAVIGATE_MODAL_EDITOR_PREVIOUS_COMMAND_ID = 'workbench.action.navigateModalEditorPrevious';
113113
export const NAVIGATE_MODAL_EDITOR_NEXT_COMMAND_ID = 'workbench.action.navigateModalEditorNext';
114+
export const TOGGLE_MODAL_EDITOR_SIDEBAR_COMMAND_ID = 'workbench.action.toggleModalEditorSidebar';
114115

115116
export const API_OPEN_EDITOR_COMMAND_ID = '_workbench.open';
116117
export const API_OPEN_DIFF_EDITOR_COMMAND_ID = '_workbench.diff';
@@ -1476,6 +1477,28 @@ function registerModalEditorCommands(): void {
14761477
}
14771478
});
14781479

1480+
registerAction2(class extends Action2 {
1481+
constructor() {
1482+
super({
1483+
id: TOGGLE_MODAL_EDITOR_SIDEBAR_COMMAND_ID,
1484+
title: localize2('toggleModalEditorSidebar', 'Toggle Modal Editor Sidebar'),
1485+
category: Categories.View,
1486+
f1: true,
1487+
precondition: ContextKeyExpr.and(EditorPartModalContext, EditorPartModalSidebarContext),
1488+
});
1489+
}
1490+
run(accessor: ServicesAccessor): void {
1491+
const editorGroupsService = accessor.get(IEditorGroupsService);
1492+
1493+
for (const part of editorGroupsService.parts) {
1494+
if (isModalEditorPart(part)) {
1495+
part.toggleSidebar();
1496+
break;
1497+
}
1498+
}
1499+
}
1500+
});
1501+
14791502
registerAction2(class extends Action2 {
14801503
constructor() {
14811504
super({

src/vs/workbench/browser/parts/editor/editorParts.ts

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ interface IModalEditorPartState {
4949
readonly maximized: boolean;
5050
readonly size?: { readonly width: number; readonly height: number };
5151
readonly position?: { readonly left: number; readonly top: number };
52+
readonly sidebarWidth?: number;
53+
readonly sidebarHidden?: boolean;
5254
}
5355

5456
interface IEditorPartsMemento {
@@ -87,6 +89,8 @@ export class EditorParts extends MultiWindowParts<EditorPart, IEditorPartsMement
8789
this.modalEditorMaximized = modalState.maximized;
8890
this.modalEditorSize = modalState.size;
8991
this.modalEditorPosition = modalState.position;
92+
this.modalEditorSidebarWidth = modalState.sidebarWidth;
93+
this.modalEditorSidebarHidden = modalState.sidebarHidden;
9094
}
9195

9296
this.mainPart = this._register(this.createMainEditorPart());
@@ -175,6 +179,8 @@ export class EditorParts extends MultiWindowParts<EditorPart, IEditorPartsMement
175179
private modalEditorMaximized = false;
176180
private modalEditorSize: IDimension | undefined;
177181
private modalEditorPosition: { readonly left: number; readonly top: number } | undefined;
182+
private modalEditorSidebarWidth: number | undefined;
183+
private modalEditorSidebarHidden: boolean | undefined;
178184

179185
async createModalEditorPart(options?: IModalEditorPartOptions): Promise<IModalEditorPart> {
180186

@@ -190,6 +196,11 @@ export class EditorParts extends MultiWindowParts<EditorPart, IEditorPartsMement
190196
maximized: options?.maximized ?? this.modalEditorMaximized,
191197
size: options?.size ?? this.modalEditorSize,
192198
position: options?.position ?? this.modalEditorPosition,
199+
sidebar: options?.sidebar ? {
200+
...options.sidebar,
201+
sidebarWidth: options.sidebar.sidebarWidth ?? this.modalEditorSidebarWidth,
202+
sidebarHidden: options.sidebar.sidebarHidden ?? this.modalEditorSidebarHidden
203+
} : undefined
193204
});
194205

195206
// Keep instantiation service and reference to reuse
@@ -201,6 +212,10 @@ export class EditorParts extends MultiWindowParts<EditorPart, IEditorPartsMement
201212
this.modalEditorMaximized = part.maximized;
202213
this.modalEditorSize = part.size;
203214
this.modalEditorPosition = part.position;
215+
if (part.hasSidebar) {
216+
this.modalEditorSidebarWidth = part.sidebarWidth;
217+
this.modalEditorSidebarHidden = part.sidebarHidden || undefined;
218+
}
204219

205220
this.modalPartInstantiationService = undefined;
206221
this.modalEditorPart = undefined;
@@ -416,17 +431,23 @@ export class EditorParts extends MultiWindowParts<EditorPart, IEditorPartsMement
416431
this.modalEditorMaximized = this.modalEditorPart.maximized;
417432
this.modalEditorSize = this.modalEditorPart.size;
418433
this.modalEditorPosition = this.modalEditorPart.position;
434+
if (this.modalEditorPart.hasSidebar) {
435+
this.modalEditorSidebarWidth = this.modalEditorPart.sidebarWidth;
436+
this.modalEditorSidebarHidden = this.modalEditorPart.sidebarHidden || undefined;
437+
}
419438
}
420439

421440
// Only persist when there is meaningful state to restore.
422441
// When all values are at their defaults (not maximized, no
423442
// custom size or position), we delete the key to avoid
424443
// storing unnecessary data.
425-
if (this.modalEditorMaximized || this.modalEditorSize || this.modalEditorPosition) {
444+
if (this.modalEditorMaximized || this.modalEditorSize || this.modalEditorPosition || this.modalEditorSidebarWidth || this.modalEditorSidebarHidden) {
426445
this.profileMemento[EditorParts.MODAL_EDITOR_STATE_STORAGE_KEY] = {
427446
maximized: this.modalEditorMaximized,
428447
size: this.modalEditorSize ? { width: this.modalEditorSize.width, height: this.modalEditorSize.height } : undefined,
429448
position: this.modalEditorPosition,
449+
sidebarWidth: this.modalEditorSidebarWidth,
450+
sidebarHidden: this.modalEditorSidebarHidden,
430451
};
431452
} else {
432453
delete this.profileMemento[EditorParts.MODAL_EDITOR_STATE_STORAGE_KEY];

src/vs/workbench/browser/parts/editor/media/modalEditorPart.css

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,20 +70,21 @@
7070
flex-direction: column;
7171
overflow: hidden;
7272
box-sizing: border-box;
73+
padding: 8px;
7374
background-color: var(--vscode-sideBar-background, var(--vscode-editor-background));
7475
border-right: 1px solid var(--vscode-sideBarSectionHeader-border, var(--vscode-editorWidget-border, transparent));
7576
}
7677

7778
.monaco-modal-editor-block .modal-editor-sidebar .monaco-tl-twistie.force-no-twistie {
78-
width: 6px !important;
79+
width: 10px !important;
7980
padding-left: 0 !important;
8081
padding-right: 0 !important;
8182
}
8283

8384
/** Modal Editor Header */
8485
.monaco-modal-editor-block .modal-editor-header {
8586
display: grid;
86-
grid-template-columns: 1fr auto 1fr;
87+
grid-template-columns: auto 1fr auto 1fr;
8788
grid-column: 1 / -1;
8889
align-items: center;
8990
height: 32px;
@@ -93,9 +94,17 @@
9394
background-color: var(--vscode-titleBar-activeBackground);
9495
border-bottom: 1px solid var(--vscode-titleBar-border, transparent);
9596

97+
/* Modal Editor Sidebar Toggle */
98+
.modal-editor-sidebar-toggle {
99+
grid-column: 1;
100+
display: flex;
101+
align-items: center;
102+
margin-right: 4px;
103+
}
104+
96105
/* Modal Editor Title */
97106
.modal-editor-title {
98-
grid-column: 1;
107+
grid-column: 2;
99108
font-size: 12px;
100109
font-weight: 500;
101110
color: var(--vscode-titleBar-activeForeground);
@@ -115,7 +124,7 @@
115124

116125
/* Modal Editor Navigation */
117126
.modal-editor-navigation {
118-
grid-column: 2;
127+
grid-column: 3;
119128
display: flex;
120129
align-items: center;
121130
height: 22px;
@@ -159,7 +168,7 @@
159168

160169
/* Modal Editor Actions */
161170
.modal-editor-action-container {
162-
grid-column: 3;
171+
grid-column: 4;
163172
display: flex;
164173
align-items: center;
165174
justify-content: flex-end;

0 commit comments

Comments
 (0)