factorGradientStepGridComponent.tsx 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  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, factor1: string, factor2?: string}> {
  21. constructor(props: IFactorGradientStepGridComponent) {
  22. super(props);
  23. this.state={gradient: props.gradient.gradient, factor1: this.props.gradient.factor1.toString(), factor2: this.props.gradient.factor2?.toString()};
  24. }
  25. shouldComponentUpdate(nextProps: IFactorGradientStepGridComponent, nextState: {gradient: number, factor1: string, factor2?: string}) {
  26. if (nextProps.gradient !== this.props.gradient) {
  27. nextState.gradient = nextProps.gradient.gradient;
  28. nextState.factor1 = nextProps.gradient.factor1.toString();
  29. nextState.factor2 = nextProps.gradient.factor2?.toString();
  30. }
  31. return true;
  32. }
  33. updateFactor1(valueString: string) {
  34. if (/[^0-9\.\-]/g.test(valueString)) {
  35. return;
  36. }
  37. let valueAsNumber = parseFloat(valueString);
  38. this.setState({factor1: valueString});
  39. if (isNaN(valueAsNumber)) {
  40. return;
  41. }
  42. this.props.gradient.factor1 = valueAsNumber;
  43. this.props.globalState.onCodeChangedObservable.notifyObservers({
  44. object: this.props.host,
  45. code: `TARGET.${this.props.codeRecorderPropertyName}.factor1 = ${valueAsNumber};`
  46. });
  47. this.props.onUpdateGradient();
  48. this.forceUpdate();
  49. }
  50. updateFactor2(valueString: string) {
  51. if (/[^0-9\.\-]/g.test(valueString)) {
  52. return;
  53. }
  54. let valueAsNumber = parseFloat(valueString);
  55. this.setState({factor2: valueString});
  56. if (isNaN(valueAsNumber)) {
  57. return;
  58. }
  59. this.props.gradient.factor2 = valueAsNumber;
  60. this.props.globalState.onCodeChangedObservable.notifyObservers({
  61. object: this.props.host,
  62. code: `TARGET.${this.props.codeRecorderPropertyName}.factor2 = ${valueAsNumber};`
  63. });
  64. this.props.onUpdateGradient();
  65. this.forceUpdate();
  66. }
  67. updateGradient(gradient: number) {
  68. this.props.gradient.gradient = gradient;
  69. this.setState({gradient: gradient});
  70. this.props.globalState.onCodeChangedObservable.notifyObservers({
  71. object: this.props.host,
  72. code: `TARGET.${this.props.codeRecorderPropertyName}.gradient = ${gradient};`
  73. });
  74. this.props.onUpdateGradient();
  75. }
  76. onPointerUp() {
  77. this.props.onCheckForReOrder();
  78. }
  79. lock() {
  80. if (this.props.lockObject) {
  81. this.props.lockObject.lock = true;
  82. }
  83. }
  84. unlock() {
  85. if (this.props.lockObject) {
  86. this.props.lockObject.lock = false;
  87. }
  88. }
  89. render() {
  90. let gradient = this.props.gradient;
  91. return (
  92. <div className="gradient-step">
  93. <div className="step">
  94. {`#${this.props.lineIndex}`}
  95. </div>
  96. <div className="factor1">
  97. <input type="number" step={"0.01"} className="numeric-input" value={this.state.factor1} onBlur={() => this.unlock()} onFocus={() => this.lock()}
  98. onChange={evt => this.updateFactor1(evt.target.value)} />
  99. </div>
  100. {
  101. this.props.host instanceof ParticleSystem &&
  102. <div className="factor2">
  103. <input type="number" step={"0.01"} className={"numeric-input" + ((this.state.factor1 === this.state.factor2 || gradient.factor2 === undefined) ? " grayed" : "")} value={this.state.factor2} onBlur={() => this.unlock()} onFocus={() => this.lock()}
  104. onChange={evt => this.updateFactor2(evt.target.value)} />
  105. </div>
  106. }
  107. <div className="step-value">
  108. {gradient.gradient.toFixed(2)}
  109. </div>
  110. <div className="step-slider">
  111. <input className="range" type="range" step={0.01} min={0} max={1.0} value={gradient.gradient}
  112. onPointerUp={evt => this.onPointerUp()}
  113. onChange={evt => this.updateGradient(parseFloat(evt.target.value))} />
  114. </div>
  115. <div className="gradient-delete hoverIcon" onClick={() => this.props.onDelete()}>
  116. <FontAwesomeIcon icon={faTrash} />
  117. </div>
  118. </div>
  119. )
  120. }
  121. }