Changing between editors quickly looses folding state. Fixes #42738
This commit is contained in:
parent
1633d0959a
commit
7e401719ad
3 changed files with 18 additions and 2 deletions
|
@ -104,7 +104,11 @@ export class FoldingController implements IEditorContribution {
|
|||
if (!model || !this._isEnabled || model.isTooLargeForTokenization()) {
|
||||
return {};
|
||||
}
|
||||
return { collapsedRegions: this.foldingModel.getMemento(), lineCount: model.getLineCount() };
|
||||
if (this.foldingModel) { // disposed ?
|
||||
let collapsedRegions = this.foldingModel.isInitialized ? this.foldingModel.getMemento() : this.hiddenRangeModel.getMemento();
|
||||
return { collapsedRegions, lineCount: model.getLineCount() };
|
||||
}
|
||||
return void 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -26,18 +26,21 @@ export class FoldingModel {
|
|||
|
||||
private _ranges: FoldingRanges;
|
||||
private _editorDecorationIds: string[];
|
||||
private _isInitialized: boolean;
|
||||
|
||||
private _updateEventEmitter = new Emitter<FoldingModelChangeEvent>();
|
||||
|
||||
public get ranges(): FoldingRanges { return this._ranges; }
|
||||
public get onDidChange(): Event<FoldingModelChangeEvent> { return this._updateEventEmitter.event; }
|
||||
public get textModel() { return this._textModel; }
|
||||
public get isInitialized() { return this._isInitialized; }
|
||||
|
||||
constructor(textModel: ITextModel, decorationProvider: IDecorationProvider) {
|
||||
this._textModel = textModel;
|
||||
this._decorationProvider = decorationProvider;
|
||||
this._ranges = new FoldingRanges(new Uint32Array(0), new Uint32Array(0));
|
||||
this._editorDecorationIds = [];
|
||||
this._isInitialized = false;
|
||||
}
|
||||
|
||||
public toggleCollapseState(regions: FoldingRegion[]) {
|
||||
|
@ -128,6 +131,7 @@ export class FoldingModel {
|
|||
|
||||
this._editorDecorationIds = this._decorationProvider.deltaDecorations(this._editorDecorationIds, newEditorDecorations);
|
||||
this._ranges = newRanges;
|
||||
this._isInitialized = true;
|
||||
this._updateEventEmitter.fire({ model: this });
|
||||
}
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@ import { findFirst } from 'vs/base/common/arrays';
|
|||
|
||||
export class HiddenRangeModel {
|
||||
private _foldingModel: FoldingModel;
|
||||
private _hiddenRanges: IRange[] = [];
|
||||
private _hiddenRanges: IRange[];
|
||||
private _foldingModelListener: IDisposable;
|
||||
private _updateEventEmitter = new Emitter<IRange[]>();
|
||||
|
||||
|
@ -22,6 +22,7 @@ export class HiddenRangeModel {
|
|||
public constructor(model: FoldingModel) {
|
||||
this._foldingModel = model;
|
||||
this._foldingModelListener = model.onDidChange(_ => this.updateHiddenRanges());
|
||||
this._hiddenRanges = [];
|
||||
if (model.ranges.length) {
|
||||
this.updateHiddenRanges();
|
||||
}
|
||||
|
@ -80,6 +81,13 @@ export class HiddenRangeModel {
|
|||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Collapse state memento, for persistence only, only used if folding model is not yet initialized
|
||||
*/
|
||||
public getMemento(): CollapseMemento {
|
||||
return this._hiddenRanges.map(r => ({ startLineNumber: r.startLineNumber - 1, endLineNumber: r.endLineNumber }));
|
||||
}
|
||||
|
||||
private applyHiddenRanges(newHiddenAreas: IRange[]) {
|
||||
this._hiddenRanges = newHiddenAreas;
|
||||
this._updateEventEmitter.fire(newHiddenAreas);
|
||||
|
|
Loading…
Reference in a new issue