123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- import * as React from "react";
- import { Observable } from "babylonjs/Misc/observable";
- import { PropertyChangedEvent } from "../propertyChangedEvent";
- import { Tools } from 'babylonjs/Misc/tools';
- import { FloatLineComponent } from './floatLineComponent';
- interface ISliderLineComponentProps {
- label: string;
- target?: any;
- propertyName?: string;
- minimum: number;
- maximum: number;
- step: number;
- directValue?: number;
- useEuler?: boolean;
- onChange?: (value: number) => void;
- onInput?: (value: number) => void;
- onPropertyChangedObservable?: Observable<PropertyChangedEvent>;
- decimalCount?: number;
- margin?: boolean;
- }
- export class SliderLineComponent extends React.Component<ISliderLineComponentProps, { value: number }> {
- private _localChange = false;
- constructor(props: ISliderLineComponentProps) {
- super(props);
- if (this.props.directValue !== undefined) {
- this.state = {
- value: this.props.directValue
- }
- } else {
- let value = this.props.target![this.props.propertyName!];
- if (value === undefined) {
- value = this.props.maximum;
- }
- this.state = { value: value };
- }
- }
- shouldComponentUpdate(nextProps: ISliderLineComponentProps, nextState: { value: number }) {
- if (nextProps.directValue !== undefined) {
- nextState.value = nextProps.directValue;
- return true;
- }
- let currentState = nextProps.target![nextProps.propertyName!];
- if (currentState === undefined) {
- currentState = nextProps.maximum;
- }
- if (currentState !== nextState.value || this._localChange || nextProps.maximum !== this.props.maximum || nextProps.minimum !== this.props.minimum) {
- nextState.value = currentState;
- this._localChange = false;
- return true;
- }
- return false;
- }
- onChange(newValueString: any) {
- this._localChange = true;
- let newValue = parseFloat(newValueString);
- if (this.props.useEuler) {
- newValue = Tools.ToRadians(newValue);
- }
- if (this.props.target) {
- if (this.props.onPropertyChangedObservable) {
- this.props.onPropertyChangedObservable.notifyObservers({
- object: this.props.target,
- property: this.props.propertyName!,
- value: newValue,
- initialValue: this.state.value
- });
- }
- this.props.target[this.props.propertyName!] = newValue;
- }
- if (this.props.onChange) {
- this.props.onChange(newValue);
- }
- this.setState({ value: newValue });
- }
- onInput(newValueString: any) {
- const newValue = parseFloat(newValueString);
- if (this.props.onInput) {
- this.props.onInput(newValue);
- }
- }
- prepareDataToRead(value: number) {
- if (value === null) {
- value = 0;
- }
- if (this.props.useEuler) {
- return Tools.ToDegrees(value);
- }
- return value;
- }
- render() {
- return (
- <div className="sliderLine">
- <div className={this.props.margin ? "label withMargins" : "label"} title={this.props.label}>
- {this.props.label}
- </div>
- <FloatLineComponent smallUI={true} label="" target={this.state} digits={this.props.decimalCount === undefined ? 4 : this.props.decimalCount} propertyName="value" min={this.props.minimum} max={this.props.maximum}
- onEnter={ () => {
- var changed = this.prepareDataToRead(this.state.value); this.onChange(changed);
- }
- }
- onChange={evt => {var changed = this.prepareDataToRead(this.state.value); this.onChange(changed)}} >
- </FloatLineComponent>
- <div className="slider">
- <input className="range" type="range" step={this.props.step} min={this.prepareDataToRead(this.props.minimum)} max={this.prepareDataToRead(this.props.maximum)} value={this.prepareDataToRead(this.state.value)}
- onInput={evt => this.onInput((evt.target as HTMLInputElement).value)}
- onChange={evt => this.onChange(evt.target.value)} />
- </div>
- </div>
- );
- }
- }
|