Changing between editors quickly looses folding state. Fixes #42738

This commit is contained in:
Martin Aeschlimann 2018-02-16 15:50:43 +01:00
parent 1633d0959a
commit 7e401719ad
3 changed files with 18 additions and 2 deletions

View file

@ -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;
}
/**

View file

@ -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 });
}

View file

@ -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);