Skip to content

Commit b6e020a

Browse files
committed
trigger folding icon update when foldign regions changed.
1 parent 53684d6 commit b6e020a

6 files changed

Lines changed: 61 additions & 10 deletions

File tree

src/vs/editor/contrib/folding/foldingRanges.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,26 @@ export class FoldingRegions {
151151
}
152152
return res.join(', ');
153153
}
154+
155+
public equals(b: FoldingRegions) {
156+
if (this.length !== b.length) {
157+
return false;
158+
}
159+
160+
for (let i = 0; i < this.length; i++) {
161+
if (this.getStartLineNumber(i) !== b.getStartLineNumber(i)) {
162+
return false;
163+
}
164+
if (this.getEndLineNumber(i) !== b.getEndLineNumber(i)) {
165+
return false;
166+
}
167+
if (this.getType(i) !== b.getType(i)) {
168+
return false;
169+
}
170+
}
171+
172+
return true;
173+
}
154174
}
155175

156176
export class FoldingRegion {

src/vs/workbench/contrib/notebook/browser/contrib/fold/folding.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { Disposable } from 'vs/base/common/lifecycle';
77
import { INotebookEditor, INotebookEditorMouseEvent, ICellRange } from 'vs/workbench/contrib/notebook/browser/notebookBrowser';
88
import * as DOM from 'vs/base/browser/dom';
99
import { CellFoldingState, FoldingModel } from 'vs/workbench/contrib/notebook/browser/contrib/fold/foldingModel';
10+
import { CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon';
1011

1112
export class FoldingController extends Disposable {
1213
private _foldingModel: FoldingModel;
@@ -17,6 +18,12 @@ export class FoldingController extends Disposable {
1718
super();
1819

1920
this._register(this._notebookEditor.onMouseUp(e => { this.onMouseUp(e); }));
21+
this._register(this._notebookEditor.viewModel!.eventDispatcher.onDidChangeCellState(e => {
22+
if (e.source.editStateChanged && e.cell.cellKind === CellKind.Markdown) {
23+
this._foldingModel.recompute();
24+
// this._updateEditorFoldingRanges();
25+
}
26+
}));
2027

2128
this._foldingModel = new FoldingModel();
2229
this._foldingModel.attachViewModel(this._notebookEditor.viewModel!);

src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { CellEditState, CellFindMatch, CodeCellLayoutChangeEvent, CodeCellLayout
1414
import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel';
1515
import { CellKind, NotebookCellOutputsSplice } from 'vs/workbench/contrib/notebook/common/notebookCommon';
1616
import { BaseCellViewModel } from './baseCellViewModel';
17+
import { NotebookEventDispatcher } from 'vs/workbench/contrib/notebook/browser/viewModel/eventDispatcher';
1718

1819
export class CodeCellViewModel extends BaseCellViewModel implements ICellViewModel {
1920
cellKind: CellKind.Code = CellKind.Code;
@@ -59,6 +60,7 @@ export class CodeCellViewModel extends BaseCellViewModel implements ICellViewMod
5960
readonly notebookHandle: number,
6061
readonly model: NotebookCellTextModel,
6162
initialNotebookLayoutInfo: NotebookLayoutInfo | null,
63+
readonly eventDispatcher: NotebookEventDispatcher,
6264
@ITextModelService private readonly _modelService: ITextModelService,
6365
) {
6466
super(viewType, notebookHandle, model, UUID.generateUuid());

src/vs/workbench/contrib/notebook/browser/viewModel/eventDispatcher.ts

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@
55

66
import { Emitter } from 'vs/base/common/event';
77
import { NotebookDocumentMetadata } from 'vs/workbench/contrib/notebook/common/notebookCommon';
8-
import { NotebookLayoutChangeEvent, NotebookLayoutInfo } from 'vs/workbench/contrib/notebook/browser/notebookBrowser';
8+
import { NotebookLayoutChangeEvent, NotebookLayoutInfo, CellViewModelStateChangeEvent, ICellViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser';
99

1010
export enum NotebookViewEventType {
1111
LayoutChanged = 1,
12-
MetadataChanged = 2
12+
MetadataChanged = 2,
13+
CellStateChanged = 3
1314
}
1415

1516
export class NotebookLayoutChangedEvent {
@@ -29,14 +30,24 @@ export class NotebookMetadataChangedEvent {
2930
}
3031
}
3132

33+
export class NotebookCellStateChangedEvent {
34+
public readonly type = NotebookViewEventType.CellStateChanged;
3235

33-
export type NotebookViewEvent = NotebookLayoutChangedEvent | NotebookMetadataChangedEvent;
36+
constructor(readonly source: CellViewModelStateChangeEvent, readonly cell: ICellViewModel) {
37+
38+
}
39+
}
40+
41+
42+
export type NotebookViewEvent = NotebookLayoutChangedEvent | NotebookMetadataChangedEvent | NotebookCellStateChangedEvent;
3443

3544
export class NotebookEventDispatcher {
3645
protected readonly _onDidChangeLayout = new Emitter<NotebookLayoutChangedEvent>();
3746
readonly onDidChangeLayout = this._onDidChangeLayout.event;
3847
protected readonly _onDidChangeMetadata = new Emitter<NotebookMetadataChangedEvent>();
3948
readonly onDidChangeMetadata = this._onDidChangeMetadata.event;
49+
protected readonly _onDidChangeCellState = new Emitter<NotebookCellStateChangedEvent>();
50+
readonly onDidChangeCellState = this._onDidChangeCellState.event;
4051

4152
constructor() {
4253
}
@@ -52,6 +63,9 @@ export class NotebookEventDispatcher {
5263
case NotebookViewEventType.MetadataChanged:
5364
this._onDidChangeMetadata.fire(e);
5465
break;
66+
case NotebookViewEventType.CellStateChanged:
67+
this._onDidChangeCellState.fire(e);
68+
break;
5569
}
5670
}
5771
}

src/vs/workbench/contrib/notebook/browser/viewModel/markdownCellViewModel.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { BaseCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewMod
1616
import { EditorFoldingStateDelegate } from 'vs/workbench/contrib/notebook/browser/contrib/fold/foldingModel';
1717
import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel';
1818
import { CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon';
19+
import { NotebookEventDispatcher, NotebookCellStateChangedEvent } from 'vs/workbench/contrib/notebook/browser/viewModel/eventDispatcher';
1920

2021
export class MarkdownCellViewModel extends BaseCellViewModel implements ICellViewModel {
2122
cellKind: CellKind.Markdown = CellKind.Markdown;
@@ -48,6 +49,7 @@ export class MarkdownCellViewModel extends BaseCellViewModel implements ICellVie
4849
readonly model: NotebookCellTextModel,
4950
initialNotebookLayoutInfo: NotebookLayoutInfo | null,
5051
readonly foldingDelegate: EditorFoldingStateDelegate,
52+
readonly eventDispatcher: NotebookEventDispatcher,
5153
@IInstantiationService private readonly _instaService: IInstantiationService,
5254
@ITextModelService private readonly _modelService: ITextModelService) {
5355
super(viewType, notebookHandle, model, UUID.generateUuid());
@@ -58,6 +60,10 @@ export class MarkdownCellViewModel extends BaseCellViewModel implements ICellVie
5860
bottomToolbarOffset: BOTTOM_CELL_TOOLBAR_HEIGHT,
5961
totalHeight: 0
6062
};
63+
64+
this._register(this.onDidChangeState(e => {
65+
eventDispatcher.emit([new NotebookCellStateChangedEvent(e, this)]);
66+
}));
6167
}
6268

6369
triggerfoldingStateChange() {

src/vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,7 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD
285285
}
286286

287287
updateFoldingRanges(ranges: FoldingRegions) {
288+
const foldingRangeChanged = this._foldingRanges ? !this._foldingRanges.equals(ranges) : true;
288289
this._foldingRanges = ranges;
289290
let updateHiddenAreas = false;
290291
let newHiddenAreas: ICellRange[] = [];
@@ -321,12 +322,13 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD
321322

322323
if (updateHiddenAreas || k < this._hiddenRanges.length) {
323324
this._hiddenRanges = newHiddenAreas;
324-
this._viewCells.forEach(cell => {
325-
if (cell.cellKind === CellKind.Markdown) {
326-
cell.triggerfoldingStateChange();
327-
}
328-
});
329325
}
326+
327+
this._viewCells.forEach(cell => {
328+
if (cell.cellKind === CellKind.Markdown) {
329+
cell.triggerfoldingStateChange();
330+
}
331+
});
330332
}
331333

332334
getHiddenRanges() {
@@ -748,8 +750,8 @@ export type CellViewModel = CodeCellViewModel | MarkdownCellViewModel;
748750

749751
export function createCellViewModel(instantiationService: IInstantiationService, notebookViewModel: NotebookViewModel, cell: NotebookCellTextModel) {
750752
if (cell.cellKind === CellKind.Code) {
751-
return instantiationService.createInstance(CodeCellViewModel, notebookViewModel.viewType, notebookViewModel.handle, cell, notebookViewModel.layoutInfo);
753+
return instantiationService.createInstance(CodeCellViewModel, notebookViewModel.viewType, notebookViewModel.handle, cell, notebookViewModel.layoutInfo, notebookViewModel.eventDispatcher);
752754
} else {
753-
return instantiationService.createInstance(MarkdownCellViewModel, notebookViewModel.viewType, notebookViewModel.handle, cell, notebookViewModel.layoutInfo, notebookViewModel);
755+
return instantiationService.createInstance(MarkdownCellViewModel, notebookViewModel.viewType, notebookViewModel.handle, cell, notebookViewModel.layoutInfo, notebookViewModel, notebookViewModel.eventDispatcher);
754756
}
755757
}

0 commit comments

Comments
 (0)