meganrogge
2021-05-05 08:21:26 -07:00
parent e5c9b0e27f
commit be32590ef0
3 changed files with 52 additions and 2 deletions
+4 -2
View File
@@ -10,12 +10,13 @@ import * as Browser from 'common/Platform';
import { SelectionModel } from 'browser/selection/SelectionModel';
import { CellData } from 'common/buffer/CellData';
import { EventEmitter, IEvent } from 'common/EventEmitter';
import { ICharSizeService, IMouseService, ISelectionService, IRenderService } from 'browser/services/Services';
import { IMouseService, ISelectionService, IRenderService } from 'browser/services/Services';
import { ILinkifier2 } from 'browser/Types';
import { IBufferService, IOptionsService, ICoreService } from 'common/services/Services';
import { getCoordsRelativeToElement } from 'browser/input/Mouse';
import { moveToCellSequence } from 'browser/input/MoveToCell';
import { Disposable } from 'common/Lifecycle';
import { getRangeLength } from 'common/buffer/BufferRange';
/**
* The number of pixels the mouse needs to be above or below the viewport in
@@ -323,7 +324,8 @@ export class SelectionService extends Disposable implements ISelectionService {
const range = this._linkifier.currentLink?.link?.range;
if (range) {
this._model.selectionStart = [range.start.x - 1, range.start.y - 1];
this._model.selectionEnd = [range.end.x, range.end.y - 1];
this._model.selectionStartLength = getRangeLength(range, this._bufferService.cols);
this._model.selectionEnd = undefined;
return true;
}
+32
View File
@@ -0,0 +1,32 @@
/**
* Copyright (c) 2021 The xterm.js authors. All rights reserved.
* @license MIT
*/
import { assert } from 'chai';
import { getRangeLength } from 'common/buffer/BufferRange';
import { IBufferRange } from 'xterm';
describe.only('BufferRange', () => {
describe('getRangeLength', () => {
it('should get range for single line', () => {
assert.equal(getRangeLength(createRange(1, 1, 4, 1), 0), 3);
});
it('should throw for invalid range', () => {
assert.throws(() => getRangeLength(createRange(1, 3, 1, 1), 0));
});
it('should get range multiple lines', () => {
assert.equal(getRangeLength(createRange(1, 1, 4, 5), 5), 23);
});
it('should get range for end line right after start line', () => {
assert.equal(getRangeLength(createRange(1, 1, 7, 2), 5), 11);
});
});
});
function createRange(x1: number, y1: number, x2: number, y2: number): IBufferRange {
return {
start: { x: x1, y: y1 },
end: { x: x2, y: y2 }
};
}
+16
View File
@@ -0,0 +1,16 @@
/**
* Copyright (c) 2021 The xterm.js authors. All rights reserved.
* @license MIT
*/
import { IBufferRange } from 'xterm';
export function getRangeLength(range: IBufferRange, cols: number): number {
if (range.start.y === range.end.y) {
return range.end.x - range.start.x;
}
if (range.start.y > range.end.y) {
throw new Error(`Buffer range end (${range.end.x}, ${range.end.y}) cannot be before start (${range.start.x}, ${range.start.y})`);
}
return cols * (range.end.y - range.start.y - 1) + cols - range.start.x + range.end.x;
}