Skip to content

Commit ec2dd67

Browse files
committed
store folding state in cell view model.
1 parent 86593ed commit ec2dd67

4 files changed

Lines changed: 25 additions & 20 deletions

File tree

src/vs/workbench/contrib/notebook/browser/diff/cellComponents.ts

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import * as DOM from 'vs/base/browser/dom';
77
import { Disposable, DisposableStore } from 'vs/base/common/lifecycle';
88
import { IEditorOptions } from 'vs/editor/common/config/editorOptions';
99
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
10-
import { CellDiffViewModel } from 'vs/workbench/contrib/notebook/browser/diff/celllDiffViewModel';
10+
import { CellDiffViewModel, MetadataFoldingState } from 'vs/workbench/contrib/notebook/browser/diff/celllDiffViewModel';
1111
import { CellDiffRenderTemplate, CellDiffViewModelLayoutChangeEvent, INotebookTextDiffEditor } from 'vs/workbench/contrib/notebook/browser/diff/common';
1212
import { EDITOR_BOTTOM_PADDING, EDITOR_TOP_PADDING } from 'vs/workbench/contrib/notebook/browser/constants';
1313
import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget';
@@ -71,11 +71,6 @@ const fixedEditorOptions: IEditorOptions = {
7171
renderValidationDecorations: 'on'
7272
};
7373

