From b8a2488a8fe4f7d5835e320270ea044e5d872776 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 9 May 2017 12:51:13 +0200 Subject: [PATCH] Reduce view model responsibilities --- .../viewParts/lineNumbers/lineNumbers.ts | 62 ++++++++---- src/vs/editor/common/viewModel/viewModel.ts | 1 - .../editor/common/viewModel/viewModelImpl.ts | 94 ++++++++----------- 3 files changed, 83 insertions(+), 74 deletions(-) diff --git a/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts b/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts index c1a0c97a1da..38205f5a997 100644 --- a/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts +++ b/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts @@ -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 '' + modelLineNumber + ''; + } + 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 diff --git a/src/vs/editor/common/viewModel/viewModel.ts b/src/vs/editor/common/viewModel/viewModel.ts index 19a4b265f78..ab2b17027ac 100644 --- a/src/vs/editor/common/viewModel/viewModel.ts +++ b/src/vs/editor/common/viewModel/viewModel.ts @@ -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; diff --git a/src/vs/editor/common/viewModel/viewModelImpl.ts b/src/vs/editor/common/viewModel/viewModelImpl.ts index 7d5ff82c7f0..77521cdacc2 100644 --- a/src/vs/editor/common/viewModel/viewModelImpl.ts +++ b/src/vs/editor/common/viewModel/viewModelImpl.ts @@ -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 = data; + this.cursors.onCursorPositionChanged(eventsCollector, e); + break; + } + case CursorEventType.CursorSelectionChanged: { + const e = data; + this.cursors.onCursorSelectionChanged(eventsCollector, e); + break; + } + case CursorEventType.CursorRevealRange: { + const e = data; + this.cursors.onCursorRevealRange(eventsCollector, e); + break; + } + case CursorEventType.CursorScrollRequest: { + const e = 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 = data; - this.cursors.onCursorPositionChanged(eventsCollector, e); - this._lastCursorPosition = e.position; - break; - } - case CursorEventType.CursorSelectionChanged: { - const e = data; - this.cursors.onCursorSelectionChanged(eventsCollector, e); - break; - } - case CursorEventType.CursorRevealRange: { - const e = data; - this.cursors.onCursorRevealRange(eventsCollector, e); - break; - } - case CursorEventType.CursorScrollRequest: { - const e = data; - this.cursors.onCursorScrollRequest(eventsCollector, e); - break; - } case ConfigurationChanged: { const e = 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 '' + modelLineNumber + ''; - } - return String(diff); - } - - return String(modelLineNumber); - } - public getDecorationsInViewport(visibleRange: Range): ViewModelDecoration[] { return this.decorations.getDecorationsViewportData(visibleRange).decorations; }