import * as React from "react"; import {observable, action} from "mobx"; import {observer} from "mobx-react"; import "./TimelineOverview.scss"; interface TimelineOverviewProps{ scale: number; totalLength: number; visibleLength:number; visibleStart:number; currentBarX:number; changeCurrentBarX: (pixel:number) => void; movePanX: (pixel:number) => any; } @observer export class TimelineOverview extends React.Component{ @observable private _visibleRef = React.createRef(); @observable private _scrubberRef = React.createRef(); private readonly DEFAULT_HEIGHT = 50; private readonly DEFAULT_WIDTH = 300; @action onPointerDown = (e:React.PointerEvent) => { e.stopPropagation(); e.preventDefault(); document.removeEventListener("pointermove", this.onPanX); document.removeEventListener("pointerup", this.onPointerUp); document.addEventListener("pointermove", this.onPanX); document.addEventListener("pointerup", this.onPointerUp); } @action onPanX = (e: PointerEvent) => { e.stopPropagation(); e.preventDefault(); let movX = (this.props.visibleStart / this.props.totalLength)* (this.DEFAULT_WIDTH * this.props.scale) + e.movementX; this.props.movePanX((movX / (this.DEFAULT_WIDTH * this.props.scale)) * this.props.totalLength); } @action onPointerUp = (e: PointerEvent) => { e.stopPropagation(); e.preventDefault(); document.removeEventListener("pointermove", this.onPanX); document.removeEventListener("pointerup", this.onPointerUp); } @action onScrubberDown = ( e:React.PointerEvent) => { e.preventDefault(); e.stopPropagation(); document.removeEventListener("pointermove", this.onScrubberMove); document.removeEventListener("pointerup", this.onScrubberUp); document.addEventListener("pointermove", this.onScrubberMove); document.addEventListener("pointerup", this.onScrubberUp); } @action onScrubberMove = (e: PointerEvent) => { e.preventDefault(); e.stopPropagation(); let scrubberRef = this._scrubberRef.current!; let left = scrubberRef.getBoundingClientRect().left; let offsetX = Math.round(e.clientX - left); this.props.changeCurrentBarX(((offsetX / (this.DEFAULT_WIDTH * this.props.scale)) * this.props.totalLength) + this.props.currentBarX); } @action onScrubberUp = (e:PointerEvent) => { e.preventDefault(); e.stopPropagation(); document.removeEventListener("pointermove", this.onScrubberMove); document.removeEventListener("pointerup", this.onScrubberUp); } render(){ return(
); } }