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

Reduce view model responsibilities

上级 50b588a5
......@@ -13,31 +13,45 @@ import { DynamicViewOverlay } from 'vs/editor/browser/view/dynamicViewOverlay';
import { ViewContext } from 'vs/editor/common/view/viewContext';
import { RenderingContext } from 'vs/editor/common/view/renderingContext';
import * as viewEvents from 'vs/editor/common/view/viewEvents';
import { Position } from 'vs/editor/common/core/position';
export class LineNumbersOverlay extends DynamicViewOverlay {
public static CLASS_NAME = 'line-numbers';
private _context: ViewContext;
private _lineHeight: number;
private _renderLineNumbers: boolean;
private _renderCustomLineNumbers: (lineNumber: number) => string;
private _renderRelativeLineNumbers: boolean;
private _lineNumbersLeft: number;
private _lineNumbersWidth: number;
private _lastCursorModelPosition: Position;
private _renderResult: string[];
constructor(context: ViewContext) {
super();
this._context = context;
this._lineHeight = this._context.configuration.editor.lineHeight;
this._renderLineNumbers = this._context.configuration.editor.viewInfo.renderLineNumbers;
this._renderRelativeLineNumbers = this._context.configuration.editor.viewInfo.renderRelativeLineNumbers;
this._lineNumbersLeft = this._context.configuration.editor.layoutInfo.lineNumbersLeft;
this._lineNumbersWidth = this._context.configuration.editor.layoutInfo.lineNumbersWidth;
this._readConfig();
this._lastCursorModelPosition = new Position(1, 1);
this._renderResult = null;
this._context.addEventHandler(this);
}
private _readConfig(): void {
const config = this._context.configuration.editor;
this._lineHeight = config.lineHeight;
this._renderLineNumbers = config.viewInfo.renderLineNumbers;
this._renderCustomLineNumbers = config.viewInfo.renderCustomLineNumbers;
this._renderRelativeLineNumbers = config.viewInfo.renderRelativeLineNumbers;
this._lineNumbersLeft = config.layoutInfo.lineNumbersLeft;
this._lineNumbersWidth = config.layoutInfo.lineNumbersWidth;
}
public dispose(): void {
this._context.removeEventHandler(this);
this._context = null;
......@@ -48,20 +62,12 @@ export class LineNumbersOverlay extends DynamicViewOverlay {
// --- begin event handlers
public onConfigurationChanged(e: viewEvents.ViewConfigurationChangedEvent): boolean {
if (e.lineHeight) {
this._lineHeight = this._context.configuration.editor.lineHeight;
}
if (e.viewInfo) {
this._renderLineNumbers = this._context.configuration.editor.viewInfo.renderLineNumbers;
this._renderRelativeLineNumbers = this._context.configuration.editor.viewInfo.renderRelativeLineNumbers;
}
if (e.layoutInfo) {
this._lineNumbersLeft = this._context.configuration.editor.layoutInfo.lineNumbersLeft;
this._lineNumbersWidth = this._context.configuration.editor.layoutInfo.lineNumbersWidth;
}
this._readConfig();
return true;
}
public onCursorPositionChanged(e: viewEvents.ViewCursorPositionChangedEvent): boolean {
this._lastCursorModelPosition = this._context.model.coordinatesConverter.convertViewPositionToModelPosition(e.position);
if (this._renderRelativeLineNumbers) {
return true;
}
......@@ -88,6 +94,28 @@ export class LineNumbersOverlay extends DynamicViewOverlay {
// --- end event handlers
private _getLineRenderLineNumber(viewLineNumber: number): string {
const modelPosition = this._context.model.coordinatesConverter.convertViewPositionToModelPosition(new Position(viewLineNumber, 1));
if (modelPosition.column !== 1) {
return '';
}
let modelLineNumber = modelPosition.lineNumber;
if (this._renderCustomLineNumbers) {
return this._renderCustomLineNumbers(modelLineNumber);
}
if (this._renderRelativeLineNumbers) {
let diff = Math.abs(this._lastCursorModelPosition.lineNumber - modelLineNumber);
if (diff === 0) {
return '<span class="relative-current-line-number">' + modelLineNumber + '</span>';
}
return String(diff);
}
return String(modelLineNumber);
}
public prepareRender(ctx: RenderingContext): void {
if (!this._renderLineNumbers) {
this._renderResult = null;
......@@ -103,7 +131,7 @@ export class LineNumbersOverlay extends DynamicViewOverlay {
for (let lineNumber = visibleStartLineNumber; lineNumber <= visibleEndLineNumber; lineNumber++) {
let lineIndex = lineNumber - visibleStartLineNumber;
let renderLineNumber = this._context.model.getLineRenderLineNumber(lineNumber);
let renderLineNumber = this._getLineRenderLineNumber(lineNumber);
if (renderLineNumber) {
output[lineIndex] = (
common
......
......@@ -110,7 +110,6 @@ export interface IViewModel {
getLineIndentGuide(lineNumber: number): number;
getLineMinColumn(lineNumber: number): number;
getLineMaxColumn(lineNumber: number): number;
getLineRenderLineNumber(lineNumber: number): string;
getAllOverviewRulerDecorations(): ViewModelDecoration[];
getValueInRange(range: Range, eol: EndOfLinePreference): string;
......
......@@ -100,10 +100,6 @@ export class ViewModel extends Disposable implements IViewModel {
private _isDisposing: boolean;
private _renderCustomLineNumbers: (lineNumber: number) => string;
private _renderRelativeLineNumbers: boolean;
private _lastCursorPosition: Position;
private _centeredViewLine: number;
private _listeners: IViewModelListener[];
......@@ -119,10 +115,6 @@ export class ViewModel extends Disposable implements IViewModel {
this.coordinatesConverter = new CoordinatesConverter(this.lines);
this._lastCursorPosition = new Position(1, 1);
this._renderCustomLineNumbers = this.configuration.editor.viewInfo.renderCustomLineNumbers;
this._renderRelativeLineNumbers = this.configuration.editor.viewInfo.renderRelativeLineNumbers;
this._centeredViewLine = -1;
this.decorations = new ViewModelDecorations(this.editorId, this.model, this.configuration, this.coordinatesConverter);
......@@ -230,8 +222,44 @@ export class ViewModel extends Disposable implements IViewModel {
return lineMappingChanged;
}
public addEventSource(eventSource: Cursor): void {
this._register(eventSource.addBulkListener((events: EmitterEvent[]) => this.onEvents(events)));
public addEventSource(cursor: Cursor): void {
this._register(cursor.addBulkListener((events: EmitterEvent[]) => {
const eventsCollector = new ViewEventsCollector();
for (let i = 0, len = events.length; i < len; i++) {
const _e = events[i];
const type = _e.type;
const data = _e.data;
switch (type) {
case CursorEventType.CursorPositionChanged: {
const e = <ICursorPositionChangedEvent>data;
this.cursors.onCursorPositionChanged(eventsCollector, e);
break;
}
case CursorEventType.CursorSelectionChanged: {
const e = <ICursorSelectionChangedEvent>data;
this.cursors.onCursorSelectionChanged(eventsCollector, e);
break;
}
case CursorEventType.CursorRevealRange: {
const e = <ICursorRevealRangeEvent>data;
this.cursors.onCursorRevealRange(eventsCollector, e);
break;
}
case CursorEventType.CursorScrollRequest: {
const e = <CursorScrollRequest>data;
this.cursors.onCursorScrollRequest(eventsCollector, e);
break;
}
default:
console.info('View received unknown event: ');
console.info(type, data);
}
}
this._emit(eventsCollector.finalize());
}));
}
private onEvents(events: EmitterEvent[]): void {
......@@ -389,35 +417,11 @@ export class ViewModel extends Disposable implements IViewModel {
// Ignore, since the editor will take care of this and destroy the view shortly
break;
}
case CursorEventType.CursorPositionChanged: {
const e = <ICursorPositionChangedEvent>data;
this.cursors.onCursorPositionChanged(eventsCollector, e);
this._lastCursorPosition = e.position;
break;
}
case CursorEventType.CursorSelectionChanged: {
const e = <ICursorSelectionChangedEvent>data;
this.cursors.onCursorSelectionChanged(eventsCollector, e);
break;
}
case CursorEventType.CursorRevealRange: {
const e = <ICursorRevealRangeEvent>data;
this.cursors.onCursorRevealRange(eventsCollector, e);
break;
}
case CursorEventType.CursorScrollRequest: {
const e = <CursorScrollRequest>data;
this.cursors.onCursorScrollRequest(eventsCollector, e);
break;
}
case ConfigurationChanged: {
const e = <IConfigurationChangedEvent>data;
revealPreviousCenteredModelRange = this._onWrappingIndentChange(eventsCollector, this.configuration.editor.wrappingInfo.wrappingIndent) || revealPreviousCenteredModelRange;
revealPreviousCenteredModelRange = this._onWrappingColumnChange(eventsCollector, this.configuration.editor.wrappingInfo.wrappingColumn, this.configuration.editor.fontInfo.typicalFullwidthCharacterWidth / this.configuration.editor.fontInfo.typicalHalfwidthCharacterWidth) || revealPreviousCenteredModelRange;
this._renderCustomLineNumbers = this.configuration.editor.viewInfo.renderCustomLineNumbers;
this._renderRelativeLineNumbers = this.configuration.editor.viewInfo.renderRelativeLineNumbers;
if (e.readOnly) {
// Must read again all decorations due to readOnly filtering
this.decorations.reset();
......@@ -491,28 +495,6 @@ export class ViewModel extends Disposable implements IViewModel {
return result + 2;
}
public getLineRenderLineNumber(viewLineNumber: number): string {
let modelPosition = this.coordinatesConverter.convertViewPositionToModelPosition(new Position(viewLineNumber, 1));
if (modelPosition.column !== 1) {
return '';
}
let modelLineNumber = modelPosition.lineNumber;
if (this._renderCustomLineNumbers) {
return this._renderCustomLineNumbers(modelLineNumber);
}
if (this._renderRelativeLineNumbers) {
let diff = Math.abs(this._lastCursorPosition.lineNumber - modelLineNumber);
if (diff === 0) {
return '<span class="relative-current-line-number">' + modelLineNumber + '</span>';
}
return String(diff);
}
return String(modelLineNumber);
}
public getDecorationsInViewport(visibleRange: Range): ViewModelDecoration[] {
return this.decorations.getDecorationsViewportData(visibleRange).decorations;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册