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

Fixes #27187: Keep the top-most visible line constant

上级 7d2d20a3
......@@ -619,11 +619,6 @@ export interface ICodeEditor extends editorCommon.IEditor {
*/
getLayoutInfo(): editorOptions.EditorLayoutInfo;
/**
* Returns the range that is currently centered in the view port.
*/
getCenteredRangeInViewport(): Range;
/**
* Returns the ranges that are currently visible.
* Does not account for horizontal scrolling.
......
......@@ -253,13 +253,6 @@ export abstract class CommonCodeEditor extends Disposable {
}
}
public getCenteredRangeInViewport(): Range {
if (!this.hasView) {
return null;
}
return this.viewModel.getCenteredRangeInViewport();
}
public getVisibleRanges(): Range[] {
if (!this.hasView) {
return [];
......
......@@ -33,6 +33,7 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel
private readonly configuration: editorCommon.IConfiguration;
private readonly model: ITextModel;
private hasFocus: boolean;
private viewportStartLine: number;
private viewportStartLineTrackedRange: string;
private viewportStartLineTop: number;
private readonly lines: IViewModelLinesCollection;
......@@ -41,8 +42,6 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel
private readonly decorations: ViewModelDecorations;
private _centeredViewLine: number;
constructor(editorId: number, configuration: editorCommon.IConfiguration, model: ITextModel, scheduleAtNextAnimationFrame: (callback: () => void) => IDisposable) {
super();
......@@ -50,6 +49,7 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel
this.configuration = configuration;
this.model = model;
this.hasFocus = false;
this.viewportStartLine = -1;
this.viewportStartLineTrackedRange = null;
this.viewportStartLineTop = 0;
......@@ -89,8 +89,6 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel
}
}));
this._centeredViewLine = -1;
this.decorations = new ViewModelDecorations(this.editorId, this.model, this.configuration, this.lines, this.coordinatesConverter);
this._registerModelEvents();
......@@ -130,8 +128,12 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel
private _onConfigurationChanged(eventsCollector: viewEvents.ViewEventsCollector, e: IConfigurationChangedEvent): void {
// We might need to restore the current centered view range, so save it (if available)
const previousCenteredModelRange = this.getCenteredRangeInViewport();
let revealPreviousCenteredModelRange = false;
let previousViewportStartModelPosition: Position = null;
if (this.viewportStartLine !== -1) {
let previousViewportStartViewPosition = new Position(this.viewportStartLine, this.getLineMinColumn(this.viewportStartLine));
previousViewportStartModelPosition = this.coordinatesConverter.convertViewPositionToModelPosition(previousViewportStartViewPosition);
}
let restorePreviousViewportStart = false;
const conf = this.configuration.editor;
......@@ -144,7 +146,7 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel
if (this.viewLayout.getCurrentScrollTop() !== 0) {
// Never change the scroll position from 0 to something else...
revealPreviousCenteredModelRange = true;
restorePreviousViewportStart = true;
}
}
......@@ -157,17 +159,10 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel
eventsCollector.emit(new viewEvents.ViewConfigurationChangedEvent(e));
this.viewLayout.onConfigurationChanged(e);
if (revealPreviousCenteredModelRange && previousCenteredModelRange) {
// modelLine -> viewLine
const newCenteredViewRange = this.coordinatesConverter.convertModelRangeToViewRange(previousCenteredModelRange);
// Send a reveal event to restore the centered content
eventsCollector.emit(new viewEvents.ViewRevealRangeRequestEvent(
newCenteredViewRange,
viewEvents.VerticalRevealType.Center,
false,
editorCommon.ScrollType.Immediate
));
if (restorePreviousViewportStart && previousViewportStartModelPosition) {
const viewPosition = this.coordinatesConverter.convertModelPositionToViewPosition(previousViewportStartModelPosition);
const viewPositionTop = this.viewLayout.getVerticalOffsetForLineNumber(viewPosition.lineNumber);
this.viewLayout.deltaScrollNow(0, viewPositionTop - this.viewportStartLineTop);
}
}
......@@ -247,7 +242,7 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel
}
// Update the configuration and reset the centered view line
this._centeredViewLine = -1;
this.viewportStartLine = -1;
this.configuration.setMaxLineNumber(this.model.getLineCount());
// Recover viewport
......@@ -332,16 +327,6 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel
}
}
public getCenteredRangeInViewport(): Range {
if (this._centeredViewLine === -1) {
// Never got rendered or not rendered since last content change event
return null;
}
let viewLineNumber = this._centeredViewLine;
let currentCenteredViewRange = new Range(viewLineNumber, this.getLineMinColumn(viewLineNumber), viewLineNumber, this.getLineMaxColumn(viewLineNumber));
return this.coordinatesConverter.convertViewRangeToModelRange(currentCenteredViewRange);
}
public getVisibleRanges(): Range[] {
const visibleViewRange = this.getCompletelyVisibleViewRange();
const visibleRange = this.coordinatesConverter.convertViewRangeToModelRange(visibleViewRange);
......@@ -458,9 +443,9 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel
* Gives a hint that a lot of requests are about to come in for these line numbers.
*/
public setViewport(startLineNumber: number, endLineNumber: number, centeredLineNumber: number): void {
this._centeredViewLine = centeredLineNumber;
this.lines.warmUpLookupCache(startLineNumber, endLineNumber);
this.viewportStartLine = startLineNumber;
let position = this.coordinatesConverter.convertViewPositionToModelPosition(new Position(startLineNumber, this.getLineMinColumn(startLineNumber)));
this.viewportStartLineTrackedRange = this.model._setTrackedRange(this.viewportStartLineTrackedRange, new Range(position.lineNumber, position.column, position.lineNumber, position.column), TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges);
this.viewportStartLineTop = this.viewLayout.getVerticalOffsetForLineNumber(startLineNumber);
......
......@@ -3782,10 +3782,6 @@ declare namespace monaco.editor {
* Get the layout info for the editor.
*/
getLayoutInfo(): EditorLayoutInfo;
/**
* Returns the range that is currently centered in the view port.
*/
getCenteredRangeInViewport(): Range;
/**
* Returns the ranges that are currently visible.
* Does not account for horizontal scrolling.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册