UNPKG

ngx-video-timeline

Version:
1 lines 58.9 kB
{"version":3,"file":"ngx-video-timeline.mjs","sources":["../../../projects/timeline/src/lib/untils/date-util.ts","../../../projects/timeline/src/lib/timeline.component.ts","../../../projects/timeline/src/public-api.ts","../../../projects/timeline/src/ngx-video-timeline.ts"],"sourcesContent":["\n/**\n * A utility class for working with dates.\n */\nexport class DateUtil {\n\n  /**\n   * Formats the given date according to the specified format.\n   * @param date The date to format.\n   * @param format The format string, using the following placeholders:\n   *   - YYYY: four-digit year\n   *   - MM: two-digit month (zero-padded)\n   *   - DD: two-digit day of month (zero-padded)\n   *   - HH: two-digit hour (zero-padded, 24-hour format)\n   *   - mm: two-digit minute (zero-padded)\n   *   - ss: two-digit second (zero-padded)\n   * @returns The formatted date string.\n   */\n  static formatDate(date: Date, format: string): string {\n    // Extract the year, month, day, hours, minutes, and seconds from the date\n    const year = date.getFullYear().toString();\n    const month = (date.getMonth() + 1).toString().padStart(2, '0');\n    const day = date.getDate().toString().padStart(2, '0');\n    const hours = date.getHours().toString().padStart(2, '0');\n    const minutes = date.getMinutes().toString().padStart(2, '0');\n    const seconds = date.getSeconds().toString().padStart(2, '0');\n\n    // Replace the placeholders in the format string with the corresponding date parts\n    return format\n      .replace('YYYY', year)\n      .replace('MM', month)\n      .replace('DD', day)\n      .replace('HH', hours)\n      .replace('mm', minutes)\n      .replace('ss', seconds);\n  }\n}\n","import { NgStyle } from '@angular/common';\nimport {\n  Component,\n  ElementRef,\n  EventEmitter,\n  HostListener,\n  Input,\n  OnChanges,\n  OnInit,\n  Output, SimpleChanges,\n  ViewChild\n} from '@angular/core';\nimport { interval, Subscription } from 'rxjs';\nimport { DateUtil } from './untils/date-util';\nimport { CanvasPos, VideoCellType } from './interfaces/timeline.interface';\n@Component({\n  imports: [\n    NgStyle\n  ],\n  selector: 'ngx-video-timeline',\n  template: `<canvas #timeline class=\"canvas\" [ngStyle]=\"{cursor: 'pointer',border: '1px solid',borderColor: borderColor,'backgroundColor': bgColor}\"\n    (dragstart)=\"onDragStart($event)\" (mouseup)=\"mouseupFunc($event)\" (mousewheel)=\"mousewheelFunc($event)\"\n    (mousedown)=\"mousedownFunc($event)\" (mousemove)=\"mousemoveFunc($event)\" (mouseout)=\"mouseoutFunc()\"></canvas>\n    `,\n  styles: [`\n    .canvas {\n    width: 100%;\n    height: 100%;\n}\n    `],\n  standalone: true\n})\nexport class NgxVideoTimelineComponent implements OnInit, OnChanges {\n\n\n  // The height of the outer canvas\n  @Input() canvasHeight = 50;\n\n  // Canvas scale is adjusted according to outer height\n  scale = this.canvasHeight / 4.55;\n\n  // Video playback time\n  @Input() playTime: number | string | Date;\n\n  // The video plays at twice the speed\n  @Input() speed: number;\n\n  // Video fast forward value\n  @Input() forWardValue: number;\n\n  // Start time limit: Timestamp\n  @Input() startTimeThreshold: number | string | Date;\n\n  // End time limit: Timestamp\n  @Input() endTimeThreshold: number | string | Date;\n\n  // relation to Css Start\n\n  // color of canvas border\n  @Input() borderColor: string;\n\n  // color of canvas backgraound\n  @Input() bgColor: string;\n\n  // color of the bottomLine\n  @Input() bottomLineColor: string;\n\n  // color of the verticalBar\n  @Input() verticalBarColor: string;\n\n  // color of the playBar\n  @Input() playBarColor: string;\n\n\n  // relation to Css End\n\n  // Video clips\n  @Input() videoCells: Array<VideoCellType>;\n\n  // flag of click play button\n  @Input() isPlayClick: boolean;\n\n  // emit data when click playButton\n  @Output() readonly playClick: EventEmitter<any>;\n\n  // emit data when mouseUp\n  @Output() readonly mouseUp: EventEmitter<any>;\n\n  // emit data when mouseDown\n  @Output() readonly mouseDown: EventEmitter<any>;\n\n  // emit data when keyUp\n  @Output() readonly keyUp: EventEmitter<any>;\n\n  // emit data when keyDown\n  @Output() readonly keyDown: EventEmitter<any>;\n\n  // --- canvas data start ---//\n\n  // canvas box\n  canvas: any;\n\n  // canvas context\n  ctx: any;\n\n  // canvas width\n  canvasW: number;\n\n  // canvas height\n  canvasH: number;\n\n  // video clips in reality\n  timecell: Array<VideoCellType>;\n\n  // per minute stand for step\n  minutesPerStep: Array<number>;\n\n  // per minite stand for px\n  pxPerMs: number;\n\n  // Minimum width between scales, unit px\n  graduationStep: number;\n\n  // The timeline shows x hours\n  hoursPerRuler: number;\n\n  // The leftmost timestamp that appears -- the default is the first 12 hours\n  startTimestamp: number;\n\n  // current timestamp\n  currentTimestamp: number;\n\n  // Px two hours apart\n  distanceBetweenGtitle: number;\n\n  // zoom of canvas\n  zoom: number;\n\n  // marker of drag an unreleased mouse event\n  gIsMousedown: boolean;\n\n  // marker of drag the mouse move\n  gIsMousemove: boolean;\n\n  // The position of the X-axis when the mouse is pressed\n  gMousedownCursor = undefined;\n\n  // The position of the y-axis when the mouse is pressed\n  gMousedownCursorY = undefined;\n\n  // Time flow timer\n  setTimeMove: Subscription;\n\n  // The distance to the left of the play button\n  playBarDistanceLeft: number;\n\n  // Play the initial position of the icon\n  playBarOffsetX: number;\n\n  // Play the X-axis position 1 of the icon\n  playBarOffsetX1: number;\n\n  // Play the X-axis position 2 of the icon\n  playBarOffsetX2: number;\n\n  // Play the Y-axis position 1 of the icon\n  playBarOffsetY1: number;\n\n  // Play the Y-axis position 2 of the icon\n  playBarOffsetY2: number;\n\n  // --- canvas data end ---//\n\n  // elements of the timeline\n  @ViewChild('timeline', { static: true }) canvasExp: ElementRef;\n\n  constructor() {\n    // this.startTimeThreshold = new Date().getTime() - 1 * 0.5 * 3600 * 1000;\n    // this.endTimeThreshold = new Date().getTime() + 1 * 1 * 3600 * 1000;\n    this.forWardValue = 5000;\n    this.speed = 1000;\n    this.playTime = new Date().getTime();\n    this.startTimeThreshold = new Date().getTime() - 1 * 12 * 3600 * 1000;\n    this.endTimeThreshold = new Date().getTime() + 1 * 12 * 3600 * 1000;\n    this.playClick = new EventEmitter<any>();\n    this.mouseUp = new EventEmitter<any>();\n    this.mouseDown = new EventEmitter<any>();\n    this.keyUp = new EventEmitter<any>();\n    this.keyDown = new EventEmitter<any>();\n    this.isPlayClick = false;\n    this.videoCells = [\n      {\n        beginTime: new Date().getTime() - 3 * 3600 * 1000,\n        endTime: new Date().getTime() - 1 * 3600 * 1000,\n        style: {\n          background: 'rgba(132, 244, 180, 0.498039)'\n        }\n      },\n      {\n        beginTime: new Date().getTime() - 6 * 3600 * 1000,\n        endTime: new Date().getTime() - 4 * 3600 * 1000,\n        style: {\n          background: 'rgba(132, 244, 180, 0.498039)'\n        }\n      }\n    ];\n    this.verticalBarColor = 'rgba(0,0,0,1)';\n    this.bottomLineColor = 'rgba(0,0,0,1)';\n    this.borderColor = '#fff';\n    this.bgColor = '#fff';\n    this.playBarColor = '#448aff';\n  }\n\n  /**\n   * Browser change event\n   */\n  @HostListener('window:resize', [])\n  onResize(): void {\n    this.canvas.width = Math.round(this.canvas.parentNode.offsetWidth - 2);\n    this.canvasW = this.canvas.parentNode.offsetWidth;\n    this.init(this.startTimestamp, this.timecell, false);\n  }\n\n  /**\n   * Keyboard press event\n   */\n  @HostListener('window:keydown', ['$event'])\n  onKeyDown(event: any): void {\n    if (Number(event.keyCode) === 37) {\n      this.playTime = Number(this.playTime) - this.forWardValue;\n      this.currentTimestamp = Number(this.currentTimestamp) - this.forWardValue;\n      this.set_time_to_middle(this.playTime);\n\n    } else if (Number(event.keyCode === 39)) {\n      this.playTime = Number(this.playTime) + this.forWardValue;\n      this.currentTimestamp = Number(this.currentTimestamp) + this.forWardValue;\n      this.set_time_to_middle(this.playTime);\n    }\n    this.keyDown.emit(this.playTime);\n  }\n\n  /**\n   * Keyboard release event\n   */\n  @HostListener('window:keyup', ['$event'])\n  onKeyUp(event: any): void {\n    if (Number(event.keyCode) === 13 || Number(event.keyCode === 32)) {\n      this.isPlayClick ? this.onPauseClick() : this.onPlayClick();\n    }\n    this.keyUp.emit(this.playTime);\n  }\n\n  ngOnInit(): void {\n    // Initialize data video group event stamp to show new Date().getTime()- number of hours\n\n    // Assign the Canvas DOM to the variable Canvas\n    this.canvas = this.canvasExp.nativeElement;\n\n    // Define the area of the canvas\n    this.ctx = this.canvas.getContext('2d');\n\n    // Redefine the width of the canvas. The default canvas is 300. Assign the width of the parent element\n    this.canvas.width = Math.round(this.canvas.parentNode.offsetWidth - 2);\n\n    // Store the width and height of the canvas\n    this.canvasW = this.canvas.width;\n    this.canvas.height = this.canvasHeight;\n    this.canvasH = this.canvas.height;\n\n    // Assign the video array to Timecell\n    this.timecell = this.videoCells;\n\n    // Initialize the number of steps per minute\n    this.minutesPerStep = [\n      1,\n      2,\n      5,\n      10,\n      15,\n      20,\n      30,\n      60,\n      120,\n      180,\n      240,\n      360,\n      720,\n      1440\n    ];\n\n    // Initialization style\n\n    // Minimum width between scales, in units of px 20px\n    this.graduationStep = 20;\n\n    // The timeline shows the time rounded up according to the time threshold\n    this.hoursPerRuler = Math.ceil((Number(this.endTimeThreshold) - Number(this.startTimeThreshold)) / 1000 / 3600) < 24 ?\n      Math.ceil((Number(this.endTimeThreshold) - Number(this.startTimeThreshold)) / 1000 / 3600) :\n      24;\n\n    // The leftmost timestamp defaults to 12 hours before the current time\n    this.startTimestamp = Number(this.startTimeThreshold);\n\n    // Default distance 80\n    this.distanceBetweenGtitle = 80;\n    // Default zoom 24\n    this.zoom = 24;\n\n    // Default false\n    this.gIsMousedown = false;\n    this.gIsMousemove = false;\n    this.gMousedownCursor = undefined;\n\n    // px/ms\n    this.pxPerMs = this.canvasW / (this.hoursPerRuler * 3600 * 1000);\n\n    // The initial X position of the playback icon is in the middle of the scale\n    this.playBarOffsetX = this.canvasW / 2;\n\n    this.playBarDistanceLeft = this.playBarOffsetX / this.pxPerMs / 3600 / 1000 / this.hoursPerRuler;\n    this.currentTimestamp = this.startTimestamp + this.hoursPerRuler * this.playBarDistanceLeft * 3600 * 1000;\n\n    this.playBarOffsetX1 = this.playBarOffsetX - (this.scale * 0.6);\n    this.playBarOffsetX2 = this.playBarOffsetX + (this.scale * 0.6);\n    this.playBarOffsetY1 = (this.scale * 2.5);\n    this.playBarOffsetY2 = ((this.scale * 3.5));\n\n    // Initialize the timeline\n    this.init(this.startTimestamp, this.timecell, false);\n\n    // Draw the play button\n    this.drawPalyBar();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    // Refactor the playback component when the width and height change\n    if (changes.canvasHeight) {\n      this.canvasHeight = changes.canvasHeight.currentValue;\n\n      // Assign the Canvas DOM to the variable Canvas\n      this.canvas = this.canvasExp.nativeElement;\n\n      // Define the area of the canvas\n      this.ctx = this.canvas.getContext('2d');\n\n      // Redefine the width of the canvas. The default canvas is 300. Assign the width of the parent element\n      this.canvas.width = Math.round(this.canvas.parentNode.offsetWidth - 2);\n\n      // Store the width and height of the canvas\n      this.canvasW = this.canvas.width;\n\n      this.canvas.height = this.canvasHeight;\n      this.canvasH = this.canvas.height;\n\n      // Assign the video array to Timecell\n      this.timecell = this.videoCells;\n\n      this.minutesPerStep = [\n        1,\n        2,\n        5,\n        10,\n        15,\n        20,\n        30,\n        60,\n        120,\n        180,\n        240,\n        360,\n        720,\n        1440\n      ];\n      // The timeline shows the time rounded up according to the time threshold\n      this.hoursPerRuler = Math.ceil((Number(this.endTimeThreshold) - Number(this.startTimeThreshold)) / 1000 / 3600) < 24 ?\n        Math.ceil((Number(this.endTimeThreshold) - Number(this.startTimeThreshold)) / 1000 / 3600)\n        : 24;\n\n      // The leftmost timestamp defaults to 12 hours before the current time\n      this.startTimestamp = Number(this.startTimeThreshold);\n\n      this.pxPerMs = this.canvasW / (this.hoursPerRuler * 3600 * 1000);\n\n      // The initial X position of the playback icon is in the middle of the scale\n      this.playBarOffsetX = this.canvasW / 2;\n\n      this.playBarDistanceLeft = this.playBarOffsetX / this.pxPerMs / 3600 / 1000 / this.hoursPerRuler;\n      // Current timestamp\n      this.currentTimestamp = this.startTimestamp + this.hoursPerRuler * this.playBarDistanceLeft * 3600 * 1000;\n\n      this.playBarOffsetX1 = this.playBarOffsetX - (this.scale * 0.6);\n      this.playBarOffsetX2 = this.playBarOffsetX + (this.scale * 0.6);\n      this.playBarOffsetY1 = (this.scale * 2.5);\n      this.playBarOffsetY2 = ((this.scale * 3.5));\n\n      this.init(this.startTimestamp, this.timecell, false);\n      this.drawPalyBar();\n    }\n    if (changes.videoCells) {\n      this.videoCells = changes.videoCells.currentValue;\n\n      this.timecell = this.videoCells;\n      this.add_cells(this.timecell);\n\n      // this.init(this.startTimestamp, this.timecell, true);\n      // this.drawPalyBar();\n    }\n    if (changes.startTimeThreshold) {\n      const value = changes.startTimeThreshold.currentValue;\n      if (changes.startTimeThreshold.currentValue instanceof String) {\n        this.startTimeThreshold = new Date(value).getTime();\n      } else if (value instanceof Date) {\n        this.startTimeThreshold = value.getTime();\n      } else if (typeof value === 'number') {\n        this.startTimeThreshold = Number(value);\n      }\n\n      this.hoursPerRuler = Math.ceil((Number(this.endTimeThreshold) - Number(this.startTimeThreshold)) / 1000 / 3600) < 24\n        ? Math.ceil((Number(this.endTimeThreshold) - Number(this.startTimeThreshold)) / 1000 / 3600)\n        : 24;\n\n      this.startTimestamp = Number(this.startTimeThreshold);\n      // this.init(this.startTimestamp, this.timecell, false);\n    }\n    if (changes.endTimeThreshold) {\n      const value = changes.endTimeThreshold.currentValue;\n      if (changes.endTimeThreshold.currentValue instanceof String) {\n        this.endTimeThreshold = new Date(value).getTime();\n      } else if (value instanceof Date) {\n        this.endTimeThreshold = value.getTime();\n      } else if (typeof value === 'number') {\n        this.endTimeThreshold = Number(value);\n      }\n      this.hoursPerRuler = Math.ceil((Number(this.endTimeThreshold) - Number(this.startTimeThreshold)) / 1000 / 3600) < 24\n        ? Math.ceil((Number(this.endTimeThreshold) - Number(this.startTimeThreshold)) / 1000 / 3600)\n        : 24;\n\n    }\n    if (changes.playTime) {\n\n      const value = changes.playTime.currentValue;\n      if (changes.playTime.currentValue instanceof String) {\n        this.playTime = new Date(value).getTime();\n      } else if (value instanceof Date) {\n        this.playTime = value.getTime();\n      } else if (typeof value === 'number') {\n        this.playTime = Number(value);\n      }\n\n      // use SetTimeOut Timer to make it  asynchronous\n      setTimeout(() => {\n        this.set_time_to_middle(new Date(this.playTime).getTime());\n      }, 100);\n\n    }\n    if (changes.speed) {\n\n      this.speed = Number(changes.speed.currentValue) * 1000;\n    }\n    if (changes.forWardValue) {\n\n      this.forWardValue = Number(changes.forWardValue.currentValue) * 1000;\n    }\n\n    if (changes.isPlayClick) {\n      if (changes.isPlayClick.currentValue) {\n        this.onPlayClick();\n      } else {\n        this.onPauseClick();\n      }\n    }\n  }\n\n  /**\n   * Initialize\n   * @param  startTimestamp Leftmost time\n   * @param  timecell Video segment array\n   * @param  redrawFlag Whether to redraw the mark\n   */\n  init(startTimestamp: number, timecell: any, redrawFlag: boolean): void {\n    this.timecell = timecell;\n    this.startTimestamp = startTimestamp;\n    if (\n      this.currentTimestamp >=\n      Number(this.endTimeThreshold)\n    ) {\n      this.startTimestamp =\n        Number(this.endTimeThreshold) -\n        (this.hoursPerRuler * this.playBarDistanceLeft * 1000 * 3600);\n      this.currentTimestamp =\n        Number(this.startTimestamp) + (this.hoursPerRuler * this.playBarDistanceLeft * 1000 * 3600);\n      this.playTime =\n        Number(this.startTimestamp) + (this.hoursPerRuler * this.playBarDistanceLeft * 1000 * 3600);\n    } else if (\n      this.currentTimestamp <=\n      Number(this.startTimeThreshold)\n    ) {\n      this.startTimestamp =\n        Number(this.startTimeThreshold) -\n        (this.hoursPerRuler * this.playBarDistanceLeft * 1000 * 3600);\n      this.currentTimestamp =\n        Number(this.startTimestamp) + (this.hoursPerRuler * this.playBarDistanceLeft * 1000 * 3600);\n      this.playTime =\n        Number(this.startTimestamp) + (this.hoursPerRuler * this.playBarDistanceLeft * 1000 * 3600);\n    }\n    this.drawCellBg();\n    this.add_graduations(startTimestamp);\n    this.add_cells(timecell);\n    // Draw the verticalBar\n    this.drawLine(\n      0,\n      this.canvasH,\n      this.canvasW,\n      this.canvasH,\n      this.bottomLineColor,\n      1\n    );\n  }\n\n  /**\n   * Draw add scale\n   * @param  startTimestamp Leftmost time\n   */\n  add_graduations(startTimestamp: number): void {\n    // px/min\n    const pxPerMin = this.canvasW / (this.hoursPerRuler * 60);\n    // px/ms\n    const pxPerMs = this.canvasW / (this.hoursPerRuler * 60 * 60 * 1000);\n    // The default minimum value of PX/steo is 20px\n    let pxPerStep = this.graduationStep;\n\n    // Min/steo\n    let minPerStep = pxPerStep / pxPerMin;\n\n    for (const v of this.minutesPerStep) {\n      if (minPerStep <= v) {\n        // Keep each cell within the range specified by minutesPerStep\n        minPerStep = v;\n        pxPerStep = pxPerMin * minPerStep;\n        break;\n      }\n    }\n    let mediumStep = 30;\n    for (const v of this.minutesPerStep) {\n      if (this.distanceBetweenGtitle / pxPerMin <= v) {\n        mediumStep = v;\n        break;\n      }\n    }\n    // The total number\n    const numSteps = this.canvasW / pxPerStep;\n\n    let graduationLeft: number;\n    let graduationTime: number;\n\n    let caretClass: string;\n    let lineH: number;\n\n    // The initial offset time (ms)\n    const msOffset = this.ms_to_next_step(\n      startTimestamp,\n      minPerStep * 60 * 1000\n    );\n\n    // The initial offset is (px)\n    const pxOffset = msOffset * pxPerMs;\n\n    // ms/step\n    const msPerStep = pxPerStep / pxPerMs;\n\n    for (let i = 0; i < numSteps; i++) {\n      // Distance = offset distance to start + steps *px/ steps\n      graduationLeft = pxOffset + i * pxPerStep;\n\n      // Time = left start time + offset time + steps *ms/ steps\n      graduationTime =\n        Number(startTimestamp) +\n        Number(msOffset) +\n        i * Number(msPerStep);\n\n      const date = new Date(graduationTime);\n      if (date.getUTCHours() === 0 && date.getUTCMinutes() === 0) {\n        caretClass = 'big';\n        lineH = (this.scale * 1.25);\n        const bigDate = DateUtil.formatDate(date, 'HH:mm:ss');\n        this.ctx.textAlign = 'center';\n        this.ctx.fillText(bigDate, graduationLeft, (this.scale * 1.5));\n        this.ctx.fillStyle = this.verticalBarColor;\n      } else if ((graduationTime / (60 * 1000)) % mediumStep === 0) {\n        caretClass = 'middle';\n        lineH = (this.scale * 0.75);\n        const middleDate = DateUtil.formatDate(date, 'HH:mm:ss');\n        this.ctx.textAlign = 'center';\n        this.ctx.fillText(middleDate, graduationLeft, (this.scale * 1.5));\n        this.ctx.fillStyle = this.verticalBarColor;\n      } else {\n        lineH = (this.scale * 0.5);\n      }\n      // drawLine(graduationLeft,0,graduationLeft,lineH,\"rgba(151,158,167,0.4)\",1);\n      this.drawLine(\n        graduationLeft,\n        0,\n        graduationLeft,\n        lineH,\n        this.verticalBarColor,\n        1\n      );\n    }\n  }\n\n  /**\n   * Draw the play button\n   */\n  drawPalyBar(): void {\n    this.ctx.beginPath();\n    this.ctx.moveTo(this.playBarOffsetX, 0);\n    this.ctx.lineTo(this.playBarOffsetX, (this.scale * 1.75));\n    this.ctx.strokeStyle = this.playBarColor;\n    this.ctx.stroke();\n    this.ctx.moveTo(this.playBarOffsetX, (this.scale * 1.75));\n    this.ctx.lineTo(this.playBarOffsetX, (this.scale * 1.75));\n    this.ctx.lineTo(this.playBarOffsetX - (this.scale * 0.6), (this.scale * 2.5));\n    this.ctx.lineTo(this.playBarOffsetX - (this.scale * 0.6), (this.scale * 3.5));\n    this.ctx.lineTo(this.playBarOffsetX + (this.scale * 0.6), (this.scale * 3.5));\n    this.ctx.lineTo(this.playBarOffsetX + (this.scale * 0.6), (this.scale * 2.5));\n    this.ctx.lineTo(this.playBarOffsetX, (this.scale * 1.75));\n    this.ctx.fillStyle = this.playBarColor;\n    this.ctx.fill();\n    this.ctx.closePath();\n    // this.init(this.startTimestamp, this.timecell, false);\n    const time = Number(this.currentTimestamp);\n    this.ctx.fillStyle = this.playBarColor;\n    this.ctx.textAlign = 'center';\n    this.ctx.fillText(\n      DateUtil.formatDate(new Date(time), 'YYYY-MM-DD HH:mm:ss'),\n      this.playBarOffsetX,\n      (this.scale * 4.25)\n    );\n  }\n\n  /**\n   * Draw the line\n   * @param  beginX The X-axis to start with\n   * @param  beginY The Y-axis to start with\n   * @param  endX The end of the X-axis\n   * @param  endY The end of the Y-axis\n   * @param  color color\n   * @param  width width\n   */\n  drawLine(\n    beginX: number,\n    beginY: number,\n    endX: number,\n    endY: number,\n    color: string,\n    width: number\n  ): void {\n    this.ctx.beginPath();\n    this.ctx.moveTo(beginX, beginY);\n    this.ctx.lineTo(endX, endY);\n    this.ctx.strokeStyle = color;\n    this.ctx.lineWidth = width;\n    this.ctx.stroke();\n  }\n\n  /**\n   * Add video segment\n   * @param  cells Video array\n   */\n  add_cells(cells: any): void {\n    cells.forEach((cell: MouseEvent) => {\n      this.draw_cell(cell);\n    });\n  }\n\n  /**\n   * Draw video blocks\n   * @param  cell The cell includes beginTime Ms; The endTime ms; style;\n   */\n  draw_cell(cell: any): void {\n    const pxPerMs = this.canvasW / (this.hoursPerRuler * 60 * 60 * 1000); // px/ms\n    const beginX = (cell.beginTime - this.startTimestamp) * pxPerMs;\n    const cellWidth = (cell.endTime - cell.beginTime) * pxPerMs;\n    this.ctx.fillStyle = cell.style.background;\n    this.ctx.fillRect(beginX, 0, cellWidth, (this.scale * 0.75));\n  }\n\n  /**\n   * Draws the background of the video block\n   */\n  drawCellBg(): void {\n    this.ctx.fillStyle = 'rgba(69, 72, 76, 0.5)';\n    this.ctx.fillRect(0, 0, this.canvasW, 0);\n  }\n\n  /**\n   * Drag/click the Mousedown event\n   */\n  mousedownFunc(e: MouseEvent): void {\n    this.gIsMousedown = true;\n    this.gMousedownCursor = this.get_cursor_x_position(e).posX;\n    this.gMousedownCursorY = this.get_cursor_x_position(e).posY;\n  }\n\n  /**\n   * Drag/mouse hover to display mousemove events\n   */\n  mousemoveFunc(e: MouseEvent): void {\n    this.clearCanvas();\n    const posX = this.get_cursor_x_position(e).posX;\n    const pxPerMs = this.canvasW / (this.hoursPerRuler * 3600 * 1000);\n    const diffX = posX - this.gMousedownCursor;\n    if (this.gIsMousedown) {\n      if (\n        this.gMousedownCursor >= this.playBarOffsetX1 &&\n        this.gMousedownCursor <= this.playBarOffsetX2 &&\n        this.gMousedownCursorY >= this.playBarOffsetY1 &&\n        this.gMousedownCursorY <= this.playBarOffsetY2\n      ) {\n        // this.playBarDistanceLeft = this.playBarOffsetX / this.pxPerMs / 3600 / 1000 / this.hoursPerRuler;\n        // this.playBarOffsetX = posX;\n        // this.playBarOffsetX1 = this.playBarOffsetX - (this.scale * 0.6);\n        // this.playBarOffsetX2 = this.playBarOffsetX + (this.scale * 0.6);\n\n        this.startTimestamp =\n          this.startTimestamp + Math.round(diffX / pxPerMs);\n\n        this.currentTimestamp =\n          (this.startTimestamp +\n            Math.round(this.playBarOffsetX / pxPerMs));\n\n        this.drawPalyBar();\n        this.init(this.startTimestamp, this.timecell, false);\n\n        this.gIsMousemove = true;\n\n      } else {\n        this.startTimestamp =\n          this.startTimestamp - Math.round(diffX / pxPerMs);\n\n        this.currentTimestamp =\n          this.startTimestamp +\n          Math.round(this.playBarOffsetX / pxPerMs);\n\n        this.drawPalyBar();\n        this.init(this.startTimestamp, this.timecell, true);\n\n        this.gIsMousemove = true;\n        this.gMousedownCursor = posX;\n\n      }\n      this.mouseUp.emit(this.currentTimestamp);\n\n    } else {\n\n      const time = this.startTimestamp + posX / pxPerMs;\n\n      this.drawPalyBar();\n      this.init(this.startTimestamp, this.timecell, true);\n      this.drawLine(posX, 0, posX, 50, 'rgb(194, 202, 215)', 1);\n\n      this.ctx.fillStyle = 'rgb(194, 202, 215)';\n      this.ctx.textAlign = 'center';\n      this.ctx.fillText(\n        DateUtil.formatDate(\n          new Date(time),\n          'YYYY-MM-DD HH:mm:ss'\n        ),\n        posX,\n        (this.scale * 3)\n      );\n\n    }\n  }\n\n  /**\n   * Drag/click the Mouseup event\n   */\n  mouseupFunc(e: MouseEvent): void {\n    if (this.gIsMousemove) {\n      // Drag events\n      this.gIsMousemove = false;\n      this.gIsMousedown = false;\n      this.playTime =\n        this.startTimestamp + this.hoursPerRuler * this.playBarDistanceLeft * 3600 * 1000;\n    } else {\n      // Click event\n      this.gIsMousedown = false;\n\n      // Mouse distance (px)\n      const posx = this.get_cursor_x_position(e).posX;\n\n      // ms/px\n      const msPerPx = (this.zoom * 3600 * 1000) / this.canvasW;\n\n      this.playTime = this.startTimestamp + posx * msPerPx;\n      this.set_time_to_middle(this.playTime);\n\n    }\n    this.mouseDown.emit(this.playTime);\n  }\n\n  /**\n   * Mouseout of the hidden time mouseout event\n   */\n  mouseoutFunc(): void {\n    this.clearCanvas();\n    // px/ms\n    const pxPerMs = this.canvasW / (this.hoursPerRuler * 3600 * 1000);\n    this.currentTimestamp =\n      this.startTimestamp +\n      Math.round(this.playBarOffsetX / pxPerMs);\n\n    this.drawPalyBar();\n    this.init(this.startTimestamp, this.timecell, true);\n  }\n\n  /**\n   * Scroll to the center of the timeline for the mousewheel event\n   */\n  mousewheelFunc(event: any): boolean {\n    if (event && event.preventDefault) {\n      event.preventDefault();\n    } else {\n      window.event.returnValue = false;\n      return false;\n    }\n\n    const e = window.event || event;\n    const delta = Math.max(-1, Math.min(1, e.wheelDelta || -e.detail));\n\n    // Ms Remember the current middle time\n    const middleTime =\n      this.startTimestamp + (this.hoursPerRuler * this.playBarDistanceLeft * 3600 * 1000);\n    if (delta < 0) {\n      this.zoom = this.zoom + 4;\n      if (this.zoom >= 24) {\n        // Shrink to a minimum of 24 hours\n        this.zoom = 24;\n      }\n      this.hoursPerRuler = this.zoom;\n    } else if (delta > 0) {\n      // amplification\n      this.zoom = this.zoom - 4;\n      if (this.zoom <= 1) {\n        // Zoom in at most one hour\n        this.zoom = 1;\n      }\n      this.hoursPerRuler = this.zoom;\n    }\n\n    this.clearCanvas();\n    // // startTimestamp = current middle time - zoom /2\n    this.startTimestamp =\n      middleTime - (this.hoursPerRuler * 3600 * 1000) / 2;\n\n    this.init(this.startTimestamp, this.timecell, true);\n    this.drawPalyBar();\n  }\n\n  /**\n   * Get the mouse POSx\n   * @param  e event\n   */\n  get_cursor_x_position(e: any): CanvasPos {\n    let posx = 0;\n    let posy = 0;\n\n    if (!e) {\n      e = window.event;\n    }\n    if (e.offsetX || e.offsetY) {\n      posx = e.offsetX;\n      posy = e.offsetY;\n    }\n\n    return { posX: posx, posY: posy };\n  }\n\n  /**\n   * The offset of the left start time, returns the unit ms\n   * @param  timestamp The time stamp\n   * @param  step The offset\n   */\n  ms_to_next_step(timestamp: number, step: number): number {\n    const remainder = timestamp % step;\n    return remainder ? step - remainder : 0;\n  }\n\n  /**\n   * Set the time to jump to the middle red line\n   *  @param  time Unit of ms\n   */\n  set_time_to_middle(time: number): void {\n    if (this.ctx) {\n      this.clearCanvas();\n      this.startTimestamp = time - (this.hoursPerRuler * this.playBarDistanceLeft * 3600 * 1000);\n      this.currentTimestamp = time;\n      this.drawPalyBar();\n      this.init(this.startTimestamp, this.timecell, true);\n    }\n  }\n\n  /**\n   * To redraw on a canvas, it must first be cleared.\n   */\n  clearCanvas(): void {\n    this.ctx.clearRect(0, 0, this.canvasW, (this.scale * 7.5));\n  }\n  /**\n   * Click to play\n   */\n\n  onPlayClick(): void {\n    // this.setTimeMove = undefined;\n    this.isPlayClick = true;\n    this.setTimeMove = interval(this.speed).subscribe((d: any) => {\n      this.playTime = Number(this.playTime) + 1 * 1000;\n      this.playClick.emit(this.playTime);\n      this.set_time_to_middle(this.playTime);\n    });\n  }\n  /**\n   * Click on the pause\n   */\n  onPauseClick(): void {\n    this.isPlayClick = false;\n    if (this.setTimeMove) {\n      // this.setTimeMove = undefined;\n      this.setTimeMove.unsubscribe();\n      this.playClick.emit(this.playTime);\n    }\n  }\n  /**\n   * Change video segment\n   */\n  changeVideo(): void {\n    const cells: Array<VideoCellType> = [\n      {\n        beginTime: new Date().getTime() - 1 * 1000 * 3600,\n        endTime: new Date().getTime() + 2 * 1000 * 3600,\n        style: {\n          background: 'rgba(132, 244, 180, 0.498039)'\n        }\n      }\n    ];\n    this.clearCanvas();\n    this.drawPalyBar();\n    this.init(this.startTimestamp, cells, true);\n  }\n\n  /**\n   * Temporary unused\n   * @param event MatDatepickerInputEvent(Date)\n   */\n  selectedTime(event: any): void {\n    const timestamp = new Date(event.value.getTime());\n    this.set_time_to_middle(Number(timestamp));\n  }\n\n  /**\n   * Temporary unused\n   * @param event MouseEvent\n   */\n  onDragStart(e: MouseEvent): boolean {\n    e.preventDefault();\n    return false;\n  }\n\n\n}\n","/*\n * Public API Surface of timeline\n */\n\nexport * from './lib/timeline.component';\nexport * from './lib/interfaces/timeline.interface';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}