animation.tsx 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. /**
  2. * Copyright (c) 2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author David Sehnal <david.sehnal@gmail.com>
  5. */
  6. import * as React from 'react';
  7. import { PluginUIComponent } from '../base';
  8. import { ParameterControls, ParamOnChange } from '../controls/parameters';
  9. import { Icon } from '../controls/common';
  10. export class AnimationControlsWrapper extends PluginUIComponent<{ }> {
  11. render() {
  12. const anim = this.plugin.state.animation;
  13. if (anim.isEmpty) return null;
  14. return <div className='msp-controls-section'>
  15. <div className='msp-section-header'><Icon name='code' /> Animations</div>
  16. <AnimationControls />
  17. </div>
  18. }
  19. }
  20. export class AnimationControls extends PluginUIComponent<{ onStart?: () => void }> {
  21. componentDidMount() {
  22. this.subscribe(this.plugin.state.animation.events.updated, () => this.forceUpdate());
  23. }
  24. updateParams: ParamOnChange = p => {
  25. this.plugin.state.animation.updateParams({ [p.name]: p.value });
  26. }
  27. updateCurrentParams: ParamOnChange = p => {
  28. this.plugin.state.animation.updateCurrentParams({ [p.name]: p.value });
  29. }
  30. startOrStop = () => {
  31. const anim = this.plugin.state.animation;
  32. if (anim.state.animationState === 'playing') anim.stop();
  33. else {
  34. if (this.props.onStart) this.props.onStart();
  35. anim.start();
  36. }
  37. }
  38. render() {
  39. const anim = this.plugin.state.animation;
  40. if (anim.isEmpty) return null;
  41. const isDisabled = anim.state.animationState === 'playing';
  42. return <>
  43. <ParameterControls params={anim.getParams()} values={anim.state.params} onChange={this.updateParams} isDisabled={isDisabled} />
  44. <ParameterControls params={anim.current.params} values={anim.current.paramValues} onChange={this.updateCurrentParams} isDisabled={isDisabled} />
  45. <div className='msp-btn-row-group'>
  46. <button className='msp-btn msp-btn-block msp-form-control' onClick={this.startOrStop}>
  47. {anim.state.animationState !== 'playing' && <Icon name='play' />}
  48. {anim.state.animationState === 'playing' ? 'Stop' : 'Start'}
  49. </button>
  50. </div>
  51. </>;
  52. }
  53. }