]> git.proxmox.com Git - mirror_xterm.js.git/commitdiff
Select lines when dragging a triple click
authorDaniel Imms <daimms@microsoft.com>
Tue, 6 Jun 2017 22:02:52 +0000 (15:02 -0700)
committerDaniel Imms <daimms@microsoft.com>
Tue, 6 Jun 2017 22:02:52 +0000 (15:02 -0700)
src/SelectionManager.ts

index ce4c0f22cc4bb0af1bfa9597c6daf782d73ff7a7..112ec4a75e15c7ca455742cf5f7dcf87bff0453c 100644 (file)
@@ -52,6 +52,8 @@ export class SelectionManager extends EventEmitter {
 
   private _clickCount: number;
 
+  private _isLineSelectModeActive: boolean;
+
   private _bufferTrimListener: any;
   private _mouseMoveListener: EventListener;
   private _mouseDownListener: EventListener;
@@ -71,6 +73,7 @@ export class SelectionManager extends EventEmitter {
 
     this._model = new SelectionModel(_terminal);
     this._lastMouseDownTime = 0;
+    this._isLineSelectModeActive = false;
   }
 
   private _initListeners() {
@@ -266,6 +269,7 @@ export class SelectionManager extends EventEmitter {
   private _onSingleClick(event: MouseEvent): void {
     this._model.selectionStartLength = 0;
     this._model.isSelectAllActive = false;
+    this._isLineSelectModeActive = false;
     this._model.selectionStart = this._getMouseBufferCoords(event);
     if (this._model.selectionStart) {
       this._model.selectionEnd = null;
@@ -288,6 +292,7 @@ export class SelectionManager extends EventEmitter {
   private _onTripleClick(event: MouseEvent): void {
     const coords = this._getMouseBufferCoords(event);
     if (coords) {
+      this._isLineSelectModeActive = true;
       this._selectLineAt(coords[1]);
     }
   }
@@ -309,7 +314,17 @@ export class SelectionManager extends EventEmitter {
    * @param event The mousemove event.
    */
   private _onMouseMove(event: MouseEvent) {
-    this._model.selectionEnd = this._getMouseBufferCoords(event);
+    if (this._isLineSelectModeActive) {
+      this._model.selectionEnd = this._getMouseBufferCoords(event);
+      if (this._model.selectionEnd[1] < this._model.selectionStart[1]) {
+        this._model.selectionEnd[0] = 0;
+      } else {
+        this._model.selectionEnd[0] = this._terminal.cols;
+      }
+    } else {
+      this._model.selectionEnd = this._getMouseBufferCoords(event);
+    }
+
     // TODO: Perhaps the actual selection setting could be merged into _dragScroll?
     this._dragScrollAmount = this._getMouseEventScrollAmount(event);
     // If the cursor was above or below the viewport, make sure it's at the
@@ -320,10 +335,13 @@ export class SelectionManager extends EventEmitter {
       this._model.selectionEnd[0] = 0;
     }
 
+    console.log(this._model.selectionEnd);
+
     // If the character is a wide character include the cell to the right in the
-    // selection.
+    // selection. Note that selections at the very end of the line will never
+    // have a character.
     const char = this._buffer.get(this._model.selectionEnd[1])[this._model.selectionEnd[0]];
-    if (char[2] === 0) {
+    if (char && char[2] === 0) {
       this._model.selectionEnd[0]++;
     }