From 3f315eda04964ebde47398bb13d8c2ef423c705a Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 13 Feb 2020 12:59:58 +0100 Subject: [PATCH] Deliver events only if sampled lines are affected --- .../browser/viewParts/minimap/minimap.ts | 49 ++++++++++++++----- 1 file changed, 36 insertions(+), 13 deletions(-) diff --git a/src/vs/editor/browser/viewParts/minimap/minimap.ts b/src/vs/editor/browser/viewParts/minimap/minimap.ts index 2b35d39d44a..a1613f550bc 100644 --- a/src/vs/editor/browser/viewParts/minimap/minimap.ts +++ b/src/vs/editor/browser/viewParts/minimap/minimap.ts @@ -562,15 +562,12 @@ export class Minimap extends ViewPart implements IMinimapModel { } public onLinesChanged(e: viewEvents.ViewLinesChangedEvent): boolean { if (this._isSampling) { - let fromLineIndex = this._modelLineToMinimapLine(e.fromLineNumber) - 1; - while (fromLineIndex > 0 && this._minimapLines[fromLineIndex - 1] >= e.fromLineNumber) { - fromLineIndex--; - } - let toLineIndex = this._modelLineToMinimapLine(e.toLineNumber) - 1; - while (toLineIndex + 1 < this._minimapLines.length && this._minimapLines[toLineIndex + 1] <= e.toLineNumber) { - toLineIndex++; + const minimapLineRange = this._modelLineRangeToMinimapLineRange(e.fromLineNumber, e.toLineNumber); + if (minimapLineRange) { + return this._actual.onLinesChanged(minimapLineRange[0], minimapLineRange[1]); + } else { + return false; } - return this._actual.onLinesChanged(fromLineIndex + 1, toLineIndex + 1); } else { return this._actual.onLinesChanged(e.fromLineNumber, e.toLineNumber); } @@ -630,12 +627,16 @@ export class Minimap extends ViewPart implements IMinimapModel { if (this._isSampling) { let ranges: { fromLineNumber: number; toLineNumber: number; }[] = []; for (const range of e.ranges) { - ranges.push({ - fromLineNumber: this._modelLineToMinimapLine(range.fromLineNumber), - toLineNumber: this._modelLineToMinimapLine(range.toLineNumber) - }); + const minimapLineRange = this._modelLineRangeToMinimapLineRange(range.fromLineNumber, range.toLineNumber); + if (minimapLineRange) { + ranges.push({ fromLineNumber: minimapLineRange[0], toLineNumber: minimapLineRange[1] }); + } + } + if (ranges.length) { + return this._actual.onTokensChanged(ranges); + } else { + return false; } - return this._actual.onTokensChanged(ranges); } else { return this._actual.onTokensChanged(e.ranges); } @@ -715,6 +716,28 @@ export class Minimap extends ViewPart implements IMinimapModel { return Math.min(this._minimapLines.length, Math.max(1, Math.round(lineNumber / this._samplingRatio))); } + /** + * Will return null if the model line ranges are not intersecting with a sampled model line. + */ + private _modelLineRangeToMinimapLineRange(fromLineNumber: number, toLineNumber: number): [number, number] | null { + let fromLineIndex = this._modelLineToMinimapLine(fromLineNumber) - 1; + while (fromLineIndex > 0 && this._minimapLines[fromLineIndex - 1] >= fromLineNumber) { + fromLineIndex--; + } + let toLineIndex = this._modelLineToMinimapLine(toLineNumber) - 1; + while (toLineIndex + 1 < this._minimapLines.length && this._minimapLines[toLineIndex + 1] <= toLineNumber) { + toLineIndex++; + } + if (fromLineIndex === toLineIndex) { + const sampledLineNumber = this._minimapLines[fromLineIndex]; + if (sampledLineNumber < fromLineNumber || sampledLineNumber > toLineNumber) { + // This line is not part of the sampled lines ==> nothing to do + return null; + } + } + return [fromLineIndex + 1, toLineIndex + 1]; + } + private _recomputeMinimapSelections(): void { this._minimapSelections = []; for (const selection of this._selections) { -- GitLab