Skip to content

Commit aae591b

Browse files
committed
Move ViewModelCursors out of the ViewModel
1 parent beee645 commit aae591b

9 files changed

Lines changed: 138 additions & 106 deletions

File tree

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ import { EditorScrollbar } from 'vs/editor/browser/viewParts/editorScrollbar/edi
4949
import { Minimap } from 'vs/editor/browser/viewParts/minimap/minimap';
5050
import * as viewEvents from 'vs/editor/common/view/viewEvents';
5151
import { IThemeService, getThemeTypeSelector } from 'vs/platform/theme/common/themeService';
52+
import { ViewModelCursors } from "vs/editor/common/viewModel/viewModelCursors";
5253

5354
export interface IContentWidgetData {
5455
widget: editorBrowser.IContentWidget;
@@ -97,6 +98,7 @@ export class View extends ViewEventHandler {
9798
configuration: Configuration,
9899
themeService: IThemeService,
99100
model: IViewModel,
101+
cursor: ViewModelCursors,
100102
execCoreEditorCommandFunc: ExecCoreEditorCommandFunc
101103
) {
102104
super();
@@ -136,6 +138,10 @@ export class View extends ViewEventHandler {
136138
this._register(model.addEventListener((events: viewEvents.ViewEvent[]) => {
137139
this.eventDispatcher.emitMany(events);
138140
}));
141+
142+
this._register(cursor.addEventListener((events: viewEvents.ViewEvent[]) => {
143+
this.eventDispatcher.emitMany(events);
144+
}));
139145
}
140146

141147
private createViewParts(): void {

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,6 @@ export class CurrentLineHighlightOverlay extends DynamicViewOverlay {
8484
return false;
8585
}
8686
public onFlushed(e: viewEvents.ViewFlushedEvent): boolean {
87-
this._primaryCursorIsInEditableRange = true;
88-
this._selectionIsEmpty = true;
89-
this._primaryCursorLineNumber = 1;
9087
return true;
9188
}
9289
public onLinesDeleted(e: viewEvents.ViewLinesDeletedEvent): boolean {

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,6 @@ export class CurrentLineMarginHighlightOverlay extends DynamicViewOverlay {
6767
return hasChanged;
6868
}
6969
public onFlushed(e: viewEvents.ViewFlushedEvent): boolean {
70-
this._primaryCursorIsInEditableRange = true;
71-
this._primaryCursorLineNumber = 1;
7270
return true;
7371
}
7472
public onLinesDeleted(e: viewEvents.ViewLinesDeletedEvent): boolean {

src/vs/editor/browser/viewParts/viewCursors/viewCursor.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -130,12 +130,6 @@ export class ViewCursor {
130130
return true;
131131
}
132132

133-
public onFlushed(): boolean {
134-
this.updatePosition(new Position(1, 1));
135-
this._isInEditableRange = true;
136-
return true;
137-
}
138-
139133
private _prepareRender(ctx: RenderingContext): ViewCursorRenderData {
140134
if (this._cursorStyle === TextEditorCursorStyle.Line || this._cursorStyle === TextEditorCursorStyle.LineThin) {
141135
const visibleRange = ctx.visibleRangeForPosition(this._position);

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

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -139,11 +139,6 @@ export class ViewCursors extends ViewPart {
139139
return true;
140140
}
141141
public onFlushed(e: viewEvents.ViewFlushedEvent): boolean {
142-
this._primaryCursor.onFlushed();
143-
for (let i = 0, len = this._secondaryCursors.length; i < len; i++) {
144-
this._domNode.removeChild(this._secondaryCursors[i].getDomNode());
145-
}
146-
this._secondaryCursors = [];
147142
return true;
148143
}
149144
public onFocusChanged(e: viewEvents.ViewFocusChangedEvent): boolean {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,7 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito
422422
this._configuration,
423423
this._themeService,
424424
this.viewModel,
425+
this.viewCursor,
425426
(editorCommand: CoreEditorCommand, args: any) => {
426427
if (!this.cursor) {
427428
return;

src/vs/editor/common/commonCodeEditor.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import {
2828
import * as editorOptions from 'vs/editor/common/config/editorOptions';
2929
import { CursorEventType, ICursorPositionChangedEvent, VerticalRevealType, ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents';
3030
import { EditorContextKeys } from 'vs/editor/common/editorContextKeys';
31+
import { ViewModelCursors } from "vs/editor/common/viewModel/viewModelCursors";
3132

3233
let EDITOR_ID = 0;
3334

@@ -99,6 +100,7 @@ export abstract class CommonCodeEditor extends Disposable implements editorCommo
99100

100101
protected viewModel: ViewModel;
101102
protected cursor: Cursor;
103+
protected viewCursor: ViewModelCursors;
102104

103105
protected readonly _instantiationService: IInstantiationService;
104106
protected readonly _contextKeyService: IContextKeyService;
@@ -932,7 +934,11 @@ export abstract class CommonCodeEditor extends Disposable implements editorCommo
932934
this._enableEmptySelectionClipboard()
933935
);
934936

935-
this.viewModel.addEventSource(this.cursor);
937+
this.viewCursor = new ViewModelCursors(
938+
this._configuration,
939+
this.viewModel,
940+
this.cursor
941+
);
936942

937943
this._createView();
938944

@@ -994,6 +1000,11 @@ export abstract class CommonCodeEditor extends Disposable implements editorCommo
9941000
this.cursor = null;
9951001
}
9961002

1003+
if (this.viewCursor) {
1004+
this.viewCursor.dispose();
1005+
this.viewCursor = null;
1006+
}
1007+
9971008
if (this.viewModel) {
9981009
this.viewModel.dispose();
9991010
this.viewModel = null;

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

Lines changed: 81 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,13 @@
66

77
import * as editorCommon from 'vs/editor/common/editorCommon';
88
import { Position } from 'vs/editor/common/core/position';
9-
import { ICoordinatesConverter, ViewEventsCollector } from 'vs/editor/common/viewModel/viewModel';
9+
import { ICoordinatesConverter, ViewEventsCollector, IViewModel } from 'vs/editor/common/viewModel/viewModel';
1010
import { Selection } from 'vs/editor/common/core/selection';
1111
import * as viewEvents from 'vs/editor/common/view/viewEvents';
12-
import { ICursorRevealRangeEvent } from 'vs/editor/common/controller/cursorEvents';
12+
import { ICursorRevealRangeEvent, CursorEventType, CursorScrollRequest } from 'vs/editor/common/controller/cursorEvents';
13+
import { Cursor } from "vs/editor/common/controller/cursor";
14+
import { ViewEventEmitter } from "vs/editor/common/viewModel/viewModelImpl";
15+
import { EmitterEvent } from "vs/base/common/eventEmitter";
1316

1417
export interface ICursorPositionChangedEvent {
1518
readonly position: Position;
@@ -26,19 +29,88 @@ export interface ICursorSelectionChangedEvent {
2629
readonly secondaryViewSelections: Selection[];
2730
}
2831

29-
export class ViewModelCursors {
32+
function containsLineMappingChanged(events: viewEvents.ViewEvent[]): boolean {
33+
for (let i = 0, len = events.length; i < len; i++) {
34+
if (events[i].type === viewEvents.ViewEventType.ViewLineMappingChanged) {
35+
return true;
36+
}
37+
}
38+
return false;
39+
}
40+
41+
export class ViewModelCursors extends ViewEventEmitter {
3042

3143
private readonly configuration: editorCommon.IConfiguration;
44+
private readonly viewModel: IViewModel;
45+
private readonly cursor: Cursor;
3246
private readonly coordinatesConverter: ICoordinatesConverter;
3347

3448
private lastCursorPositionChangedEvent: ICursorPositionChangedEvent;
3549
private lastCursorSelectionChangedEvent: ICursorSelectionChangedEvent;
3650

37-
constructor(configuration: editorCommon.IConfiguration, coordinatesConverter: ICoordinatesConverter) {
51+
constructor(configuration: editorCommon.IConfiguration, viewModel: IViewModel, cursor: Cursor) {
52+
super();
3853
this.configuration = configuration;
39-
this.coordinatesConverter = coordinatesConverter;
54+
this.viewModel = viewModel;
55+
this.cursor = cursor;
56+
this.coordinatesConverter = viewModel.coordinatesConverter;
4057
this.lastCursorPositionChangedEvent = null;
4158
this.lastCursorSelectionChangedEvent = null;
59+
60+
this._register(cursor.addBulkListener((events: EmitterEvent[]) => {
61+
const eventsCollector = new ViewEventsCollector();
62+
this._onCursorEvents(eventsCollector, events);
63+
this._emit(eventsCollector.finalize());
64+
}));
65+
66+
this._register(viewModel.addEventListener((events: viewEvents.ViewEvent[]) => {
67+
if (!containsLineMappingChanged(events)) {
68+
return;
69+
}
70+
const eventsCollector = new ViewEventsCollector();
71+
this.onLineMappingChanged(eventsCollector);
72+
this._emit(eventsCollector.finalize());
73+
}));
74+
}
75+
76+
private _onCursorEvents(eventsCollector: ViewEventsCollector, events: EmitterEvent[]): void {
77+
for (let i = 0, len = events.length; i < len; i++) {
78+
const _e = events[i];
79+
const type = _e.type;
80+
const data = _e.data;
81+
82+
switch (type) {
83+
case CursorEventType.CursorPositionChanged: {
84+
const e = <ICursorPositionChangedEvent>data;
85+
this.onCursorPositionChanged(eventsCollector, e);
86+
break;
87+
}
88+
case CursorEventType.CursorSelectionChanged: {
89+
const e = <ICursorSelectionChangedEvent>data;
90+
this.onCursorSelectionChanged(eventsCollector, e);
91+
break;
92+
}
93+
case CursorEventType.CursorRevealRange: {
94+
const e = <ICursorRevealRangeEvent>data;
95+
this.onCursorRevealRange(eventsCollector, e);
96+
break;
97+
}
98+
case CursorEventType.CursorScrollRequest: {
99+
const e = <CursorScrollRequest>data;
100+
this.viewModel.viewLayout.setScrollPosition({
101+
scrollTop: e.desiredScrollTop
102+
});
103+
break;
104+
}
105+
default:
106+
console.info('View received unknown event: ');
107+
console.info(type, data);
108+
}
109+
}
110+
}
111+
112+
public dispose(): void {
113+
super.dispose();
42114
}
43115

44116
/**
@@ -52,7 +124,7 @@ export class ViewModelCursors {
52124
return position;
53125
}
54126

55-
public onCursorPositionChanged(eventsCollector: ViewEventsCollector, e: ICursorPositionChangedEvent): void {
127+
private onCursorPositionChanged(eventsCollector: ViewEventsCollector, e: ICursorPositionChangedEvent): void {
56128
this.lastCursorPositionChangedEvent = e;
57129

58130
const stopRenderingLineAfter = this.configuration.editor.viewInfo.stopRenderingLineAfter;
@@ -66,13 +138,13 @@ export class ViewModelCursors {
66138
eventsCollector.emit(new viewEvents.ViewCursorPositionChangedEvent(position, secondaryPositions, e.isInEditableRange));
67139
}
68140

69-
public onCursorSelectionChanged(eventsCollector: ViewEventsCollector, e: ICursorSelectionChangedEvent): void {
141+
private onCursorSelectionChanged(eventsCollector: ViewEventsCollector, e: ICursorSelectionChangedEvent): void {
70142
this.lastCursorSelectionChangedEvent = e;
71143

72144
eventsCollector.emit(new viewEvents.ViewCursorSelectionChangedEvent(e.viewSelection, e.secondaryViewSelections));
73145
}
74146

75-
public onCursorRevealRange(eventsCollector: ViewEventsCollector, e: ICursorRevealRangeEvent): void {
147+
private onCursorRevealRange(eventsCollector: ViewEventsCollector, e: ICursorRevealRangeEvent): void {
76148
// Ensure event has viewRange
77149
const viewRange = (
78150
e.viewRange
@@ -86,7 +158,7 @@ export class ViewModelCursors {
86158
));
87159
}
88160

89-
public onLineMappingChanged(eventsCollector: ViewEventsCollector): void {
161+
private onLineMappingChanged(eventsCollector: ViewEventsCollector): void {
90162
if (this.lastCursorPositionChangedEvent) {
91163
const toViewPos = (pos: Position) => this.coordinatesConverter.convertModelPositionToViewPosition(pos);
92164
let e: ICursorPositionChangedEvent = {

0 commit comments

Comments
 (0)