factorGradientStepGridComponent.tsx 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. import * as React from 'react';
  2. import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
  3. import { faTrash } from '@fortawesome/free-solid-svg-icons';
  4. import { GlobalState } from '../../../../globalState';
  5. import { FactorGradient } from 'babylonjs/Misc/gradients';
  6. import { LockObject } from '../lockObject';
  7. import { IParticleSystem } from 'babylonjs/Particles/IParticleSystem';
  8. import { ParticleSystem } from 'babylonjs/Particles/particleSystem';
  9. interface IFactorGradientStepGridComponent {
  10. globalState: GlobalState;
  11. gradient: FactorGradient;
  12. lockObject: LockObject;
  13. lineIndex: number;
  14. onDelete: () => void;
  15. onUpdateGradient: () => void;
  16. onCheckForReOrder: () => void;
  17. host: IParticleSystem,
  18. codeRecorderPropertyName: string,
  19. }
  20. export class FactorGradientStepGridComponent extends React.Component<IFactorGradientStepGridComponent, {gradient: number}> {
  21. constructor(props: IFactorGradientStepGridComponent) {
  22. super(props);
  23. this.state={gradient: props.gradient.gradient};
  24. }
  25. updateFactor1(factor: number) {
  26. this.props.gradient.factor1 = factor;
  27. this.props.globalState.onCodeChangedObservable.notifyObservers({
  28. object: this.props.host,
  29. code: `TARGET.${this.props.codeRecorderPropertyName}.factor1 = ${factor};`
  30. });
  31. this.props.onUpdateGradient();
  32. this.forceUpdate();
  33. }
  34. updateFactor2(factor: number) {
  35. this.props.gradient.factor2 = factor;
  36. this.props.globalState.onCodeChangedObservable.notifyObservers({
  37. object: this.props.host,
  38. code: `TARGET.${this.props.codeRecorderPropertyName}.factor2 = ${factor};`
  39. });
  40. this.props.onUpdateGradient();
  41. this.forceUpdate();
  42. }
  43. updateGradient(gradient: number) {
  44. this.props.gradient.gradient = gradient;
  45. this.setState({gradient: gradient});
  46. this.props.globalState.onCodeChangedObservable.notifyObservers({
  47. object: this.props.host,
  48. code: `TARGET.${this.props.codeRecorderPropertyName}.gradient = ${gradient};`
  49. });
  50. this.props.onUpdateGradient();
  51. }
  52. onPointerUp() {
  53. this.props.onCheckForReOrder();
  54. }
  55. lock() {
  56. if (this.props.lockObject) {
  57. this.props.lockObject.lock = true;
  58. }
  59. }
  60. unlock() {
  61. if (this.props.lockObject) {
  62. this.props.lockObject.lock = false;
  63. }
  64. }
  65. render() {
  66. let gradient = this.props.gradient;
  67. return (
  68. <div className="gradient-step">
  69. <div className="step">
  70. {`#${this.props.lineIndex}`}
  71. </div>
  72. <div className="factor1">
  73. <input type="number" step={"0.01"} className="numeric-input" value={gradient.factor1} onBlur={() => this.unlock()} onFocus={() => this.lock()}
  74. onChange={evt => this.updateFactor1(parseFloat(evt.target.value))} />
  75. </div>
  76. {
  77. this.props.host instanceof ParticleSystem &&
  78. <div className="factor2">
  79. <input type="number" step={"0.01"} className={"numeric-input" + ((gradient.factor1 === gradient.factor2 || gradient.factor2 === undefined) ? " grayed" : "")} value={gradient.factor2} onBlur={() => this.unlock()} onFocus={() => this.lock()}
  80. onChange={evt => this.updateFactor2(parseFloat(evt.target.value))} />
  81. </div>
  82. }
  83. <div className="step-value">
  84. {gradient.gradient.toFixed(2)}
  85. </div>
  86. <div className="step-slider">
  87. <input className="range" type="range" step={0.01} min={0} max={1.0} value={gradient.gradient}
  88. onPointerUp={evt => this.onPointerUp()}
  89. onChange={evt => this.updateGradient(parseFloat(evt.target.value))} />
  90. </div>
  91. <div className="gradient-delete" onClick={() => this.props.onDelete()}>
  92. <FontAwesomeIcon icon={faTrash} />
  93. </div>
  94. </div>
  95. )
  96. }
  97. }