floatLineComponent.tsx 2.6 KB

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