sliderLineComponent.tsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import * as React from "react";
  2. import { Observable } from "babylonjs/Misc/observable";
  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. directValue?: number;
  12. onChange?: (value: number) => void;
  13. onInput?: (value: number) => void;
  14. onPropertyChangedObservable?: Observable<PropertyChangedEvent>;
  15. decimalCount?: number;
  16. }
  17. export class SliderLineComponent extends React.Component<ISliderLineComponentProps, { value: number }> {
  18. private _localChange = false;
  19. constructor(props: ISliderLineComponentProps) {
  20. super(props);
  21. if (this.props.directValue !== undefined) {
  22. this.state = {
  23. value: this.props.directValue
  24. }
  25. } else {
  26. let value = this.props.target![this.props.propertyName!];
  27. if (value === undefined) {
  28. value = this.props.maximum;
  29. }
  30. this.state = { value: value };
  31. }
  32. }
  33. shouldComponentUpdate(nextProps: ISliderLineComponentProps, nextState: { value: number }) {
  34. if (nextProps.directValue !== undefined) {
  35. nextState.value = nextProps.directValue;
  36. return true;
  37. }
  38. let currentState = nextProps.target![nextProps.propertyName!];
  39. if (currentState === undefined) {
  40. currentState = nextProps.maximum;
  41. }
  42. if (currentState !== nextState.value || this._localChange) {
  43. nextState.value = currentState;
  44. this._localChange = false;
  45. return true;
  46. }
  47. return false;
  48. }
  49. onChange(newValueString: any) {
  50. this._localChange = true;
  51. const newValue = parseFloat(newValueString);
  52. if (this.props.target) {
  53. if (this.props.onPropertyChangedObservable) {
  54. this.props.onPropertyChangedObservable.notifyObservers({
  55. object: this.props.target,
  56. property: this.props.propertyName!,
  57. value: newValue,
  58. initialValue: this.state.value
  59. });
  60. }
  61. this.props.target[this.props.propertyName!] = newValue;
  62. }
  63. if (this.props.onChange) {
  64. this.props.onChange(newValue);
  65. }
  66. this.setState({ value: newValue });
  67. }
  68. onInput(newValueString: any) {
  69. const newValue = parseFloat(newValueString);
  70. if (this.props.onInput) {
  71. this.props.onInput(newValue);
  72. }
  73. }
  74. render() {
  75. let decimalCount = this.props.decimalCount !== undefined ? this.props.decimalCount : 2;
  76. return (
  77. <div className="sliderLine">
  78. <div className="label">
  79. {this.props.label}
  80. </div>
  81. <div className="slider">
  82. {this.state.value ? this.state.value.toFixed(decimalCount) : "0"}&nbsp;<input className="range" type="range" step={this.props.step} min={this.props.minimum} max={this.props.maximum} value={this.state.value}
  83. onInput={evt => this.onInput((evt.target as HTMLInputElement).value)}
  84. onChange={evt => this.onChange(evt.target.value)} />
  85. </div>
  86. </div>
  87. );
  88. }
  89. }