mirror of
https://github.com/microsoft/vscode.git
synced 2026-05-08 17:19:48 +01:00
Reduce view model responsibilities
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user