提交 bf8518de 编写于 作者: A Alex Dima

Have the view ask for indent guides in batches

上级 51d8f360
......@@ -96,10 +96,12 @@ export class IndentGuidesOverlay extends DynamicViewOverlay {
const lineHeight = this._lineHeight;
const indentGuideWidth = dom.computeScreenAwareSize(1);
const indents = this._context.model.getLinesIndentGuides(visibleStartLineNumber, visibleEndLineNumber);
let output: string[] = [];
for (let lineNumber = visibleStartLineNumber; lineNumber <= visibleEndLineNumber; lineNumber++) {
let lineIndex = lineNumber - visibleStartLineNumber;
let indent = this._context.model.getLineIndentGuide(lineNumber);
const lineIndex = lineNumber - visibleStartLineNumber;
const indent = indents[lineIndex];
let result = '';
let leftMostVisiblePosition = ctx.visibleRangeForPosition(new Position(lineNumber, 1));
......
......@@ -908,7 +908,7 @@ export interface ITokenizedModel extends ITextModel {
/**
* @internal
*/
getLineIndentGuide(lineNumber: number): number;
getLinesIndentGuides(startLineNumber: number, endLineNumber: number): number[];
}
/**
......
......@@ -855,6 +855,14 @@ export class TextModelWithTokens extends TextModel implements editorCommon.IToke
return this._getIndentRanges();
}
public getLinesIndentGuides(startLineNumber: number, endLineNumber: number): number[] {
let result: number[] = [];
for (let j = startLineNumber; j <= endLineNumber; j++) {
result[j - startLineNumber] = this.getLineIndentGuide(j);
}
return result;
}
public getLineIndentGuide(lineNumber: number): number {
this._assertNotDisposed();
if (lineNumber < 1 || lineNumber > this.getLineCount()) {
......
......@@ -79,7 +79,7 @@ export interface IViewModelLinesCollection {
getViewLineCount(): number;
warmUpLookupCache(viewStartLineNumber: number, viewEndLineNumber: number): void;
getViewLineIndentGuide(viewLineNumber: number): number;
getViewLinesIndentGuides(viewStartLineNumber: number, viewEndLineNumber: number): number[];
getViewLineContent(viewLineNumber: number): string;
getViewLineMinColumn(viewLineNumber: number): number;
getViewLineMaxColumn(viewLineNumber: number): number;
......@@ -499,11 +499,63 @@ export class SplitLinesCollection implements IViewModelLinesCollection {
this.prefixSumComputer.warmUpCache(viewStartLineNumber - 1, viewEndLineNumber - 1);
}
public getViewLineIndentGuide(viewLineNumber: number): number {
public getViewLinesIndentGuides(viewStartLineNumber: number, viewEndLineNumber: number): number[] {
this._ensureValidState();
viewLineNumber = this._toValidViewLineNumber(viewLineNumber);
let r = this.prefixSumComputer.getIndexOf(viewLineNumber - 1);
return this.model.getLineIndentGuide(r.index + 1);
viewStartLineNumber = this._toValidViewLineNumber(viewStartLineNumber);
viewEndLineNumber = this._toValidViewLineNumber(viewEndLineNumber);
const modelStart = this.convertViewPositionToModelPosition(viewStartLineNumber, this.getViewLineMinColumn(viewStartLineNumber));
const modelEnd = this.convertViewPositionToModelPosition(viewEndLineNumber, this.getViewLineMaxColumn(viewEndLineNumber));
let result: number[] = [];
let resultRepeatCount: number[] = [];
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()) {
let count = 0;
if (modelLineIndex === modelStartLineIndex) {
let viewLineStartIndex = line.getViewLineNumberOfModelPosition(0, modelStart.column);
let viewLineEndIndex = line.getViewLineNumberOfModelPosition(0, this.model.getLineMaxColumn(modelLineIndex + 1));
count = viewLineEndIndex - viewLineStartIndex + 1;
} else {
let viewLineStartIndex = line.getViewLineNumberOfModelPosition(0, 1);
let viewLineEndIndex = line.getViewLineNumberOfModelPosition(0, this.model.getLineMaxColumn(modelLineIndex + 1));
count = viewLineEndIndex - viewLineStartIndex + 1;
}
resultRepeatCount.push(count);
// merge into previous request
if (reqStart === null) {
reqStart = new Position(modelLineIndex + 1, 0);
}
} else {
// hit invisible line => flush request
if (reqStart !== null) {
result = result.concat(this.model.getLinesIndentGuides(reqStart.lineNumber, modelLineIndex));
reqStart = null;
}
}
}
if (reqStart !== null) {
result = result.concat(this.model.getLinesIndentGuides(reqStart.lineNumber, modelEnd.lineNumber));
reqStart = null;
}
const viewLineCount = viewEndLineNumber - viewStartLineNumber + 1;
let viewIndents = new Array<number>(viewLineCount);
let currIndex = 0;
for (let i = 0, len = result.length; i < len; i++) {
let value = result[i];
let count = Math.min(viewLineCount - currIndex, resultRepeatCount[i]);
for (let j = 0; j < count; j++) {
viewIndents[currIndex++] = value;
}
}
return viewIndents;
}
public getViewLineContent(viewLineNumber: number): string {
......@@ -1149,8 +1201,13 @@ export class IdentityLinesCollection implements IViewModelLinesCollection {
public warmUpLookupCache(viewStartLineNumber: number, viewEndLineNumber: number): void {
}
public getViewLineIndentGuide(viewLineNumber: number): number {
return 0;
public getViewLinesIndentGuides(viewStartLineNumber: number, viewEndLineNumber: number): number[] {
const viewLineCount = viewEndLineNumber - viewStartLineNumber + 1;
let result = new Array<number>(viewLineCount);
for (let i = 0; i < viewLineCount; i++) {
result[i] = 0;
}
return result;
}
public getViewLineContent(viewLineNumber: number): string {
......
......@@ -134,7 +134,7 @@ export interface IViewModel {
getTabSize(): number;
getLineCount(): number;
getLineContent(lineNumber: number): string;
getLineIndentGuide(lineNumber: number): number;
getLinesIndentGuides(startLineNumber: number, endLineNumber: number): number[];
getLineMinColumn(lineNumber: number): number;
getLineMaxColumn(lineNumber: number): number;
getLineFirstNonWhitespaceColumn(lineNumber: number): number;
......
......@@ -366,8 +366,8 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel
this.lines.warmUpLookupCache(startLineNumber, endLineNumber);
}
public getLineIndentGuide(lineNumber: number): number {
return this.lines.getViewLineIndentGuide(lineNumber);
public getLinesIndentGuides(startLineNumber: number, endLineNumber: number): number[] {
return this.lines.getViewLinesIndentGuides(startLineNumber, endLineNumber);
}
public getLineContent(lineNumber: number): string {
......
......@@ -136,15 +136,17 @@ suite('Editor ViewModel - SplitLinesCollection', () => {
assert.equal(linesCollection.getViewLineCount(), 6);
// getOutputIndentGuide
assert.equal(linesCollection.getViewLineIndentGuide(-1), 0);
assert.equal(linesCollection.getViewLineIndentGuide(0), 0);
assert.equal(linesCollection.getViewLineIndentGuide(1), 0);
assert.equal(linesCollection.getViewLineIndentGuide(2), 1);
assert.equal(linesCollection.getViewLineIndentGuide(3), 0);
assert.equal(linesCollection.getViewLineIndentGuide(4), 0);
assert.equal(linesCollection.getViewLineIndentGuide(5), 1);
assert.equal(linesCollection.getViewLineIndentGuide(6), 0);
assert.equal(linesCollection.getViewLineIndentGuide(7), 0);
assert.deepEqual(linesCollection.getViewLinesIndentGuides(-1, -1), [0]);
assert.deepEqual(linesCollection.getViewLinesIndentGuides(0, 0), [0]);
assert.deepEqual(linesCollection.getViewLinesIndentGuides(1, 1), [0]);
assert.deepEqual(linesCollection.getViewLinesIndentGuides(2, 2), [1]);
assert.deepEqual(linesCollection.getViewLinesIndentGuides(3, 3), [0]);
assert.deepEqual(linesCollection.getViewLinesIndentGuides(4, 4), [0]);
assert.deepEqual(linesCollection.getViewLinesIndentGuides(5, 5), [1]);
assert.deepEqual(linesCollection.getViewLinesIndentGuides(6, 6), [0]);
assert.deepEqual(linesCollection.getViewLinesIndentGuides(7, 7), [0]);
assert.deepEqual(linesCollection.getViewLinesIndentGuides(0, 7), [0, 1, 0, 0, 1, 0]);
// getOutputLineContent
assert.equal(linesCollection.getViewLineContent(-1), 'int main() {');
......
......@@ -2,4 +2,3 @@
--ui tdd
--timeout 10000
test/all.js
extensions/*/server/out/test/*.test.js
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册