import * as React from 'react'; import { Observable } from 'babylonjs/Misc/observable'; import { PropertyChangedEvent } from '../../../../../components/propertyChangedEvent'; import { Animation } from 'babylonjs/Animations/animation'; import { IconButtonLineComponent } from '../../../lines/iconButtonLineComponent'; import { NumericInputComponent } from '../../../lines/numericInputComponent'; import { AddAnimation } from './addAnimation'; import { AnimationListTree, SelectedCoordinate } from './animationListTree'; import { IAnimatable } from 'babylonjs/Animations/animatable.interface'; import { TargetedAnimation } from 'babylonjs/Animations/animationGroup'; import { LoadSnippet } from './loadsnippet'; import { SaveSnippet } from './saveSnippet'; import { LockObject } from '../lockObject'; interface IEditorControlsProps { isTargetedAnimation: boolean; entity: IAnimatable | TargetedAnimation; selected: Animation | null; lockObject: LockObject; onPropertyChangedObservable?: Observable; setNotificationMessage: (message: string) => void; selectAnimation: (selected: Animation, axis?: SelectedCoordinate) => void; } export class EditorControls extends React.Component< IEditorControlsProps, { isAnimationTabOpen: boolean; isEditTabOpen: boolean; isLoadTabOpen: boolean; isSaveTabOpen: boolean; isLoopActive: boolean; animationsCount: number; framesPerSecond: number; } > { constructor(props: IEditorControlsProps) { super(props); let count = this.props.isTargetedAnimation ? 1 : (this.props.entity as IAnimatable).animations?.length ?? 0; this.state = { isAnimationTabOpen: count === 0 ? true : false, isEditTabOpen: count === 0 ? false : true, isSaveTabOpen: false, isLoadTabOpen: false, isLoopActive: false, animationsCount: count, framesPerSecond: 60, }; } animationAdded() { // select recently created animation/first coordinate... this.setState({ animationsCount: this.recountAnimations(), isEditTabOpen: true, isAnimationTabOpen: false, }); } recountAnimations() { return (this.props.entity as IAnimatable).animations?.length ?? 0; } handleTabs(tab: number) { let state = { isAnimationTabOpen: true, isLoadTabOpen: false, isSaveTabOpen: false, isEditTabOpen: false, }; switch (tab) { case 0: state = { isAnimationTabOpen: true, isLoadTabOpen: false, isSaveTabOpen: false, isEditTabOpen: false, }; break; case 1: state = { isAnimationTabOpen: false, isLoadTabOpen: true, isSaveTabOpen: false, isEditTabOpen: false, }; break; case 2: state = { isAnimationTabOpen: false, isLoadTabOpen: false, isSaveTabOpen: true, isEditTabOpen: false, }; break; case 3: state = { isAnimationTabOpen: false, isLoadTabOpen: false, isSaveTabOpen: false, isEditTabOpen: true, }; break; } this.setState(state); } handleChangeFps(fps: number) { this.setState({ framesPerSecond: fps }); } emptiedList() { this.setState({ animationsCount: this.recountAnimations(), isEditTabOpen: false, isAnimationTabOpen: true, }); } render() { return (
{this.props.isTargetedAnimation ? null : ( this.handleTabs(0)} > )} this.handleTabs(1)} > this.handleTabs(2)} > {this.state.animationsCount === 0 ? null : ( this.handleTabs(3)} > )} {this.state.isEditTabOpen ? (
this.handleChangeFps(framesPerSecond) } />

fps

) : null} {this.state.isEditTabOpen ? ( { this.setState({ isLoopActive: !this.state.isLoopActive }); }} > ) : null}
{this.props.isTargetedAnimation ? null : ( { this.setState({ isAnimationTabOpen: false }); }} entity={this.props.entity as IAnimatable} setNotificationMessage={(message: string) => { this.props.setNotificationMessage(message); }} changed={() => this.animationAdded()} onPropertyChangedObservable={this.props.onPropertyChangedObservable} /> )} {this.state.isLoadTabOpen ? ( ) : null} {this.state.isSaveTabOpen ? ( ) : null} {this.state.isEditTabOpen ? ( this.emptiedList()} selectAnimation={this.props.selectAnimation} /> ) : null}
); } }