提交 9146ff33 编写于 作者: A Alex Dima

Query model for decorations only for visible model lines in the viewport (in...

Query model for decorations only for visible model lines in the viewport (in contiguos visible model lines batches)
上级 c01d8c1a
......@@ -87,6 +87,7 @@ export interface IViewModelLinesCollection {
getViewLinesData(viewStartLineNumber: number, viewEndLineNumber: number, needed: boolean[]): ViewLineData[];
getAllOverviewRulerDecorations(ownerId: number, filterOutValidation: boolean, theme: ITheme): IOverviewRulerDecorations;
getDecorationsInRange(range: Range, ownerId: number, filterOutValidation: boolean): editorCommon.IModelDecoration[];
}
export class CoordinatesConverter implements ICoordinatesConverter {
......@@ -694,6 +695,44 @@ export class SplitLinesCollection implements IViewModelLinesCollection {
}
return result.result;
}
public getDecorationsInRange(range: Range, ownerId: number, filterOutValidation: boolean): editorCommon.IModelDecoration[] {
const modelStart = this.convertViewPositionToModelPosition(range.startLineNumber, range.startColumn);
const modelEnd = this.convertViewPositionToModelPosition(range.endLineNumber, range.endColumn);
if (modelEnd.lineNumber - modelStart.lineNumber <= range.endLineNumber - range.startLineNumber) {
// most likely there are no hidden lines => fast path
return this.model.getDecorationsInRange(new Range(modelStart.lineNumber, modelStart.column, modelEnd.lineNumber, modelEnd.column), ownerId, filterOutValidation);
}
let result: editorCommon.IModelDecoration[] = [];
const modelStartLineIndex = modelStart.lineNumber - 1;
const modelEndLineIndex = modelEnd.lineNumber - 1;
let reqStart: Position = null;
for (let modelLineIndex = modelStartLineIndex; modelLineIndex <= modelEndLineIndex; modelLineIndex++) {
const line = this.lines[modelLineIndex];
if (line.isVisible()) {
// merge into previous request
if (reqStart === null) {
reqStart = new Position(modelLineIndex + 1, modelLineIndex === modelStartLineIndex ? modelStart.column : 1);
}
} else {
// hit invisible line => flush request
if (reqStart !== null) {
result = result.concat(this.model.getDecorationsInRange(new Range(reqStart.lineNumber, reqStart.column, modelLineIndex + 1, 1)));
reqStart = null;
}
}
}
if (reqStart !== null) {
result = result.concat(this.model.getDecorationsInRange(new Range(reqStart.lineNumber, reqStart.column, modelEnd.lineNumber, modelEnd.column)));
reqStart = null;
}
return result;
}
}
class VisibleIdentitySplitLine implements ISplitLine {
......@@ -1172,6 +1211,10 @@ export class IdentityLinesCollection implements IViewModelLinesCollection {
}
return result.result;
}
public getDecorationsInRange(range: Range, ownerId: number, filterOutValidation: boolean): editorCommon.IModelDecoration[] {
return this.model.getDecorationsInRange(range, ownerId, filterOutValidation);
}
}
class OverviewRulerDecorations {
......
......@@ -9,6 +9,7 @@ import { Range } from 'vs/editor/common/core/range';
import { Position } from 'vs/editor/common/core/position';
import * as editorCommon from 'vs/editor/common/editorCommon';
import { InlineDecoration, ViewModelDecoration, ICoordinatesConverter } from 'vs/editor/common/viewModel/viewModel';
import { IViewModelLinesCollection } from 'vs/editor/common/viewModel/splitLinesCollection';
export interface IDecorationsViewportData {
/**
......@@ -26,6 +27,7 @@ export class ViewModelDecorations implements IDisposable {
private readonly editorId: number;
private readonly model: editorCommon.IModel;
private readonly configuration: editorCommon.IConfiguration;
private readonly _linesCollection: IViewModelLinesCollection;
private readonly _coordinatesConverter: ICoordinatesConverter;
private _decorationsCache: { [decorationId: string]: ViewModelDecoration; };
......@@ -33,10 +35,11 @@ export class ViewModelDecorations implements IDisposable {
private _cachedModelDecorationsResolver: IDecorationsViewportData;
private _cachedModelDecorationsResolverViewRange: Range;
constructor(editorId: number, model: editorCommon.IModel, configuration: editorCommon.IConfiguration, coordinatesConverter: ICoordinatesConverter) {
constructor(editorId: number, model: editorCommon.IModel, configuration: editorCommon.IConfiguration, linesCollection: IViewModelLinesCollection, coordinatesConverter: ICoordinatesConverter) {
this.editorId = editorId;
this.model = model;
this.configuration = configuration;
this._linesCollection = linesCollection;
this._coordinatesConverter = coordinatesConverter;
this._decorationsCache = Object.create(null);
this._clearCachedModelDecorationsResolver();
......@@ -100,10 +103,9 @@ export class ViewModelDecorations implements IDisposable {
}
private _getDecorationsViewportData(viewportRange: Range): IDecorationsViewportData {
let viewportModelRange = this._coordinatesConverter.convertViewRangeToModelRange(viewportRange);
let startLineNumber = viewportRange.startLineNumber;
let endLineNumber = viewportRange.endLineNumber;
let modelDecorations = this.model.getDecorationsInRange(viewportModelRange, this.editorId, this.configuration.editor.readOnly);
const modelDecorations = this._linesCollection.getDecorationsInRange(viewportRange, this.editorId, this.configuration.editor.readOnly);
const startLineNumber = viewportRange.startLineNumber;
const endLineNumber = viewportRange.endLineNumber;
let decorationsInViewport: ViewModelDecoration[] = [], decorationsInViewportLen = 0;
let inlineDecorations: InlineDecoration[][] = [];
......
......@@ -82,7 +82,7 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel
this._isDisposing = false;
this._centeredViewLine = -1;
this.decorations = new ViewModelDecorations(this.editorId, this.model, this.configuration, this.coordinatesConverter);
this.decorations = new ViewModelDecorations(this.editorId, this.model, this.configuration, this.lines, this.coordinatesConverter);
this._register(this.model.addBulkListener((events: EmitterEvent[]) => {
if (this._isDisposing) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册