gradientStepComponent.tsx 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import * as React from 'react';
  2. import { GlobalState } from '../../globalState';
  3. import { Color3 } from 'babylonjs/Maths/math.color';
  4. import { GradientBlockColorStep } from 'babylonjs/Materials/Node/Blocks/gradientBlock';
  5. import { ColorPickerLineComponent } from '../../sharedComponents/colorPickerComponent';
  6. import { FloatLineComponent } from '../../sharedComponents/floatLineComponent';
  7. const deleteButton = require('../../../imgs/delete.svg');
  8. const copyIcon: string = require('../../sharedComponents/copy.svg');
  9. interface IGradientStepComponentProps {
  10. globalState: GlobalState;
  11. step: GradientBlockColorStep;
  12. lineIndex: number;
  13. onDelete: () => void;
  14. onUpdateStep: () => void;
  15. onCheckForReOrder: () => void;
  16. onCopy?: () => void;
  17. }
  18. export class GradientStepComponent extends React.Component<IGradientStepComponentProps, {gradient: number}> {
  19. constructor(props: IGradientStepComponentProps) {
  20. super(props);
  21. this.state={gradient: props.step.step};
  22. }
  23. updateColor(color: string) {
  24. this.props.step.color = Color3.FromHexString(color);
  25. this.props.onUpdateStep();
  26. this.forceUpdate();
  27. }
  28. updateStep(gradient: number) {
  29. this.props.step.step = gradient;
  30. this.setState({gradient: gradient});
  31. this.props.onUpdateStep();
  32. }
  33. onPointerUp() {
  34. this.props.onCheckForReOrder();
  35. }
  36. render() {
  37. let step = this.props.step;
  38. return (
  39. <div className="gradient-step">
  40. <div className="step">
  41. {`#${this.props.lineIndex}`}
  42. </div>
  43. <div className="color">
  44. <ColorPickerLineComponent value={step.color} disableAlpha={true} globalState={this.props.globalState}
  45. onColorChanged={color => {
  46. this.updateColor(color);
  47. }}
  48. />
  49. </div>
  50. <div className="step-value">
  51. <FloatLineComponent globalState={this.props.globalState} smallUI={true} label="" target={step} propertyName="step"
  52. min={0} max={1}
  53. onEnter={ evt => {
  54. this.props.onUpdateStep();
  55. this.props.onCheckForReOrder();
  56. this.forceUpdate();
  57. }
  58. }
  59. ></FloatLineComponent>
  60. </div>
  61. <div className="step-slider">
  62. <input className="range" type="range" step={0.01} min={0} max={1.0} value={step.step}
  63. onPointerUp={evt => this.onPointerUp()}
  64. onChange={evt => this.updateStep(parseFloat(evt.target.value))} />
  65. </div>
  66. <div className="gradient-copy" onClick={() => {if(this.props.onCopy) this.props.onCopy()}} title="Copy Step">
  67. <img className="img" src={copyIcon} />
  68. </div>
  69. <div className="gradient-delete" onClick={() => this.props.onDelete()} title={"Delete Step"}>
  70. <img className="img" src={deleteButton}/>
  71. </div>
  72. </div>
  73. )
  74. }
  75. }