From 932a8d502897d5a6cbcf2515db97d0084e20d64a Mon Sep 17 00:00:00 2001 From: Bruno Ribeito Date: Sun, 1 Jul 2018 19:26:50 +0100 Subject: [PATCH 1/3] Fix SelectionRenderLayer._state --- src/renderer/SelectionRenderLayer.ts | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/renderer/SelectionRenderLayer.ts b/src/renderer/SelectionRenderLayer.ts index a9542cd7..8fbcb75b 100644 --- a/src/renderer/SelectionRenderLayer.ts +++ b/src/renderer/SelectionRenderLayer.ts @@ -8,13 +8,14 @@ import { IColorSet, IRenderDimensions } from './Types'; import { BaseRenderLayer } from './BaseRenderLayer'; export class SelectionRenderLayer extends BaseRenderLayer { - private _state: {start: [number, number], end: [number, number]}; + private _state: { start: [number, number], end: [number, number], columnSelectMode?: boolean }; constructor(container: HTMLElement, zIndex: number, colors: IColorSet) { super(container, 'selection', zIndex, true, colors); this._state = { start: null, - end: null + end: null, + columnSelectMode: null }; } @@ -23,7 +24,8 @@ export class SelectionRenderLayer extends BaseRenderLayer { // Resizing the canvas discards the contents of the canvas so clear state this._state = { start: null, - end: null + end: null, + columnSelectMode: null }; } @@ -31,7 +33,8 @@ export class SelectionRenderLayer extends BaseRenderLayer { if (this._state.start && this._state.end) { this._state = { start: null, - end: null + end: null, + columnSelectMode: null }; this.clearAll(); } @@ -39,7 +42,9 @@ export class SelectionRenderLayer extends BaseRenderLayer { public onSelectionChanged(terminal: ITerminal, start: [number, number], end: [number, number], columnSelectMode: boolean): void { // Selection has not changed - if (this._state.start === start || this._state.end === end) { + if (this._areCoordinatesEqual(start, this._state.start) && + this._areCoordinatesEqual(end, this._state.end) && + columnSelectMode === this._state.columnSelectMode) { return; } @@ -91,5 +96,14 @@ export class SelectionRenderLayer extends BaseRenderLayer { // Save state for next render this._state.start = [start[0], start[1]]; this._state.end = [end[0], end[1]]; + this._state.columnSelectMode = columnSelectMode; + } + + private _areCoordinatesEqual(coord1: [number, number], coord2: [number, number]): boolean { + if (!coord1 || !coord2) { + return false; + } + + return coord1[0] === coord2[0] && coord1[1] === coord2[1]; } } From 7e393dfa8cb5d5d969ff25e2ea4c869a06f9897c Mon Sep 17 00:00:00 2001 From: Bruno Ribeito Date: Sun, 1 Jul 2018 22:24:51 +0100 Subject: [PATCH 2/3] Move logic to helper function --- src/renderer/SelectionRenderLayer.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/renderer/SelectionRenderLayer.ts b/src/renderer/SelectionRenderLayer.ts index 8fbcb75b..97ae67df 100644 --- a/src/renderer/SelectionRenderLayer.ts +++ b/src/renderer/SelectionRenderLayer.ts @@ -42,9 +42,7 @@ export class SelectionRenderLayer extends BaseRenderLayer { public onSelectionChanged(terminal: ITerminal, start: [number, number], end: [number, number], columnSelectMode: boolean): void { // Selection has not changed - if (this._areCoordinatesEqual(start, this._state.start) && - this._areCoordinatesEqual(end, this._state.end) && - columnSelectMode === this._state.columnSelectMode) { + if (!this._didStateChange(start, end, columnSelectMode)) { return; } @@ -99,6 +97,12 @@ export class SelectionRenderLayer extends BaseRenderLayer { this._state.columnSelectMode = columnSelectMode; } + private _didStateChange(start: [number, number], end: [number, number], columnSelectMode: boolean): boolean { + return !this._areCoordinatesEqual(start, this._state.start) || + !this._areCoordinatesEqual(end, this._state.end) || + columnSelectMode !== this._state.columnSelectMode; + } + private _areCoordinatesEqual(coord1: [number, number], coord2: [number, number]): boolean { if (!coord1 || !coord2) { return false; From af9d17760daf90834dc9ed54bb67df20114a22fd Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Mon, 2 Jul 2018 09:22:38 -0700 Subject: [PATCH 3/3] Make columnSelectMode mandatory --- src/renderer/SelectionRenderLayer.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/renderer/SelectionRenderLayer.ts b/src/renderer/SelectionRenderLayer.ts index 97ae67df..1759e112 100644 --- a/src/renderer/SelectionRenderLayer.ts +++ b/src/renderer/SelectionRenderLayer.ts @@ -8,7 +8,7 @@ import { IColorSet, IRenderDimensions } from './Types'; import { BaseRenderLayer } from './BaseRenderLayer'; export class SelectionRenderLayer extends BaseRenderLayer { - private _state: { start: [number, number], end: [number, number], columnSelectMode?: boolean }; + private _state: { start: [number, number], end: [number, number], columnSelectMode: boolean }; constructor(container: HTMLElement, zIndex: number, colors: IColorSet) { super(container, 'selection', zIndex, true, colors); @@ -72,7 +72,6 @@ export class SelectionRenderLayer extends BaseRenderLayer { const width = end[0] - startCol; const height = viewportCappedEndRow - viewportCappedStartRow + 1; this.fillCells(startCol, viewportCappedStartRow, width, height); - } else { // Draw first row const startCol = viewportStartRow === viewportCappedStartRow ? start[0] : 0;