123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- 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<PropertyChangedEvent>;
- 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() {
- 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 (
- <div className="animation-list">
- <div className="controls-header">
- {this.props.isTargetedAnimation ? null : (
- <IconButtonLineComponent
- active={this.state.isAnimationTabOpen}
- tooltip="Add Animation"
- icon="medium add-animation"
- onClick={() => this.handleTabs(0)}
- ></IconButtonLineComponent>
- )}
- <IconButtonLineComponent
- active={this.state.isLoadTabOpen}
- tooltip="Load Animation"
- icon="medium load"
- onClick={() => this.handleTabs(1)}
- ></IconButtonLineComponent>
- <IconButtonLineComponent
- active={this.state.isSaveTabOpen}
- tooltip="Save Animation"
- icon="medium save"
- onClick={() => this.handleTabs(2)}
- ></IconButtonLineComponent>
- {this.state.animationsCount === 0 ? null : (
- <IconButtonLineComponent
- active={this.state.isEditTabOpen}
- tooltip="Edit Animations"
- icon="medium animation-edit"
- onClick={() => this.handleTabs(3)}
- ></IconButtonLineComponent>
- )}
- {this.state.isEditTabOpen ? (
- <div className="input-fps">
- <NumericInputComponent
- label={""}
- precision={0}
- value={this.state.framesPerSecond}
- onChange={(framesPerSecond: number) =>
- this.handleChangeFps(framesPerSecond)
- }
- />
- <p>fps</p>
- </div>
- ) : null}
- {this.state.isEditTabOpen ? (
- <IconButtonLineComponent
- tooltip="Loop/Unloop"
- icon={`medium ${
- this.state.isLoopActive
- ? "loop-active last"
- : "loop-inactive last"
- }`}
- onClick={() => {
- this.setState({ isLoopActive: !this.state.isLoopActive });
- }}
- ></IconButtonLineComponent>
- ) : null}
- </div>
- {this.props.isTargetedAnimation ? null : (
- <AddAnimation
- isOpen={this.state.isAnimationTabOpen}
- close={() => {
- 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 ? (
- <LoadSnippet lockObject={this.props.lockObject} animations={[]} />
- ) : null}
- {this.state.isSaveTabOpen ? (
- <SaveSnippet lockObject={this.props.lockObject} animations={[]} />
- ) : null}
- {this.state.isEditTabOpen ? (
- <AnimationListTree
- isTargetedAnimation={this.props.isTargetedAnimation}
- entity={this.props.entity}
- selected={this.props.selected}
- onPropertyChangedObservable={this.props.onPropertyChangedObservable}
- empty={() => this.emptiedList()}
- selectAnimation={this.props.selectAnimation}
- />
- ) : null}
- </div>
- );
- }
- }
|