factorGradientStepGridComponent.tsx 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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. interface IFactorGradientStepGridComponent {
  8. globalState: GlobalState;
  9. gradient: FactorGradient;
  10. lockObject: LockObject;
  11. lineIndex: number;
  12. onDelete: () => void;
  13. onUpdateGradient: () => void;
  14. onCheckForReOrder: () => void;
  15. }
  16. export class FactorGradientStepGridComponent extends React.Component<IFactorGradientStepGridComponent, {gradient: number}> {
  17. constructor(props: IFactorGradientStepGridComponent) {
  18. super(props);
  19. this.state={gradient: props.gradient.gradient};
  20. }
  21. updateFactor1(factor: number) {
  22. this.props.gradient.factor1 = factor;
  23. this.props.onUpdateGradient();
  24. this.forceUpdate();
  25. }
  26. updateFactor2(factor: number) {
  27. this.props.gradient.factor2 = factor;
  28. this.props.onUpdateGradient();
  29. this.forceUpdate();
  30. }
  31. updateGradient(gradient: number) {
  32. this.props.gradient.gradient = gradient;
  33. this.setState({gradient: gradient});
  34. this.props.onUpdateGradient();
  35. }
  36. onPointerUp() {
  37. this.props.onCheckForReOrder();
  38. }
  39. lock() {
  40. if (this.props.lockObject) {
  41. this.props.lockObject.lock = true;
  42. }
  43. }
  44. unlock() {
  45. if (this.props.lockObject) {
  46. this.props.lockObject.lock = false;
  47. }
  48. }
  49. render() {
  50. let gradient = this.props.gradient;
  51. return (
  52. <div className="gradient-step">
  53. <div className="step">
  54. {`#${this.props.lineIndex}`}
  55. </div>
  56. <div className="factor1">
  57. <input type="number" step={"0.01"} className="numeric-input" value={gradient.factor1} onBlur={() => this.unlock()} onFocus={() => this.lock()}
  58. onChange={evt => this.updateFactor1(parseFloat(evt.target.value))} />
  59. </div>
  60. <div className="factor2">
  61. <input type="number" step={"0.01"} className="numeric-input" value={gradient.factor2} onBlur={() => this.unlock()} onFocus={() => this.lock()}
  62. onChange={evt => this.updateFactor2(parseFloat(evt.target.value))} />
  63. </div>
  64. <div className="step-value">
  65. {gradient.gradient.toFixed(2)}
  66. </div>
  67. <div className="step-slider">
  68. <input className="range" type="range" step={0.01} min={0} max={1.0} value={gradient.gradient}
  69. onPointerUp={evt => this.onPointerUp()}
  70. onChange={evt => this.updateGradient(parseFloat(evt.target.value))} />
  71. </div>
  72. <div className="gradient-delete" onClick={() => this.props.onDelete()}>
  73. <FontAwesomeIcon icon={faTrash} />
  74. </div>
  75. </div>
  76. )
  77. }
  78. }