factorGradientGridComponent.tsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import * as React from "react";
  2. import { Observable } from 'babylonjs/Misc/observable';
  3. import { PropertyChangedEvent } from '../../../../propertyChangedEvent';
  4. import { GlobalState } from '../../../../globalState';
  5. import { FactorGradient } from 'babylonjs/Misc/gradients';
  6. import { LockObject } from '../lockObject';
  7. import { ButtonLineComponent } from '../../../lines/buttonLineComponent';
  8. import { FactorGradientStepGridComponent } from './factorGradientStepGridComponent';
  9. import { Nullable } from 'babylonjs/types';
  10. import { TextLineComponent } from '../../../lines/textLineComponent';
  11. interface IFactorGradientGridComponent {
  12. globalState: GlobalState;
  13. label: string;
  14. gradients: Nullable<Array<FactorGradient>>,
  15. lockObject: LockObject,
  16. docLink?: string,
  17. replaySourceReplacement?: string,
  18. onCreateRequired: () => void,
  19. onPropertyChangedObservable?: Observable<PropertyChangedEvent>
  20. }
  21. export class FactorGradientGridComponent extends React.Component<IFactorGradientGridComponent> {
  22. constructor(props: IFactorGradientGridComponent) {
  23. super(props)
  24. }
  25. deleteStep(step: FactorGradient) {
  26. let gradients = this.props.gradients as Array<FactorGradient>;
  27. let index = gradients.indexOf(step);
  28. if (index > -1) {
  29. gradients.splice(index, 1);
  30. this.forceUpdate();
  31. }
  32. }
  33. addNewStep() {
  34. let gradients = this.props.gradients as Array<FactorGradient>;
  35. let newStep = new FactorGradient();
  36. newStep.gradient = 1.0;
  37. newStep.factor1 = 1.0;
  38. newStep.factor2 = 1.0;
  39. gradients.push(newStep);
  40. this.forceUpdate();
  41. }
  42. checkForReOrder() {
  43. let gradients = this.props.gradients as Array<FactorGradient>;
  44. gradients.sort((a, b) => {
  45. if (a.gradient === b.gradient) {
  46. return 0;
  47. }
  48. if (a.gradient > b.gradient) {
  49. return 1;
  50. }
  51. return -1;
  52. });
  53. this.forceUpdate();
  54. }
  55. render() {
  56. let gradients = this.props.gradients as Nullable<Array<FactorGradient>>;
  57. return (
  58. <div>
  59. {
  60. gradients &&
  61. <div className="gradient-container">
  62. <TextLineComponent label={this.props.label} url={this.props.docLink}/>
  63. <ButtonLineComponent label="Add new step" onClick={() => this.addNewStep()} />
  64. {
  65. gradients.map((g, i) => {
  66. return (
  67. <FactorGradientStepGridComponent globalState={this.props.globalState}
  68. lockObject={this.props.lockObject}
  69. onCheckForReOrder={() => this.checkForReOrder()}
  70. onUpdateGradient={() => this.forceUpdate()}
  71. key={"step-" + i} lineIndex={i} gradient={g} onDelete={() => this.deleteStep(g)}/>
  72. )
  73. })
  74. }
  75. </div>
  76. }
  77. {
  78. !gradients &&
  79. <ButtonLineComponent label={"Use " + this.props.label} onClick={() => {
  80. this.props.onCreateRequired();
  81. this.forceUpdate();
  82. }} />
  83. }
  84. </div>
  85. );
  86. }
  87. }