Skip to content

Commit 4a40139

Browse files
committed
1 parent d806701 commit 4a40139

File tree

3 files changed

+24
-9
lines changed

3 files changed

+24
-9
lines changed

src/vs/editor/common/viewModel.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,11 @@ export interface ICoordinatesConverter {
210210
validateViewRange(viewRange: Range, expectedModelRange: Range): Range;
211211

212212
// Model -> View conversion and related methods
213-
convertModelPositionToViewPosition(modelPosition: Position, affinity?: PositionAffinity, allowZeroLineNumber?: boolean): Position;
213+
/**
214+
* @param allowZeroLineNumber Should it return 0 when there are hidden lines at the top and the position is in the hidden area?
215+
* @param belowHiddenRanges When the model position is in a hidden area, should it return the first view position after or before?
216+
*/
217+
convertModelPositionToViewPosition(modelPosition: Position, affinity?: PositionAffinity, allowZeroLineNumber?: boolean, belowHiddenRanges?: boolean): Position;
214218
/**
215219
* @param affinity Only has an effect if the range is empty.
216220
*/

src/vs/editor/common/viewModel/viewModelDecorations.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ export class ViewModelDecorations implements IDisposable {
8282
const options = modelDecoration.options;
8383
let viewRange: Range;
8484
if (options.isWholeLine) {
85-
const start = this._coordinatesConverter.convertModelPositionToViewPosition(new Position(modelRange.startLineNumber, 1), PositionAffinity.Left);
85+
const start = this._coordinatesConverter.convertModelPositionToViewPosition(new Position(modelRange.startLineNumber, 1), PositionAffinity.Left, false, true);
8686
const end = this._coordinatesConverter.convertModelPositionToViewPosition(new Position(modelRange.endLineNumber, this.model.getLineMaxColumn(modelRange.endLineNumber)), PositionAffinity.Right);
8787
viewRange = new Range(start.lineNumber, start.column, end.lineNumber, end.column);
8888
} else {

src/vs/editor/common/viewModel/viewModelLines.ts

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -830,16 +830,23 @@ export class ViewModelLinesFromProjectedModel implements IViewModelLines {
830830
return new Range(start.lineNumber, start.column, end.lineNumber, end.column);
831831
}
832832

833-
public convertModelPositionToViewPosition(_modelLineNumber: number, _modelColumn: number, affinity: PositionAffinity = PositionAffinity.None, allowZeroLineNumber: boolean = false): Position {
833+
public convertModelPositionToViewPosition(_modelLineNumber: number, _modelColumn: number, affinity: PositionAffinity = PositionAffinity.None, allowZeroLineNumber: boolean = false, belowHiddenRanges: boolean = false): Position {
834834

835835
const validPosition = this.model.validatePosition(new Position(_modelLineNumber, _modelColumn));
836836
const inputLineNumber = validPosition.lineNumber;
837837
const inputColumn = validPosition.column;
838838

839839
let lineIndex = inputLineNumber - 1, lineIndexChanged = false;
840-
while (lineIndex > 0 && !this.modelLineProjections[lineIndex].isVisible()) {
841-
lineIndex--;
842-
lineIndexChanged = true;
840+
if (belowHiddenRanges) {
841+
while (lineIndex < this.modelLineProjections.length && !this.modelLineProjections[lineIndex].isVisible()) {
842+
lineIndex++;
843+
lineIndexChanged = true;
844+
}
845+
} else {
846+
while (lineIndex > 0 && !this.modelLineProjections[lineIndex].isVisible()) {
847+
lineIndex--;
848+
lineIndexChanged = true;
849+
}
843850
}
844851
if (lineIndex === 0 && !this.modelLineProjections[lineIndex].isVisible()) {
845852
// Could not reach a real line
@@ -851,7 +858,11 @@ export class ViewModelLinesFromProjectedModel implements IViewModelLines {
851858

852859
let r: Position;
853860
if (lineIndexChanged) {
854-
r = this.modelLineProjections[lineIndex].getViewPositionOfModelPosition(deltaLineNumber, this.model.getLineMaxColumn(lineIndex + 1), affinity);
861+
if (belowHiddenRanges) {
862+
r = this.modelLineProjections[lineIndex].getViewPositionOfModelPosition(deltaLineNumber, 1, affinity);
863+
} else {
864+
r = this.modelLineProjections[lineIndex].getViewPositionOfModelPosition(deltaLineNumber, this.model.getLineMaxColumn(lineIndex + 1), affinity);
865+
}
855866
} else {
856867
r = this.modelLineProjections[inputLineNumber - 1].getViewPositionOfModelPosition(deltaLineNumber, inputColumn, affinity);
857868
}
@@ -1071,8 +1082,8 @@ class CoordinatesConverter implements ICoordinatesConverter {
10711082

10721083
// Model -> View conversion and related methods
10731084

1074-
public convertModelPositionToViewPosition(modelPosition: Position, affinity?: PositionAffinity, allowZero?: boolean): Position {
1075-
return this._lines.convertModelPositionToViewPosition(modelPosition.lineNumber, modelPosition.column, affinity, allowZero);
1085+
public convertModelPositionToViewPosition(modelPosition: Position, affinity?: PositionAffinity, allowZero?: boolean, belowHiddenRanges?: boolean): Position {
1086+
return this._lines.convertModelPositionToViewPosition(modelPosition.lineNumber, modelPosition.column, affinity, allowZero, belowHiddenRanges);
10761087
}
10771088

10781089
public convertModelRangeToViewRange(modelRange: Range, affinity?: PositionAffinity): Range {

0 commit comments

Comments
 (0)