import * as React from "react"; import { IAnimationKey } from 'babylonjs/Animations/animationKey'; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faCaretRight, faCaretLeft, faStepBackward, faStepForward } from "@fortawesome/free-solid-svg-icons"; interface ITimelineProps { keyframes: IAnimationKey[] | null; selected: IAnimationKey | null; currentFrame: number; onCurrentFrameChange: (frame: number) => void; } export class Timeline extends React.Component{ readonly _frames: object[] = Array(300).fill({}); private _scrollable: React.RefObject; constructor(props: ITimelineProps) { super(props); if (this.props.selected !== null){ this.state = { selected: this.props.selected }; } this._scrollable = React.createRef(); } handleInputChange(event: React.ChangeEvent) { this.props.onCurrentFrameChange(parseInt(event.target.value)); event.preventDefault(); } nextFrame(event: React.MouseEvent) { event.preventDefault(); this.props.onCurrentFrameChange(this.props.currentFrame + 1); (this._scrollable.current as HTMLDivElement).scrollLeft = this.props.currentFrame * 5; } previousFrame(event: React.MouseEvent) { event.preventDefault(); if (this.props.currentFrame !== 0) { this.props.onCurrentFrameChange(this.props.currentFrame - 1); (this._scrollable.current as HTMLDivElement).scrollLeft = -(this.props.currentFrame * 5); } } nextKeyframe(event: React.MouseEvent) { event.preventDefault(); if (this.props.keyframes !== null){ let first = this.props.keyframes.find(kf => kf.frame > this.props.currentFrame); if (first) { this.props.onCurrentFrameChange(first.frame); this.setState({ selected: first }); (this._scrollable.current as HTMLDivElement).scrollLeft = first.frame * 5; } } } previousKeyframe(event: React.MouseEvent) { event.preventDefault(); if (this.props.keyframes !== null){ let first = this.props.keyframes.find(kf => kf.frame < this.props.currentFrame); if (first) { this.props.onCurrentFrameChange(first.frame); this.setState({ selected: first }); (this._scrollable.current as HTMLDivElement).scrollLeft = -(first.frame * 5); } } } render() { return ( <>
{ this.props.keyframes && this.props.keyframes.map((kf, i) => { return }) } { this._frames.map((frame, i) => { return {i % 10 === 0 ? {i} : null} }) }
this.handleInputChange(e)}>
this.previousFrame(e)}>
this.previousKeyframe(e)}>
this.nextKeyframe(e)}>
this.nextFrame(e)}>
) } }