floatLineComponent.tsx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import * as React from "react";
  2. import { Observable } from "babylonjs";
  3. import { PropertyChangedEvent } from "../../propertyChangedEvent";
  4. interface IFloatLineComponentProps {
  5. label: string,
  6. target: any,
  7. propertyName: string,
  8. step?: number,
  9. onPropertyChangedObservable?: Observable<PropertyChangedEvent>,
  10. additionalClass?: string
  11. }
  12. export class FloatLineComponent extends React.Component<IFloatLineComponentProps, { value: string }> {
  13. private _localChange = false;
  14. private _store: number;
  15. constructor(props: IFloatLineComponentProps) {
  16. super(props);
  17. let currentValue = this.props.target[this.props.propertyName];
  18. this.state = { value: currentValue ? currentValue.toFixed(3) : "0" }
  19. this._store = currentValue;
  20. }
  21. shouldComponentUpdate(nextProps: IFloatLineComponentProps, nextState: { value: string }) {
  22. if (this._localChange) {
  23. this._localChange = false;
  24. return true;
  25. }
  26. const newValue = nextProps.target[nextProps.propertyName];
  27. if (newValue !== nextState.value) {
  28. nextState.value = newValue.toFixed(3);
  29. return true;
  30. }
  31. return false;
  32. }
  33. raiseOnPropertyChanged(newValue: number, previousValue: number) {
  34. if (!this.props.onPropertyChangedObservable) {
  35. return;
  36. }
  37. this.props.onPropertyChangedObservable.notifyObservers({
  38. object: this.props.target,
  39. property: this.props.propertyName,
  40. value: newValue,
  41. initialValue: previousValue
  42. });
  43. }
  44. updateValue(valueString: string) {
  45. if (/[^0-9\.\-]/g.test(valueString)) {
  46. return;
  47. }
  48. let valueAsNumber = parseFloat(valueString);
  49. this._localChange = true;
  50. this.setState({ value: valueString });
  51. if (isNaN(valueAsNumber)) {
  52. return;
  53. }
  54. this.raiseOnPropertyChanged(valueAsNumber, this._store);
  55. this.props.target[this.props.propertyName] = valueAsNumber;
  56. this._store = valueAsNumber;
  57. }
  58. render() {
  59. const step = this.props.step !== undefined ? this.props.step : 0.1;
  60. return (
  61. <div className={this.props.additionalClass ? this.props.additionalClass + " floatLine" : "floatLine"}>
  62. <div className="label">
  63. {this.props.label}
  64. </div>
  65. <div className="value">
  66. <input className="numeric-input" value={this.state.value} onChange={evt => this.updateValue(evt.target.value)} step={step} />
  67. </div>
  68. </div>
  69. );
  70. }
  71. }