74-
enum MetadataFoldingState {
75-
Expanded,
76-
Collapsed
77-
}
78-
7974
abstract class AbstractCellRenderer extends Disposable {
8075
protected _metadataHeaderContainer!: HTMLElement;
8176
protected _metadataInfoContainer!: HTMLElement;
@@ -89,7 +84,6 @@ abstract class AbstractCellRenderer extends Disposable {
8984
bodyMargin: number;
9085
};
9186
protected _foldingIndicator!: HTMLElement;
92-
protected _foldingState!: MetadataFoldingState;
9387
protected _metadataEditorContainer?: HTMLElement;
9488
protected _metadataEditorDisposeStore!: DisposableStore;
9589
protected _metadataEditor?: CodeEditorWidget;
@@ -114,7 +108,6 @@ abstract class AbstractCellRenderer extends Disposable {
114108
bodyMargin: 16
115109
};
116110
this._metadataEditorDisposeStore = new DisposableStore();
117-
this._foldingState = MetadataFoldingState.Collapsed;
118111
this.initData();
119112
this.buildBody(templateData.container);
120113
this._register(cell.onDidLayoutChange(e => this.onDidLayoutChange(e)));
@@ -175,7 +168,7 @@ abstract class AbstractCellRenderer extends Disposable {
175168
const cellViewModel = e.target;
176169

177170
if (cellViewModel === this.cell) {
178-
this._foldingState = this._foldingState === MetadataFoldingState.Expanded ? MetadataFoldingState.Collapsed : MetadataFoldingState.Expanded;
171+
this.cell.foldingState = this.cell.foldingState === MetadataFoldingState.Expanded ? MetadataFoldingState.Collapsed : MetadataFoldingState.Expanded;
179172
this.updateMetadataRendering();
180173
}
181174
}
@@ -187,7 +180,7 @@ abstract class AbstractCellRenderer extends Disposable {
187180
}
188181

189182
updateMetadataRendering() {
190-
if (this._foldingState === MetadataFoldingState.Expanded) {
183+
if (this.cell.foldingState === MetadataFoldingState.Expanded) {
191184
// we should expand the metadata editor
192185
this._metadataInfoContainer.style.display = 'block';
193186

@@ -214,7 +207,7 @@ abstract class AbstractCellRenderer extends Disposable {
214207
this.layout({ metadataEditor: true });
215208

216209
this._register(this._metadataEditor.onDidContentSizeChange((e) => {
217-
if (e.contentHeightChanged && this._foldingState === MetadataFoldingState.Expanded) {
210+
if (e.contentHeightChanged && this.cell.foldingState === MetadataFoldingState.Expanded) {
218211
this._layoutInfo.metadataHeight = e.contentHeight;
219212
this.layout({ metadataEditor: true });
220213
}
@@ -236,7 +229,7 @@ abstract class AbstractCellRenderer extends Disposable {
236229
}
237230

238231
private _updateFoldingIcon() {
239-
if (this._foldingState === MetadataFoldingState.Collapsed) {
232+
if (this.cell.foldingState === MetadataFoldingState.Collapsed) {
240233
this._foldingIndicator.innerHTML = renderCodicons('$(chevron-right)');
241234
} else {
242235
this._foldingIndicator.innerHTML = renderCodicons('$(chevron-down)');

src/vs/workbench/contrib/notebook/browser/diff/celllDiffViewModel.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,16 @@
66
import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel';
77
import { NotebookDiffEditorEventDispatcher } from 'vs/workbench/contrib/notebook/browser/viewModel/eventDispatcher';
88
import { Emitter } from 'vs/base/common/event';
9-
import { BareFontInfo } from 'vs/editor/common/config/fontInfo';
109
import { Disposable } from 'vs/base/common/lifecycle';
1110
import { CellDiffViewModelLayoutChangeEvent } from 'vs/workbench/contrib/notebook/browser/diff/common';
1211

12+
export enum MetadataFoldingState {
13+
Expanded,
14+
Collapsed
15+
}
16+
1317
export class CellDiffViewModel extends Disposable {
18+
public foldingState: MetadataFoldingState;
1419
private _layoutInfoEmitter = new Emitter<CellDiffViewModelLayoutChangeEvent>();
1520

1621
onDidLayoutChange = this._layoutInfoEmitter.event;
@@ -22,6 +27,7 @@ export class CellDiffViewModel extends Disposable {
2227
readonly editorEventDispatcher: NotebookDiffEditorEventDispatcher
2328
) {
2429
super();
30+
this.foldingState = MetadataFoldingState.Collapsed;
2531

2632
this._register(this.editorEventDispatcher.onDidChangeLayout(e => {
2733
this._layoutInfoEmitter.fire({ outerWidth: e.value.width });

src/vs/workbench/contrib/notebook/browser/diff/common.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { NotebookLayoutInfo } from 'vs/workbench/contrib/notebook/browser/notebo
77
import { CellDiffViewModel } from 'vs/workbench/contrib/notebook/browser/diff/celllDiffViewModel';
88
import { Event } from 'vs/base/common/event';
99
import { BareFontInfo } from 'vs/editor/common/config/fontInfo';
10+
import { DisposableStore } from 'vs/base/common/lifecycle';
1011

1112
export interface INotebookTextDiffEditor {
1213
onMouseUp: Event<{ readonly event: MouseEvent; readonly target: CellDiffViewModel; }>;
@@ -16,7 +17,7 @@ export interface INotebookTextDiffEditor {
1617

1718
export interface CellDiffRenderTemplate {
1819
readonly container: HTMLElement;
19-
20+
readonly elementDisposables: DisposableStore;
2021
}
2122

2223
export interface CellDiffViewModelLayoutChangeEvent {

src/vs/workbench/contrib/notebook/browser/diff/notebookTextDiffList.ts

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import 'vs/css!./notebookDiff';
77
import { IListRenderer, IListVirtualDelegate } from 'vs/base/browser/ui/list/list';
88
import * as DOM from 'vs/base/browser/dom';
99
import { IListStyles, IStyleController } from 'vs/base/browser/ui/list/listWidget';
10-
import { IDisposable } from 'vs/base/common/lifecycle';
10+
import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle';
1111
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
1212
import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
1313
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
@@ -55,24 +55,25 @@ export class CellDiffRenderer implements IListRenderer<CellDiffViewModel, CellDi
5555

5656
renderTemplate(container: HTMLElement): CellDiffRenderTemplate {
5757
return {
58-
container
58+
container,
59+
elementDisposables: new DisposableStore()
5960
};
6061
}
6162

6263
renderElement(element: CellDiffViewModel, index: number, templateData: CellDiffRenderTemplate, height: number | undefined): void {
6364
templateData.container.innerText = '';
6465
switch (element.type) {
6566
case 'unchanged':
66-
this.instantiationService.createInstance(UnchangedCell, this.notebookEditor, element, templateData);
67+
templateData.elementDisposables.add(this.instantiationService.createInstance(UnchangedCell, this.notebookEditor, element, templateData));
6768
return;
6869
case 'delete':
69-
this.instantiationService.createInstance(DeletedCell, this.notebookEditor, element, templateData);
70+
templateData.elementDisposables.add(this.instantiationService.createInstance(DeletedCell, this.notebookEditor, element, templateData));
7071
return;
7172
case 'insert':
72-
this.instantiationService.createInstance(InsertCell, this.notebookEditor, element, templateData);
73+
templateData.elementDisposables.add(this.instantiationService.createInstance(InsertCell, this.notebookEditor, element, templateData));
7374
return;
7475
case 'modified':
75-
this.instantiationService.createInstance(ModifiedCell, this.notebookEditor, element, templateData);
76+
templateData.elementDisposables.add(this.instantiationService.createInstance(ModifiedCell, this.notebookEditor, element, templateData));
7677
return;
7778
default:
7879
break;
@@ -82,6 +83,10 @@ export class CellDiffRenderer implements IListRenderer<CellDiffViewModel, CellDi
8283
disposeTemplate(templateData: CellDiffRenderTemplate): void {
8384
templateData.container.innerText = '';
8485
}
86+
87+
disposeElement(element: CellDiffViewModel, index: number, templateData: CellDiffRenderTemplate): void {
88+
templateData.elementDisposables.clear();
89+
}
8590
}
8691

8792

0 commit comments

Comments
 (0)