Skip to content

Commit c3a2488

Browse files
committed
Add NearTopIfOutsideViewport and whats needed for that, microsoft#90068
1 parent aadc10f commit c3a2488

8 files changed

Lines changed: 45 additions & 8 deletions

File tree

src/vs/editor/browser/viewParts/lines/viewLines.ts

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -589,14 +589,19 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost<ViewLine>,
589589
if (boxEndY - boxStartY > viewportHeight) {
590590
// the box is larger than the viewport ... scroll to its top
591591
newScrollTop = boxStartY;
592-
} else if (verticalType === viewEvents.VerticalRevealType.NearTop) {
593-
// We want a gap that is 20% of the viewport, but with a minimum of 5 lines
594-
const desiredGapAbove = Math.max(5 * this._lineHeight, viewportHeight * 0.2);
595-
// Try to scroll just above the box with the desired gap
596-
const desiredScrollTop = boxStartY - desiredGapAbove;
597-
// But ensure that the box is not pushed out of viewport
598-
const minScrollTop = boxEndY - viewportHeight;
599-
newScrollTop = Math.max(minScrollTop, desiredScrollTop);
592+
} else if (verticalType === viewEvents.VerticalRevealType.NearTop || verticalType === viewEvents.VerticalRevealType.NearTopIfOutsideViewport) {
593+
if (verticalType === viewEvents.VerticalRevealType.NearTopIfOutsideViewport && viewportStartY <= boxStartY && boxEndY <= viewportEndY) {
594+
// Box is already in the viewport... do nothing
595+
newScrollTop = viewportStartY;
596+
} else {
597+
// We want a gap that is 20% of the viewport, but with a minimum of 5 lines
598+
const desiredGapAbove = Math.max(5 * this._lineHeight, viewportHeight * 0.2);
599+
// Try to scroll just above the box with the desired gap
600+
const desiredScrollTop = boxStartY - desiredGapAbove;
601+
// But ensure that the box is not pushed out of viewport
602+
const minScrollTop = boxEndY - viewportHeight;
603+
newScrollTop = Math.max(minScrollTop, desiredScrollTop);
604+
}
600605
} else if (verticalType === viewEvents.VerticalRevealType.Center || verticalType === viewEvents.VerticalRevealType.CenterIfOutsideViewport) {
601606
if (verticalType === viewEvents.VerticalRevealType.CenterIfOutsideViewport && viewportStartY <= boxStartY && boxEndY <= viewportEndY) {
602607
// Box is already in the viewport... do nothing

src/vs/editor/browser/widget/codeEditorWidget.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -756,6 +756,15 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE
756756
);
757757
}
758758

759+
public revealRangeNearTopIfOutsideViewport(range: IRange, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void {
760+
this._revealRange(
761+
range,
762+
VerticalRevealType.NearTopIfOutsideViewport,
763+
true,
764+
scrollType
765+
);
766+
}
767+
759768
public revealRangeAtTop(range: IRange, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void {
760769
this._revealRange(
761770
range,

src/vs/editor/browser/widget/diffEditorWidget.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -825,6 +825,10 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE
825825
this.modifiedEditor.revealRangeNearTop(range, scrollType);
826826
}
827827

828+
public revealRangeNearTopIfOutsideViewport(range: IRange, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void {
829+
this.modifiedEditor.revealRangeNearTopIfOutsideViewport(range, scrollType);
830+
}
831+
828832
public revealRangeAtTop(range: IRange, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Smooth): void {
829833
this.modifiedEditor.revealRangeAtTop(range, scrollType);
830834
}

src/vs/editor/common/editorCommon.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,12 @@ export interface IEditor {
467467
*/
468468
revealRangeNearTop(range: IRange, scrollType?: ScrollType): void;
469469

470+
/**
471+
* Scroll vertically or horizontally as necessary and reveal a range close to the top of the viewport,
472+
* optimized for viewing a code definition. Only if it lies outside the viewport.
473+
*/
474+
revealRangeNearTopIfOutsideViewport(range: IRange, scrollType?: ScrollType): void;
475+
470476
/**
471477
* Directly trigger a handler or an editor action.
472478
* @param source The source of the call.

src/vs/editor/common/view/viewEvents.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ export const enum VerticalRevealType {
195195
Top = 3,
196196
Bottom = 4,
197197
NearTop = 5,
198+
NearTopIfOutsideViewport = 6,
198199
}
199200

200201
export class ViewRevealRangeRequestEvent {

src/vs/monaco.d.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2307,6 +2307,11 @@ declare namespace monaco.editor {
23072307
* optimized for viewing a code definition.
23082308
*/
23092309
revealRangeNearTop(range: IRange, scrollType?: ScrollType): void;
2310+
/**
2311+
* Scroll vertically or horizontally as necessary and reveal a range close to the top of the viewport,
2312+
* optimized for viewing a code definition. Only if it lies outside the viewport.
2313+
*/
2314+
revealRangeNearTopIfOutsideViewport(range: IRange, scrollType?: ScrollType): void;
23102315
/**
23112316
* Directly trigger a handler or an editor action.
23122317
* @param source The source of the call.

src/vs/platform/editor/common/editor.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,11 @@ export const enum TextEditorSelectionRevealType {
228228
* Option to scroll vertically or horizontally as necessary and reveal a range close to the top of the viewport, but not quite at the top.
229229
*/
230230
NearTop = 2,
231+
/**
232+
* Option to scroll vertically or horizontally as necessary and reveal a range close to the top of the viewport, but not quite at the top.
233+
* Only if it lies outside the viewport
234+
*/
235+
NearTopIfOutsideViewport = 3,
231236
}
232237

233238
export interface ITextEditorOptions extends IEditorOptions {

src/vs/workbench/common/editor.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1209,6 +1209,8 @@ export class TextEditorOptions extends EditorOptions implements ITextEditorOptio
12091209

12101210
if (this.selectionRevealType === TextEditorSelectionRevealType.NearTop) {
12111211
editor.revealRangeNearTop(range, scrollType);
1212+
} else if (this.selectionRevealType === TextEditorSelectionRevealType.NearTopIfOutsideViewport) {
1213+
editor.revealRangeNearTopIfOutsideViewport(range, scrollType);
12121214
} else if (this.selectionRevealType === TextEditorSelectionRevealType.CenterIfOutsideViewport) {
12131215
editor.revealRangeInCenterIfOutsideViewport(range, scrollType);
12141216
} else {

0 commit comments

Comments
 (0)