Skip to content

Commit 640b3d1

Browse files
committed
Reduce API surface of ICursors and of CursorContext
1 parent e7c7de7 commit 640b3d1

14 files changed

Lines changed: 77 additions & 88 deletions

File tree

src/vs/editor/browser/controller/coreCommands.ts

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -495,7 +495,7 @@ export namespace CoreNavigationCommands {
495495
this._runCursorMove(cursors, args.source, parsed);
496496
}
497497

498-
_runCursorMove(cursors: ICursors, source: string | null | undefined, args: CursorMove_.ParsedArguments): void {
498+
private _runCursorMove(cursors: ICursors, source: string | null | undefined, args: CursorMove_.ParsedArguments): void {
499499
cursors.context.model.pushStackElement();
500500
cursors.setStates(
501501
source,
@@ -540,9 +540,9 @@ export namespace CoreNavigationCommands {
540540

541541
class CursorMoveBasedCommand extends CoreEditorCommand {
542542

543-
private readonly _staticArgs: CursorMove_.ParsedArguments;
543+
private readonly _staticArgs: CursorMove_.SimpleMoveArguments;
544544

545-
constructor(opts: ICommandOptions & { args: CursorMove_.ParsedArguments }) {
545+
constructor(opts: ICommandOptions & { args: CursorMove_.SimpleMoveArguments }) {
546546
super(opts);
547547
this._staticArgs = opts.args;
548548
}
@@ -558,7 +558,14 @@ export namespace CoreNavigationCommands {
558558
value: cursors.context.config.pageSize
559559
};
560560
}
561-
CursorMove._runCursorMove(cursors, dynamicArgs.source, args);
561+
562+
cursors.context.model.pushStackElement();
563+
cursors.setStates(
564+
dynamicArgs.source,
565+
CursorChangeReason.Explicit,
566+
CursorMoveCommands.simpleMove(cursors.context, cursors.getAll(), args.direction, args.select, args.value, args.unit)
567+
);
568+
cursors.reveal(dynamicArgs.source, true, RevealTarget.Primary, ScrollType.Smooth);
562569
}
563570
}
564571

@@ -1170,14 +1177,15 @@ export namespace CoreNavigationCommands {
11701177
);
11711178
}
11721179

1173-
cursors.scrollTo(desiredScrollTop);
1180+
editor.setScrollTop(desiredScrollTop, ScrollType.Smooth);
11741181
}
11751182

11761183
private _computeDesiredScrollTop(editor: ICodeEditor, context: CursorContext, args: EditorScroll_.ParsedArguments): number {
11771184

11781185
if (args.unit === EditorScroll_.Unit.Line) {
11791186
// scrolling by model lines
1180-
const visibleModelRange = context.getCompletelyVisibleModelRange();
1187+
const visibleViewRange = context.getCompletelyVisibleViewRange();
1188+
const visibleModelRange = context.convertViewRangeToModelRange(visibleViewRange);
11811189

11821190
let desiredTopModelLineNumber: number;
11831191
if (args.direction === EditorScroll_.Direction.Up) {

src/vs/editor/browser/editorBrowser.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -616,15 +616,15 @@ export interface ICodeEditor extends editorCommon.IEditor {
616616
/**
617617
* Change the scrollLeft of the editor's viewport.
618618
*/
619-
setScrollLeft(newScrollLeft: number): void;
619+
setScrollLeft(newScrollLeft: number, scrollType?: editorCommon.ScrollType): void;
620620
/**
621621
* Change the scrollTop of the editor's viewport.
622622
*/
623-
setScrollTop(newScrollTop: number): void;
623+
setScrollTop(newScrollTop: number, scrollType?: editorCommon.ScrollType): void;
624624
/**
625625
* Change the scroll position of the editor's viewport.
626626
*/
627-
setScrollPosition(position: editorCommon.INewScrollPosition): void;
627+
setScrollPosition(position: editorCommon.INewScrollPosition, scrollType?: editorCommon.ScrollType): void;
628628

629629
/**
630630
* Get an action that is a contribution to this editor.

src/vs/editor/browser/view/viewImpl.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ import { ViewZones } from 'vs/editor/browser/viewParts/viewZones/viewZones';
3939
import { Cursor } from 'vs/editor/common/controller/cursor';
4040
import { Position } from 'vs/editor/common/core/position';
4141
import { Range } from 'vs/editor/common/core/range';
42-
import { IConfiguration } from 'vs/editor/common/editorCommon';
42+
import { IConfiguration, ScrollType } from 'vs/editor/common/editorCommon';
4343
import { RenderingContext } from 'vs/editor/common/view/renderingContext';
4444
import { ViewContext } from 'vs/editor/common/view/viewContext';
4545
import { ViewEventDispatcher } from 'vs/editor/common/view/viewEventDispatcher';
@@ -445,11 +445,11 @@ export class View extends ViewEventHandler {
445445
}
446446

447447
public restoreState(scrollPosition: { scrollLeft: number; scrollTop: number; }): void {
448-
this._context.viewLayout.setScrollPositionNow({ scrollTop: scrollPosition.scrollTop });
448+
this._context.viewLayout.setScrollPosition({ scrollTop: scrollPosition.scrollTop }, ScrollType.Immediate);
449449
this._context.model.tokenizeViewport();
450450
this._renderNow();
451451
this.viewLines.updateLineWidths();
452-
this._context.viewLayout.setScrollPositionNow({ scrollLeft: scrollPosition.scrollLeft });
452+
this._context.viewLayout.setScrollPosition({ scrollLeft: scrollPosition.scrollLeft }, ScrollType.Immediate);
453453
}
454454

455455
public getOffsetForColumn(modelLineNumber: number, modelColumn: number): number {

src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { IMouseEvent } from 'vs/base/browser/mouseEvent';
99
import { IOverviewRulerLayoutInfo, SmoothScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement';
1010
import { ScrollableElementChangeOptions, ScrollableElementCreationOptions } from 'vs/base/browser/ui/scrollbar/scrollableElementOptions';
1111
import { PartFingerprint, PartFingerprints, ViewPart } from 'vs/editor/browser/view/viewPart';
12-
import { INewScrollPosition } from 'vs/editor/common/editorCommon';
12+
import { INewScrollPosition, ScrollType } from 'vs/editor/common/editorCommon';
1313
import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext';
1414
import { ViewContext } from 'vs/editor/common/view/viewContext';
1515
import * as viewEvents from 'vs/editor/common/view/viewEvents';
@@ -88,7 +88,7 @@ export class EditorScrollbar extends ViewPart {
8888
}
8989
}
9090

91-
this._context.viewLayout.setScrollPositionNow(newScrollPosition);
91+
this._context.viewLayout.setScrollPosition(newScrollPosition, ScrollType.Immediate);
9292
};
9393

9494
// I've seen this happen both on the view dom node & on the lines content dom node.

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

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -281,11 +281,8 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost<ViewLine>,
281281
}
282282

283283
const scrollTopDelta = Math.abs(this._context.viewLayout.getCurrentScrollTop() - newScrollPosition.scrollTop);
284-
if (e.scrollType === ScrollType.Smooth && scrollTopDelta > this._lineHeight) {
285-
this._context.viewLayout.setScrollPositionSmooth(newScrollPosition);
286-
} else {
287-
this._context.viewLayout.setScrollPositionNow(newScrollPosition);
288-
}
284+
const scrollType = (scrollTopDelta <= this._lineHeight ? ScrollType.Immediate : e.scrollType);
285+
this._context.viewLayout.setScrollPosition(newScrollPosition, scrollType);
289286

290287
return true;
291288
}
@@ -590,15 +587,9 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost<ViewLine>,
590587
this._ensureMaxLineWidth(newScrollLeft.maxHorizontalOffset);
591588
}
592589
// set `scrollLeft`
593-
if (horizontalRevealRequest.scrollType === ScrollType.Smooth) {
594-
this._context.viewLayout.setScrollPositionSmooth({
595-
scrollLeft: newScrollLeft.scrollLeft
596-
});
597-
} else {
598-
this._context.viewLayout.setScrollPositionNow({
599-
scrollLeft: newScrollLeft.scrollLeft
600-
});
601-
}
590+
this._context.viewLayout.setScrollPosition({
591+
scrollLeft: newScrollLeft.scrollLeft
592+
}, horizontalRevealRequest.scrollType);
602593
}
603594
}
604595
}

src/vs/editor/browser/viewParts/minimap/minimap.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1022,9 +1022,9 @@ export class Minimap extends ViewPart implements IMinimapModel {
10221022
}
10231023

10241024
public setScrollTop(scrollTop: number): void {
1025-
this._context.viewLayout.setScrollPositionNow({
1025+
this._context.viewLayout.setScrollPosition({
10261026
scrollTop: scrollTop
1027-
});
1027+
}, ScrollType.Immediate);
10281028
}
10291029

10301030
//#endregion

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -857,33 +857,33 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE
857857
return this._modelData.viewModel.viewLayout.getCurrentScrollTop();
858858
}
859859

860-
public setScrollLeft(newScrollLeft: number): void {
860+
public setScrollLeft(newScrollLeft: number, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Immediate): void {
861861
if (!this._modelData) {
862862
return;
863863
}
864864
if (typeof newScrollLeft !== 'number') {
865865
throw new Error('Invalid arguments');
866866
}
867-
this._modelData.viewModel.viewLayout.setScrollPositionNow({
867+
this._modelData.viewModel.viewLayout.setScrollPosition({
868868
scrollLeft: newScrollLeft
869-
});
869+
}, scrollType);
870870
}
871-
public setScrollTop(newScrollTop: number): void {
871+
public setScrollTop(newScrollTop: number, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Immediate): void {
872872
if (!this._modelData) {
873873
return;
874874
}
875875
if (typeof newScrollTop !== 'number') {
876876
throw new Error('Invalid arguments');
877877
}
878-
this._modelData.viewModel.viewLayout.setScrollPositionNow({
878+
this._modelData.viewModel.viewLayout.setScrollPosition({
879879
scrollTop: newScrollTop
880-
});
880+
}, scrollType);
881881
}
882-
public setScrollPosition(position: editorCommon.INewScrollPosition): void {
882+
public setScrollPosition(position: editorCommon.INewScrollPosition, scrollType: editorCommon.ScrollType = editorCommon.ScrollType.Immediate): void {
883883
if (!this._modelData) {
884884
return;
885885
}
886-
this._modelData.viewModel.viewLayout.setScrollPositionNow(position);
886+
this._modelData.viewModel.viewLayout.setScrollPosition(position, scrollType);
887887
}
888888

889889
public saveViewState(): editorCommon.ICodeEditorViewState | null {

src/vs/editor/common/controller/cursor.ts

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { onUnexpectedError } from 'vs/base/common/errors';
77
import { Emitter, Event } from 'vs/base/common/event';
88
import * as strings from 'vs/base/common/strings';
99
import { CursorCollection } from 'vs/editor/common/controller/cursorCollection';
10-
import { CursorColumns, CursorConfiguration, CursorContext, CursorState, EditOperationResult, EditOperationType, IColumnSelectData, ICursors, PartialCursorState, RevealTarget } from 'vs/editor/common/controller/cursorCommon';
10+
import { CursorColumns, CursorConfiguration, CursorContext, CursorState, EditOperationResult, EditOperationType, IColumnSelectData, ICursors, PartialCursorState, RevealTarget, IReducedViewModel } from 'vs/editor/common/controller/cursorCommon';
1111
import { DeleteOperations } from 'vs/editor/common/controller/cursorDeleteOperations';
1212
import { CursorChangeReason } from 'vs/editor/common/controller/cursorEvents';
1313
import { TypeOperations, TypeWithAutoClosingCommand } from 'vs/editor/common/controller/cursorTypeOperations';
@@ -18,7 +18,6 @@ import * as editorCommon from 'vs/editor/common/editorCommon';
1818
import { ITextModel, TrackedRangeStickiness, IModelDeltaDecoration, ICursorStateComputer, IIdentifiedSingleEditOperation, IValidEditOperation } from 'vs/editor/common/model';
1919
import { RawContentChangedType, ModelRawContentChangedEvent } from 'vs/editor/common/model/textModelEvents';
2020
import * as viewEvents from 'vs/editor/common/view/viewEvents';
21-
import { IViewModel } from 'vs/editor/common/viewModel/viewModel';
2221
import { dispose } from 'vs/base/common/lifecycle';
2322
import { EditorOption } from 'vs/editor/common/config/editorOptions';
2423

@@ -182,7 +181,7 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors {
182181
private readonly _configuration: editorCommon.IConfiguration;
183182
private readonly _model: ITextModel;
184183
private _knownModelVersionId: number;
185-
private readonly _viewModel: IViewModel;
184+
private readonly _viewModel: IReducedViewModel;
186185
public context: CursorContext;
187186
private _cursors: CursorCollection;
188187

@@ -194,7 +193,7 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors {
194193
private _autoClosedActions: AutoClosedAction[];
195194
private _prevEditOperationType: EditOperationType;
196195

197-
constructor(configuration: editorCommon.IConfiguration, model: ITextModel, viewModel: IViewModel) {
196+
constructor(configuration: editorCommon.IConfiguration, model: ITextModel, viewModel: IReducedViewModel) {
198197
super();
199198
this._configuration = configuration;
200199
this._model = model;
@@ -326,12 +325,6 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors {
326325
this.emitCursorRevealRange(source, viewRange, null, verticalType, revealHorizontal, scrollType);
327326
}
328327

329-
public scrollTo(desiredScrollTop: number): void {
330-
this._viewModel.viewLayout.setScrollPositionSmooth({
331-
scrollTop: desiredScrollTop
332-
});
333-
}
334-
335328
public saveState(): editorCommon.ICursorState[] {
336329

337330
let result: editorCommon.ICursorState[] = [];

src/vs/editor/common/controller/cursorCommon.ts

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ import { TextModel } from 'vs/editor/common/model/textModel';
1717
import { LanguageIdentifier } from 'vs/editor/common/modes';
1818
import { IAutoClosingPair, StandardAutoClosingPairConditional } from 'vs/editor/common/modes/languageConfiguration';
1919
import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageConfigurationRegistry';
20-
import { VerticalRevealType } from 'vs/editor/common/view/viewEvents';
21-
import { IViewModel, ICoordinatesConverter } from 'vs/editor/common/viewModel/viewModel';
20+
import { VerticalRevealType, IViewEventEmitter } from 'vs/editor/common/view/viewEvents';
21+
import { ICoordinatesConverter } from 'vs/editor/common/viewModel/viewModel';
2222
import { Constants } from 'vs/base/common/uint';
2323

2424
export interface IColumnSelectData {
@@ -59,8 +59,6 @@ export interface ICursors {
5959
reveal(source: string | null | undefined, horizontal: boolean, target: RevealTarget, scrollType: ScrollType): void;
6060
revealRange(source: string | null | undefined, revealHorizontal: boolean, viewRange: Range, verticalType: VerticalRevealType, scrollType: ScrollType): void;
6161

62-
scrollTo(desiredScrollTop: number): void;
63-
6462
getPrevEditOperationType(): EditOperationType;
6563
setPrevEditOperationType(type: EditOperationType): void;
6664
}
@@ -353,7 +351,7 @@ export class SingleCursorState {
353351
}
354352
}
355353

356-
export interface IReducedViewModel extends ICursorSimpleModel {
354+
export interface IReducedViewModel extends ICursorSimpleModel, IViewEventEmitter {
357355
readonly coordinatesConverter: ICoordinatesConverter;
358356

359357
getCompletelyVisibleViewRange(): Range;
@@ -368,7 +366,7 @@ export class CursorContext {
368366
public readonly viewModel: IReducedViewModel;
369367
public readonly config: CursorConfiguration;
370368

371-
constructor(configuration: IConfiguration, model: ITextModel, viewModel: IViewModel) {
369+
constructor(configuration: IConfiguration, model: ITextModel, viewModel: IReducedViewModel) {
372370
this.model = model;
373371
this.viewModel = viewModel;
374372
this.config = new CursorConfiguration(
@@ -406,11 +404,6 @@ export class CursorContext {
406404
return this.viewModel.getCompletelyVisibleViewRange();
407405
}
408406

409-
public getCompletelyVisibleModelRange(): Range {
410-
const viewRange = this.viewModel.getCompletelyVisibleViewRange();
411-
return this.viewModel.coordinatesConverter.convertViewRangeToModelRange(viewRange);
412-
}
413-
414407
public getCompletelyVisibleViewRangeAtScrollTop(scrollTop: number): Range {
415408
return this.viewModel.getCompletelyVisibleViewRangeAtScrollTop(scrollTop);
416409
}

src/vs/editor/common/controller/cursorMoveCommands.ts

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ export class CursorMoveCommands {
258258
return CursorState.fromViewState(cursor.viewState.move(inSelectionMode, viewPosition.lineNumber, viewPosition.column, 0));
259259
}
260260

261-
public static simpleMove(context: CursorContext, cursors: CursorState[], direction: CursorMove.MoveDirection, inSelectionMode: boolean, value: number, unit: CursorMove.Unit): PartialCursorState[] | null {
261+
public static simpleMove(context: CursorContext, cursors: CursorState[], direction: CursorMove.SimpleMoveDirection, inSelectionMode: boolean, value: number, unit: CursorMove.Unit): PartialCursorState[] | null {
262262
switch (direction) {
263263
case CursorMove.Direction.Left: {
264264
if (unit === CursorMove.Unit.HalfLine) {
@@ -322,34 +322,31 @@ export class CursorMoveCommands {
322322
}
323323

324324
public static viewportMove(context: CursorContext, cursors: CursorState[], direction: CursorMove.ViewportDirection, inSelectionMode: boolean, value: number): PartialCursorState[] | null {
325+
const visibleViewRange = context.getCompletelyVisibleViewRange();
325326
switch (direction) {
326327
case CursorMove.Direction.ViewPortTop: {
327328
// Move to the nth line start in the viewport (from the top)
328-
const cursor = cursors[0];
329-
const visibleModelRange = context.getCompletelyVisibleModelRange();
329+
const visibleModelRange = context.convertViewRangeToModelRange(visibleViewRange);
330330
const modelLineNumber = this._firstLineNumberInRange(context.model, visibleModelRange, value);
331331
const modelColumn = context.model.getLineFirstNonWhitespaceColumn(modelLineNumber);
332-
return [this._moveToModelPosition(context, cursor, inSelectionMode, modelLineNumber, modelColumn)];
332+
return [this._moveToModelPosition(context, cursors[0], inSelectionMode, modelLineNumber, modelColumn)];
333333
}
334334
case CursorMove.Direction.ViewPortBottom: {
335335
// Move to the nth line start in the viewport (from the bottom)
336-
const cursor = cursors[0];
337-
const visibleModelRange = context.getCompletelyVisibleModelRange();
336+
const visibleModelRange = context.convertViewRangeToModelRange(visibleViewRange);
338337
const modelLineNumber = this._lastLineNumberInRange(context.model, visibleModelRange, value);
339338
const modelColumn = context.model.getLineFirstNonWhitespaceColumn(modelLineNumber);
340-
return [this._moveToModelPosition(context, cursor, inSelectionMode, modelLineNumber, modelColumn)];
339+
return [this._moveToModelPosition(context, cursors[0], inSelectionMode, modelLineNumber, modelColumn)];
341340
}
342341
case CursorMove.Direction.ViewPortCenter: {
343342
// Move to the line start in the viewport center
344-
const cursor = cursors[0];
345-
const visibleModelRange = context.getCompletelyVisibleModelRange();
343+
const visibleModelRange = context.convertViewRangeToModelRange(visibleViewRange);
346344
const modelLineNumber = Math.round((visibleModelRange.startLineNumber + visibleModelRange.endLineNumber) / 2);
347345
const modelColumn = context.model.getLineFirstNonWhitespaceColumn(modelLineNumber);
348-
return [this._moveToModelPosition(context, cursor, inSelectionMode, modelLineNumber, modelColumn)];
346+
return [this._moveToModelPosition(context, cursors[0], inSelectionMode, modelLineNumber, modelColumn)];
349347
}
350348
case CursorMove.Direction.ViewPortIfOutside: {
351349
// Move to a position inside the viewport
352-
const visibleViewRange = context.getCompletelyVisibleViewRange();
353350
let result: PartialCursorState[] = [];
354351
for (let i = 0, len = cursors.length; i < len; i++) {
355352
const cursor = cursors[i];
@@ -770,6 +767,13 @@ export namespace CursorMove {
770767
value: number;
771768
}
772769

770+
export interface SimpleMoveArguments {
771+
direction: SimpleMoveDirection;
772+
unit: Unit;
773+
select: boolean;
774+
value: number;
775+
}
776+
773777
export const enum Direction {
774778
Left,
775779
Right,
@@ -789,7 +793,7 @@ export namespace CursorMove {
789793
ViewPortIfOutside,
790794
}
791795

792-
export type MoveDirection = (
796+
export type SimpleMoveDirection = (
793797
Direction.Left
794798
| Direction.Right
795799
| Direction.Up

0 commit comments

Comments
 (0)