import * as React from "react"; import { GlobalState } from '../../globalState'; import { Nullable } from 'babylonjs/types'; import { ButtonLineComponent } from '../../sharedUiComponents/lines/buttonLineComponent'; import { LineContainerComponent } from '../../sharedComponents/lineContainerComponent'; import { FileButtonLineComponent } from '../../sharedUiComponents/lines/fileButtonLineComponent'; import { Tools } from 'babylonjs/Misc/tools'; import { SerializationTools } from '../../serializationTools'; import { CheckBoxLineComponent } from '../../sharedComponents/checkBoxLineComponent'; import { DataStorage } from 'babylonjs/Misc/dataStorage'; import { GUINode } from '../../diagram/guiNode'; import { SliderLineComponent } from '../../sharedComponents/sliderLineComponent'; import { Engine } from 'babylonjs/Engines/engine'; import { InputBlock } from 'babylonjs/Materials/Node/Blocks/Input/inputBlock'; import { Observer } from 'babylonjs/Misc/observable'; import { TextLineComponent } from "../../sharedUiComponents/lines/textLineComponent"; import { StringTools } from "../../stringTools"; import { AdvancedDynamicTexture } from "babylonjs-gui/2D/index"; //import { SceneExplorerComponent } from "../sceneExplorer/sceneExplorerComponent"; require("./propertyTab.scss"); interface IPropertyTabComponentProps { globalState: GlobalState; } interface IPropertyTabComponentState { currentNode: Nullable; } export class PropertyTabComponent extends React.Component { private _onBuiltObserver: Nullable>; constructor(props: IPropertyTabComponentProps) { super(props); this.state = { currentNode: null}; } componentDidMount() { this.props.globalState.onSelectionChangedObservable.add((selection) => { if (selection instanceof GUINode) { this.setState({ currentNode: selection}); } else { this.setState({ currentNode: null }); } }); this._onBuiltObserver = this.props.globalState.onBuiltObservable.add(() => { this.forceUpdate(); }); } componentWillUnmount() { this.props.globalState.onBuiltObservable.remove(this._onBuiltObserver); } processInputBlockUpdate(ib: InputBlock) { this.props.globalState.onUpdateRequiredObservable.notifyObservers(); if (ib.isConstant) { this.props.globalState.onRebuildRequiredObservable.notifyObservers(); } } load(file: File) { Tools.ReadFile(file, (data) => { let decoder = new TextDecoder("utf-8"); SerializationTools.Deserialize(JSON.parse(decoder.decode(data)), this.props.globalState); this.props.globalState.onSelectionChangedObservable.notifyObservers(null); }, undefined, true); } save() { let json = JSON.stringify(this.props.globalState.guiTexture.serializeContent()); StringTools.DownloadAsFile(this.props.globalState.hostDocument, json, "guiTexture.json"); } customSave() { /*this.props.globalState.onLogRequiredObservable.notifyObservers({message: "Saving your material to Babylon.js snippet server...", isError: false}); this.props.globalState.customSave!.action(SerializationTools.Serialize(this.props.globalState.nodeMaterial, this.props.globalState)).then(() => { this.props.globalState.onLogRequiredObservable.notifyObservers({message: "Material saved successfully", isError: false}); }).catch((err) => { this.props.globalState.onLogRequiredObservable.notifyObservers({message: err, isError: true}); });*/ } saveToSnippetServer() { var adt = this.props.globalState.guiTexture; let content = JSON.stringify(adt.serializeContent()); var xmlHttp = new XMLHttpRequest(); xmlHttp.onreadystatechange = () => { if (xmlHttp.readyState == 4) { if (xmlHttp.status == 200) { var snippet = JSON.parse(xmlHttp.responseText); const oldId = adt.snippetId || "_BLANK"; adt.snippetId = snippet.id; if (snippet.version && snippet.version != "0") { adt.snippetId += "#" + snippet.version; } this.forceUpdate(); if (navigator.clipboard) { navigator.clipboard.writeText(adt.snippetId); } let windowAsAny = window as any; if (windowAsAny.Playground && oldId) { windowAsAny.Playground.onRequestCodeChangeObservable.notifyObservers({ regex: new RegExp(`parseFromSnippetAsync\\("${oldId}`, "g"), replace: `parseFromSnippetAsync("${adt.snippetId}` }); } alert("GUI saved with ID: " + adt.snippetId + " (please note that the id was also saved to your clipboard)"); } else { alert("Unable to save your GUI"); } } } xmlHttp.open("POST", AdvancedDynamicTexture.SnippetUrl + (adt.snippetId ? "/" + adt.snippetId : ""), true); xmlHttp.setRequestHeader("Content-Type", "application/json"); var dataToSend = { payload : JSON.stringify({ gui: content }), name: "", description: "", tags: "" }; xmlHttp.send(JSON.stringify(dataToSend)); } loadFromSnippet() { let snippedID = window.prompt("Please enter the snippet ID to use"); if (!snippedID) { return; } this.props.globalState.onSelectionChangedObservable.notifyObservers(null); this.props.globalState.guiTexture.parseFromSnippetAsync(snippedID); } render() { //var myScene=this.props.globalState.guiTexture.getScene(); if (this.state.currentNode) { return (
{//myScene && } {this.state.currentNode?.renderContainer()} {this.state.currentNode?.renderProperties()}
); } let gridSize = DataStorage.ReadNumber("GridSize", 20); return (
window.open('https://doc.babylonjs.com/how_to/node_material', '_blank')}/> { this.props.globalState.onResetRequiredObservable.notifyObservers(); }} /> { this.props.globalState.onZoomToFitRequiredObservable.notifyObservers(); }} /> { this.props.globalState.onReOrganizedRequiredObservable.notifyObservers(); }} /> DataStorage.ReadBoolean("EmbedTextures", true)} onSelect={(value: boolean) => { DataStorage.WriteBoolean("EmbedTextures", value); }} /> { DataStorage.WriteNumber("GridSize", value); this.props.globalState.onGridSizeChanged.notifyObservers(); this.forceUpdate(); }} /> DataStorage.ReadBoolean("ShowGrid", true)} onSelect={(value: boolean) => { DataStorage.WriteBoolean("ShowGrid", value); this.props.globalState.onGridSizeChanged.notifyObservers(); }} /> this.load(file)} accept=".json" /> { this.save(); }} /> { this.props.globalState.customSave && { this.customSave(); }} /> } { this.loadFromSnippet()} /> { this.saveToSnippetServer(); }} /> }
); } }