sliderLineComponent.tsx 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import * as React from "react";
  2. import { Observable } from "babylonjs";
  3. import { PropertyChangedEvent } from "../../propertyChangedEvent";
  4. interface ISliderLineComponentProps {
  5. label: string,
  6. target: any,
  7. propertyName: string,
  8. minimum: number,
  9. maximum: number,
  10. step: number,
  11. onPropertyChangedObservable?: Observable<PropertyChangedEvent>
  12. }
  13. export class SliderLineComponent extends React.Component<ISliderLineComponentProps, { value: number }> {
  14. private _localChange = false;
  15. constructor(props: ISliderLineComponentProps) {
  16. super(props);
  17. this.state = { value: this.props.target[this.props.propertyName] };
  18. }
  19. shouldComponentUpdate(nextProps: ISliderLineComponentProps, nextState: { value: number }) {
  20. const currentState = nextProps.target[nextProps.propertyName];
  21. if (currentState !== nextState.value || this._localChange) {
  22. nextState.value = currentState;
  23. this._localChange = false;
  24. return true;
  25. }
  26. return false;
  27. }
  28. onChange(newValueString: any) {
  29. this._localChange = true;
  30. const newValue = parseFloat(newValueString);
  31. if (this.props.onPropertyChangedObservable) {
  32. this.props.onPropertyChangedObservable.notifyObservers({
  33. object: this.props.target,
  34. property: this.props.propertyName,
  35. value: newValue,
  36. initialValue: this.state.value
  37. });
  38. }
  39. this.props.target[this.props.propertyName] = newValue;
  40. this.setState({ value: newValue });
  41. }
  42. render() {
  43. return (
  44. <div className="sliderLine">
  45. <div className="label">
  46. {this.props.label}
  47. </div>
  48. <div className="slider">
  49. {this.state.value ? this.state.value.toFixed(2) : "0"}&nbsp;<input className="range" type="range" step={this.props.step} min={this.props.minimum} max={this.props.maximum} value={this.state.value} onChange={evt => this.onChange(evt.target.value)} />
  50. </div>
  51. </div>
  52. );
  53. }
  54. }