Skip to content

Commit 0397ca4

Browse files
author
Aiday Marlen Kyzy
authored
Merge pull request microsoft#156562 from microsoft/alexd/sticky-scroll-improvements
Sticky Scroll Improvements
2 parents 8ced34c + 463d53f commit 0397ca4

File tree

7 files changed

+29
-42
lines changed

7 files changed

+29
-42
lines changed

src/vs/editor/browser/editorBrowser.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -899,10 +899,15 @@ export interface ICodeEditor extends editorCommon.IEditor {
899899
getWhitespaces(): IEditorWhitespace[];
900900

901901
/**
902-
* Get the vertical position (top offset) for the line w.r.t. to the first line.
902+
* Get the vertical position (top offset) for the line's top w.r.t. to the first line.
903903
*/
904904
getTopForLineNumber(lineNumber: number): number;
905905

906+
/**
907+
* Get the vertical position (top offset) for the line's bottom w.r.t. to the first line.
908+
*/
909+
getBottomForLineNumber(lineNumber: number): number;
910+
906911
/**
907912
* Get the vertical position (top offset) for the position w.r.t. to the first line.
908913
*/

src/vs/editor/common/viewLayout/viewLinesViewportData.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ export class ViewportData {
7070
}
7171

7272
public getViewLineRenderingData(lineNumber: number): ViewLineRenderingData {
73-
return this._model.getViewLineRenderingData(this.visibleRange, lineNumber);
73+
return this._model.getViewportViewLineRenderingData(this.visibleRange, lineNumber);
7474
}
7575

7676
public getDecorationsInViewport(): ViewModelDecoration[] {

src/vs/editor/common/viewModel.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ export interface IViewModel extends ICursorSimpleModel {
4141
onCompositionEnd(): void;
4242

4343
getDecorationsInViewport(visibleRange: Range): ViewModelDecoration[];
44-
getViewLineRenderingData(visibleRange: Range, lineNumber: number): ViewLineRenderingData;
44+
getViewportViewLineRenderingData(visibleRange: Range, lineNumber: number): ViewLineRenderingData;
4545
getViewLineData(lineNumber: number): ViewLineData;
4646
getMinimapLinesRenderingData(startLineNumber: number, endLineNumber: number, needed: boolean[]): MinimapLinesRenderingData;
4747
getCompletelyVisibleViewRange(): Range;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -679,7 +679,7 @@ export class ViewModel extends Disposable implements IViewModel {
679679
return this._lines.getInjectedTextAt(viewPosition);
680680
}
681681

682-
public getViewLineRenderingData(visibleRange: Range, lineNumber: number): ViewLineRenderingData {
682+
public getViewportViewLineRenderingData(visibleRange: Range, lineNumber: number): ViewLineRenderingData {
683683
const mightContainRTL = this.model.mightContainRTL();
684684
const mightContainNonBasicASCII = this.model.mightContainNonBasicASCII();
685685
const tabSize = this.getTabSize();

src/vs/editor/contrib/stickyScroll/browser/stickyScroll.ts

Lines changed: 9 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,6 @@ import { LineDecoration } from 'vs/editor/common/viewLayout/lineDecorations';
1919
import { RunOnceScheduler } from 'vs/base/common/async';
2020
import { IModelTokensChangedEvent } from 'vs/editor/common/textModelEvents';
2121

22-
const enum ScrollDirection {
23-
Down = 0,
24-
Up = 1,
25-
None = 2
26-
}
27-
2822
class StickyScrollController extends Disposable implements IEditorContribution {
2923

3024
static readonly ID = 'store.contrib.stickyScrollController';
@@ -36,7 +30,6 @@ class StickyScrollController extends Disposable implements IEditorContribution {
3630
private _ranges: [number, number, number][] = [];
3731
private _rangesVersionId: number = 0;
3832
private _cts: CancellationTokenSource | undefined;
39-
private _lastScrollPosition: number = -1;
4033
private readonly _updateSoon: RunOnceScheduler;
4134

4235
constructor(
@@ -191,42 +184,27 @@ class StickyScrollController extends Disposable implements IEditorContribution {
191184
return;
192185
}
193186
const scrollTop = this._editor.getScrollTop();
194-
let scrollDirection: ScrollDirection;
195-
if (this._lastScrollPosition < scrollTop) {
196-
scrollDirection = ScrollDirection.Down;
197-
} else {
198-
scrollDirection = ScrollDirection.Up;
199-
}
200-
this._lastScrollPosition = scrollTop;
201187

202-
const scrollToBottomOfWidget = this._editor.getScrollTop() + this.stickyScrollWidget.codeLineCount * lineHeight;
203188
this.stickyScrollWidget.emptyRootNode();
204189
const beginningLinesConsidered: Set<number> = new Set<number>();
205-
let topOfElementAtDepth: number;
206-
let bottomOfElementAtDepth: number;
207-
let bottomOfBeginningLine: number;
208-
let topOfEndLine: number;
209-
let bottomOfEndLine: number;
210190

211191
for (const [index, arr] of this._ranges.entries()) {
212192
const [start, end, depth] = arr;
213193
if (end - start > 0 && model.getLineContent(start) !== '') {
214-
topOfElementAtDepth = this._editor.getScrollTop() + (depth - 1) * lineHeight;
215-
bottomOfElementAtDepth = this._editor.getScrollTop() + depth * lineHeight;
216-
bottomOfBeginningLine = start * lineHeight;
217-
topOfEndLine = (end - 1) * lineHeight;
218-
bottomOfEndLine = end * lineHeight;
194+
const topOfElementAtDepth = (depth - 1) * lineHeight;
195+
const bottomOfElementAtDepth = depth * lineHeight;
196+
197+
const bottomOfBeginningLine = this._editor.getBottomForLineNumber(start) - scrollTop;
198+
const topOfEndLine = this._editor.getTopForLineNumber(end) - scrollTop;
199+
const bottomOfEndLine = this._editor.getBottomForLineNumber(end) - scrollTop;
200+
219201
if (!beginningLinesConsidered.has(start)) {
220202
if (topOfElementAtDepth >= topOfEndLine - 1 && topOfElementAtDepth < bottomOfEndLine - 2) {
221203
beginningLinesConsidered.add(start);
222204
this.stickyScrollWidget.pushCodeLine(new StickyScrollCodeLine(model.getLineContent(start), start, this._editor, -1, bottomOfEndLine - bottomOfElementAtDepth));
223205
break;
224206
}
225-
else if (scrollDirection === ScrollDirection.Down && bottomOfElementAtDepth > bottomOfBeginningLine - 1 && bottomOfElementAtDepth < bottomOfEndLine - 1) {
226-
beginningLinesConsidered.add(start);
227-
this.stickyScrollWidget.pushCodeLine(new StickyScrollCodeLine(model.getLineContent(start), start, this._editor, 0, 0));
228-
} else if (scrollDirection === ScrollDirection.Up && scrollToBottomOfWidget > bottomOfBeginningLine - 1 && scrollToBottomOfWidget < bottomOfEndLine ||
229-
scrollDirection === ScrollDirection.Up && bottomOfElementAtDepth > bottomOfBeginningLine && bottomOfElementAtDepth < topOfEndLine - 1) {
207+
else if (bottomOfElementAtDepth > bottomOfBeginningLine - 1 && bottomOfElementAtDepth < bottomOfEndLine - 1) {
230208
beginningLinesConsidered.add(start);
231209
this.stickyScrollWidget.pushCodeLine(new StickyScrollCodeLine(model.getLineContent(start), start, this._editor, 0, 0));
232210
}
@@ -262,7 +240,7 @@ class StickyScrollCodeLine {
262240
getDomNode() {
263241

264242
const root: HTMLElement = document.createElement('div');
265-
const lineRenderingData = this._editor._getViewModel().getViewLineRenderingData(this._editor.getVisibleRangesPlusViewportAboveBelow()[0], this._lineNumber);
243+
const lineRenderingData = this._editor._getViewModel().getViewportViewLineRenderingData(this._editor.getVisibleRangesPlusViewportAboveBelow()[0], this._lineNumber);
266244

267245
let actualInlineDecorations: LineDecoration[];
268246
try {

src/vs/editor/test/browser/viewModel/viewModelDecorations.test.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ suite('ViewModelDecorations', () => {
9797
'dec14',
9898
]);
9999

100-
const inlineDecorations1 = viewModel.getViewLineRenderingData(
100+
const inlineDecorations1 = viewModel.getViewportViewLineRenderingData(
101101
new Range(1, viewModel.getLineMinColumn(1), 2, viewModel.getLineMaxColumn(2)),
102102
1
103103
).inlineDecorations;
@@ -118,7 +118,7 @@ suite('ViewModelDecorations', () => {
118118
new InlineDecoration(new Range(1, 2, 1, 2), 'b-dec5', InlineDecorationType.Before),
119119
]);
120120

121-
const inlineDecorations2 = viewModel.getViewLineRenderingData(
121+
const inlineDecorations2 = viewModel.getViewportViewLineRenderingData(
122122
new Range(2, viewModel.getLineMinColumn(2), 3, viewModel.getLineMaxColumn(3)),
123123
2
124124
).inlineDecorations;
@@ -148,7 +148,7 @@ suite('ViewModelDecorations', () => {
148148
new InlineDecoration(new Range(2, 3, 2, 3), 'b-dec12', InlineDecorationType.Before),
149149
]);
150150

151-
const inlineDecorations3 = viewModel.getViewLineRenderingData(
151+
const inlineDecorations3 = viewModel.getViewportViewLineRenderingData(
152152
new Range(2, viewModel.getLineMinColumn(2), 3, viewModel.getLineMaxColumn(3)),
153153
3
154154
).inlineDecorations;
@@ -198,13 +198,13 @@ suite('ViewModelDecorations', () => {
198198
).filter(x => Boolean(x.options.beforeContentClassName));
199199
assert.deepStrictEqual(decorations, []);
200200

201-
const inlineDecorations1 = viewModel.getViewLineRenderingData(
201+
const inlineDecorations1 = viewModel.getViewportViewLineRenderingData(
202202
new Range(2, viewModel.getLineMinColumn(2), 3, viewModel.getLineMaxColumn(3)),
203203
2
204204
).inlineDecorations;
205205
assert.deepStrictEqual(inlineDecorations1, []);
206206

207-
const inlineDecorations2 = viewModel.getViewLineRenderingData(
207+
const inlineDecorations2 = viewModel.getViewportViewLineRenderingData(
208208
new Range(2, viewModel.getLineMinColumn(2), 3, viewModel.getLineMaxColumn(3)),
209209
3
210210
).inlineDecorations;
@@ -229,7 +229,7 @@ suite('ViewModelDecorations', () => {
229229
);
230230
});
231231

232-
const inlineDecorations = viewModel.getViewLineRenderingData(
232+
const inlineDecorations = viewModel.getViewportViewLineRenderingData(
233233
new Range(1, 1, 1, 1),
234234
1
235235
).inlineDecorations;

src/vs/monaco.d.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5372,9 +5372,13 @@ declare namespace monaco.editor {
53725372
*/
53735373
getVisibleRanges(): Range[];
53745374
/**
5375-
* Get the vertical position (top offset) for the line w.r.t. to the first line.
5375+
* Get the vertical position (top offset) for the line's top w.r.t. to the first line.
53765376
*/
53775377
getTopForLineNumber(lineNumber: number): number;
5378+
/**
5379+
* Get the vertical position (top offset) for the line's bottom w.r.t. to the first line.
5380+
*/
5381+
getBottomForLineNumber(lineNumber: number): number;
53785382
/**
53795383
* Get the vertical position (top offset) for the position w.r.t. to the first line.
53805384
*/

0 commit comments

Comments
 (0)