Project

General

Profile

1 57886 k.triantaf
import {Directive, EventEmitter, HostListener, Input, Output} from '@angular/core';
2
import 'rxjs/add/observable/fromEvent';
3
import 'rxjs/add/operator/delay';
4
import 'rxjs/add/operator/do';
5
6
@Directive({
7
  selector: '[long-click]'
8
})
9
10
export class LongClick {
11
12
  @Input() duration: number = 500;
13
14
  @Output() onLongPress: EventEmitter<any> = new EventEmitter();
15
  @Output() onLongPressing: EventEmitter<any> = new EventEmitter();
16
  @Output() onLongPressEnd: EventEmitter<any> = new EventEmitter();
17
18
  private pressing: boolean;
19
  private longPressing: boolean;
20
  private timeout: any;
21
  private mouseX: number = 0;
22
  private mouseY: number = 0;
23
24
  @HostListener('mousedown', ['$event'])
25
  onMouseDown(event) {
26
    // don't do right/middle clicks
27
    if (event.which !== 1) return;
28
29
    this.mouseX = event.clientX;
30
    this.mouseY = event.clientY;
31
32
    this.pressing = true;
33
    this.longPressing = false;
34
35
    this.timeout = setTimeout(() => {
36
      this.longPressing = true;
37
      this.onLongPress.emit(event);
38
      this.loop(event);
39
    }, this.duration);
40
41
    this.loop(event);
42
  }
43
44
  @HostListener('mousemove', ['$event'])
45
  onMouseMove(event) {
46
    if (this.pressing && !this.longPressing) {
47
      const xThres = (event.clientX - this.mouseX) > 10;
48
      const yThres = (event.clientY - this.mouseY) > 10;
49
      if (xThres || yThres) {
50
        this.endPress();
51
      }
52
    }
53
  }
54
55
  loop(event) {
56
    if (this.longPressing) {
57
      this.timeout = setTimeout(() => {
58
        this.onLongPressing.emit(event);
59
        this.loop(event);
60
      }, 50);
61
    }
62
  }
63
64
  endPress() {
65
    clearTimeout(this.timeout);
66
    this.longPressing = false;
67
    this.pressing = false;
68
    this.onLongPressEnd.emit(true);
69
  }
70
71
  @HostListener('mouseup')
72
  onMouseUp() {
73
    this.endPress();
74
  }
75
}