import * as React from "react"; import { Observable } from "babylonjs/Misc/observable"; import { Color3, Color4 } from "babylonjs/Maths/math.color"; import { PropertyChangedEvent } from "./propertyChangedEvent"; import { NumericInputComponent } from "./numericInputComponent"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faMinus, faPlus } from "@fortawesome/free-solid-svg-icons"; import { GlobalState } from '../globalState'; const copyIcon: string = require("./copy.svg"); export interface IColor3LineComponentProps { label: string; target: any; propertyName: string; onPropertyChangedObservable?: Observable; onChange?: () => void; globalState: GlobalState; } export class Color3LineComponent extends React.Component { private _localChange = false; constructor(props: IColor3LineComponentProps) { super(props); this.state = { isExpanded: false, color: this.props.target[this.props.propertyName].clone() }; } shouldComponentUpdate(nextProps: IColor3LineComponentProps, nextState: { color: Color3 }) { const currentState = nextProps.target[nextProps.propertyName]; if (!currentState.equals(nextState.color) || this._localChange) { nextState.color = currentState.clone(); this._localChange = false; return true; } return false; } onChange(newValue: string) { this._localChange = true; const newColor = Color3.FromHexString(newValue); if (this.props.onPropertyChangedObservable) { this.props.onPropertyChangedObservable.notifyObservers({ object: this.props.target, property: this.props.propertyName, value: newColor, initialValue: this.state.color }); } if (this.props.target[this.props.propertyName].getClassName() === "Color4") { this.props.target[this.props.propertyName] = new Color4(newColor.r, newColor.g, newColor.b, 1.0); } else { this.props.target[this.props.propertyName] = newColor; } this.setState({ color: newColor }); if (this.props.onChange) { this.props.onChange(); } } switchExpandState() { this._localChange = true; this.setState({ isExpanded: !this.state.isExpanded }); } raiseOnPropertyChanged(previousValue: Color3) { if (this.props.onChange) { this.props.onChange(); } if (!this.props.onPropertyChangedObservable) { return; } this.props.onPropertyChangedObservable.notifyObservers({ object: this.props.target, property: this.props.propertyName, value: this.state.color, initialValue: previousValue }); } updateStateR(value: number) { this._localChange = true; const store = this.state.color.clone(); this.props.target[this.props.propertyName].x = value; this.state.color.r = value; this.props.target[this.props.propertyName] = this.state.color; this.setState({ color: this.state.color }); this.raiseOnPropertyChanged(store); } updateStateG(value: number) { this._localChange = true; const store = this.state.color.clone(); this.props.target[this.props.propertyName].g = value; this.state.color.g = value; this.props.target[this.props.propertyName] = this.state.color; this.setState({ color: this.state.color }); this.raiseOnPropertyChanged(store); } updateStateB(value: number) { this._localChange = true; const store = this.state.color.clone(); this.props.target[this.props.propertyName].b = value; this.state.color.b = value; this.props.target[this.props.propertyName] = this.state.color; this.setState({ color: this.state.color }); this.raiseOnPropertyChanged(store); } copyToClipboard() { var element = document.createElement('div'); element.textContent = this.state.color.toHexString(); document.body.appendChild(element); if (window.getSelection) { var range = document.createRange(); range.selectNode(element); window.getSelection()!.removeAllRanges(); window.getSelection()!.addRange(range); } document.execCommand('copy'); element.remove(); } render() { const chevron = this.state.isExpanded ? : ; const colorAsColor3 = this.state.color.getClassName() === "Color3" ? this.state.color : new Color3(this.state.color.r, this.state.color.g, this.state.color.b); return (
{this.props.label}
this.onChange(evt.target.value)} />
this.copyToClipboard()} title="Copy to clipboard">
this.switchExpandState()} title="Expand"> {chevron}
{ this.state.isExpanded &&
this.updateStateR(value)} /> this.updateStateG(value)} /> this.updateStateB(value)} />
}
); } }